ColumnTransformersklearn.compose 模块中的一个类,用于对不同的特征列应用不同的数据转换操作。这在数据预处理阶段特别有用,因为不同的特征通常需要不同的处理方式。

官方文档

主要功能

ColumnTransformer 允许你:

  1. 对数据集中的不同列应用不同的转换器。
  2. 组合多个转换器一起使用。
  3. 保持数据的结构,输出的结果可以作为机器学习模型的输入。

主要参数

该类的主要参数:

  1. transformers:一个包含 (name, transformer, columns) 元组的列表,定义每个子变换器和应用的列。
  2. remainder:指定未被显式转换的列的处理方式。可以是 'drop'(默认)或 'passthrough',也可以是一个变换器。
  3. sparse_threshold:控制稀疏矩阵输出的阈值。默认是 0.3
  4. n_jobs:并行执行的作业数量,默认是 None
  5. transformer_weights:可选,用于指定变换器的权重。
  6. verbose:是否打印转换器的日志信息,默认是 False

示例代码

以下是一个简单的示例,演示如何使用 ColumnTransformer 对数值和类别特征进行不同的预处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

# 创建一个示例数据集
data = {
'age': [25, 30, 35, None, 40],
'salary': [50000, 60000, None, 80000, 90000],
'city': ['New York', 'San Francisco', 'Los Angeles', 'New York', None]
}
df = pd.DataFrame(data)

# 定义数值特征和类别特征
numeric_features = ['age', 'salary']
categorical_features = ['city']

# 数值特征的转换器:缺失值填充 -> 标准化
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])

# 类别特征的转换器:缺失值填充 -> OneHot编码
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# 创建 ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])

# 对数据进行拟合和转换
df_preprocessed = preprocessor.fit_transform(df)

# 输出转换后的数据
print(df_preprocessed)

详细解释

  1. 导入必要的模块

    1
    2
    3
    4
    5
    import pandas as pd
    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import StandardScaler, OneHotEncoder
    from sklearn.pipeline import Pipeline
    from sklearn.impute import SimpleImputer

  2. 创建数据集

    1
    2
    3
    4
    5
    6
    data = {
    'age': [25, 30, 35, None, 40],
    'salary': [50000, 60000, None, 80000, 90000],
    'city': ['New York', 'San Francisco', 'Los Angeles', 'New York', None]
    }
    df = pd.DataFrame(data)

  3. 定义数值和类别特征

    1
    2
    numeric_features = ['age', 'salary']
    categorical_features = ['city']

  4. 数值特征的转换器

    1
    2
    3
    4
    numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())
    ])

  5. 类别特征的转换器

    1
    2
    3
    4
    categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
    ])

  6. 创建 ColumnTransformer

    1
    2
    3
    4
    5
    preprocessor = ColumnTransformer(
    transformers=[
    ('num', numeric_transformer, numeric_features),
    ('cat', categorical_transformer, categorical_features)
    ])

  7. 拟合和转换数据

    1
    df_preprocessed = preprocessor.fit_transform(df)

总结

ColumnTransformer 是一个强大的工具,可以灵活地对不同特征列进行不同的数据预处理操作。通过结合 Pipeline 和其他预处理模块,可以创建复杂的预处理流水线,以便为机器学习模型准备数据。