文章内容如有错误或排版问题,请提交反馈,非常感谢!
ColumnTransformer 是 scikit-learn 中用于对数据的不同列应用不同预处理步骤的工具,特别适用于处理包含混合类型特征(如数值型、分类型、文本型)的数据集。

ColumnTransformer核心功能与使用场景
核心功能
- 分列处理:对数据集的特定列应用不同的转换器(如标准化、独热编码等)。
- 灵活组合:将多个转换步骤合并为一个对象,便于在Pipeline中使用。
- 自动拼接结果:按顺序拼接各转换器的输出,形成最终特征矩阵。
适用场景
- 数据集包含数值型、分类型、文本型等混合特征。
- 需对不同类型特征分别预处理(如数值列标准化、分类型列独热编码)。
ColumnTransformer 的使用
基本语法与参数
构造函数
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(
transformers=[
('name1', transformer1, columns1),
('name2', transformer2, columns2),
...
],
remainder='drop', # 处理未指定的列:'drop'(默认)或 'passthrough'
sparse_threshold=0.3, # 稀疏矩阵合并阈值(稀疏输出比例 > 该值时返回稀疏矩阵)
n_jobs=None, # 并行任务数
verbose=False # 是否显示处理日志
)
主要参数
- transformers:定义转换器的列表,每个元素为元组(name, transformer, columns)。
- name:转换器名称(字符串)。
- transformer:转换器对象(如StandardScaler())。
- columns:指定应用的列(通过列名或索引)。
- remainder:处理未指定的列。
- ‘drop’(默认):丢弃未提及的列。
- ‘passthrough’:保留未提及的列,不做处理。
- sparse_threshold:控制是否输出稀疏矩阵(默认为3,若结果稀疏性高于该值则返回稀疏矩阵)。
基础使用示例
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# 示例数据
data = pd.DataFrame({
'age': [30, 40, 50],
'salary': [70000, 80000, 90000],
'city': ['NY', 'SF', 'SF'],
'gender': ['M', 'F', 'M']
})
# 定义列转换器
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), ['age', 'salary']),
('cat', OneHotEncoder(), ['city', 'gender'])
],
remainder='passthrough'
)
# 应用转换
X_processed = preprocessor.fit_transform(data)
print(X_processed)
进阶用法
结合 Pipeline 处理缺失值
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
# 数值列处理:填充缺失值 → 标准化
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
# 分类型列处理:填充缺失值 → 独热编码
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# 定义 ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, ['age', 'income']),
('cat', categorical_transformer, ['gender'])
]
)
处理文本特征
from sklearn.feature_extraction.text import TfidfVectorizer
# 假设数据包含文本列 'text'
text_transformer = TfidfVectorizer(max_features=100)
preprocessor = ColumnTransformer(
transformers=[
('text', text_transformer, 'text'),
('num', numeric_transformer, ['age', 'income'])
]
)
获取转换后的特征名称
# 获取转换后的特征名称
feature_names = preprocessor.get_feature_names_out()
print("特征名称:", feature_names)
# 输出:
# ['num__age', 'num__income', 'cat__gender_F', 'cat__gender_M']
注意事项与最佳实践
- 缺失值处理:在ColumnTransformer 前或内部使用 SimpleImputer 填充缺失值,避免转换器报错。
- 类别型变量处理:使用OneHotEncoder 时设置 handle_unknown=’ignore’,防止测试集出现新类别。
- 特征名称保留:使用get_feature_names_out() 获取转换后特征名,方便调试和解释模型。
- 稀疏矩阵优化:若转换器生成稀疏矩阵(如OneHotEncoder),设置 sparse_threshold=0.3 平衡内存与效率。
- 列选择方式:优先使用列名(pandas数据)而非索引,避免列顺序变化导致错误。
实战案例:泰坦尼克数据集预处理
import pandas as pd
from sklearn.datasets import fetch_openml
# 加载数据
titanic = fetch_openml('titanic', version=1)
X = titanic.data[['pclass', 'sex', 'age', 'fare']]
y = titanic.target
# 定义预处理流程
numeric_features = ['age', 'fare']
categorical_features = ['pclass', 'sex']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder())
])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
]
)
# 构建模型
model = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', RandomForestClassifier())
])
# 训练与评估
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model.fit(X_train, y_train)
print("准确率:", model.score(X_test, y_test))



