如何在一个 ColumnTransformer 中为所有类型的特征、分类特征和数字特征组合管道?
How to combine a pipeline for all types of features, for categorical features and numerical features in one ColumnTransformerr?
我正在尝试创建一个结合以下内容的管道:
- 各种功能的管道,无论类型如何(按功能清理不正确的数据)
- 分类特征的管道(分类输入器)
- 数值特征管道(数值输入器)
在 sklearn.compose.ColumnTransformer¶。
这是我正在尝试做的一段代码
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
alltypes = Pipeline([
('column_name_normalizer',ColumnNameNormalizer()),
('column_incorrect_data_cleaner',ColumnIncorrectDataCleaner(some_parameter),
])
num_pipeline = Pipeline([
('imputer',CustomNumImputer(some_parameter)), # remplir les valeurs manquants
])
cat_pipeline = Pipeline([
("cat", CustomCatImputer(some_parameter))
])
full_pipeline = ColumnTransformer([
("alltypes",alltypes,allcolumns),
("num", num_pipeline, numfeat),
("cat",cat_pipeline,catfeat)
])
try:
X = pd.DataFrame(full_pipeline.fit_transform(X).toarray())
except AttributeError:
X = pd.DataFrame(full_pipeline.fit_transform(X))
但是最后我得到了一个比开始时具有更多特征的数据框,这是因为管道中的所有特征都被连接起来,而不是对它们执行运算符 UNION:
例如我想对所有特征做一些转换,然后对分类特征做一些转换,对数值特征做一些转换,但我希望输出数据帧的大小始终相同。
你知道我该如何解决这个问题吗?
需要合并Pipeline
的顺序幂,例如
cat_num_split = ColumnTransformer([
("num", num_pipeline, numfeat),
("cat", cat_pipeline, catfeat),
])
full_pipeline = Pipeline([
("alltypes", alltypes),
("cat_num", cat_num_split),
)]
这里有一个陷阱:alltypes
转换器将生成一个没有关于哪些列是哪些列的信息的 numpy 数组;您的 cat_num_split
功能列表 numfeat
和 catfeat
将取决于您对哪些列的了解,并且不能使用列名。
另一个不 运行 功能名称问题的替代方法是在此处切换顺序。
num_full_pipe = Pipeline([
("common", alltypes),
("num", num_pipeline),
])
cat_full_pipe = Pipeline([
("common", alltypes),
("cat", cat_pipeline),
])
full_pipeline = ColumnTransformer([
("num", num_full_pipe, numfeat),
("cat", cat_full_pipe, catfeat),
])
另见 Consistent ColumnTransformer for intersecting lists of columns。
我正在尝试创建一个结合以下内容的管道:
- 各种功能的管道,无论类型如何(按功能清理不正确的数据)
- 分类特征的管道(分类输入器)
- 数值特征管道(数值输入器)
在 sklearn.compose.ColumnTransformer¶。
这是我正在尝试做的一段代码
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
alltypes = Pipeline([
('column_name_normalizer',ColumnNameNormalizer()),
('column_incorrect_data_cleaner',ColumnIncorrectDataCleaner(some_parameter),
])
num_pipeline = Pipeline([
('imputer',CustomNumImputer(some_parameter)), # remplir les valeurs manquants
])
cat_pipeline = Pipeline([
("cat", CustomCatImputer(some_parameter))
])
full_pipeline = ColumnTransformer([
("alltypes",alltypes,allcolumns),
("num", num_pipeline, numfeat),
("cat",cat_pipeline,catfeat)
])
try:
X = pd.DataFrame(full_pipeline.fit_transform(X).toarray())
except AttributeError:
X = pd.DataFrame(full_pipeline.fit_transform(X))
但是最后我得到了一个比开始时具有更多特征的数据框,这是因为管道中的所有特征都被连接起来,而不是对它们执行运算符 UNION:
例如我想对所有特征做一些转换,然后对分类特征做一些转换,对数值特征做一些转换,但我希望输出数据帧的大小始终相同。
你知道我该如何解决这个问题吗?
需要合并Pipeline
的顺序幂,例如
cat_num_split = ColumnTransformer([
("num", num_pipeline, numfeat),
("cat", cat_pipeline, catfeat),
])
full_pipeline = Pipeline([
("alltypes", alltypes),
("cat_num", cat_num_split),
)]
这里有一个陷阱:alltypes
转换器将生成一个没有关于哪些列是哪些列的信息的 numpy 数组;您的 cat_num_split
功能列表 numfeat
和 catfeat
将取决于您对哪些列的了解,并且不能使用列名。
另一个不 运行 功能名称问题的替代方法是在此处切换顺序。
num_full_pipe = Pipeline([
("common", alltypes),
("num", num_pipeline),
])
cat_full_pipe = Pipeline([
("common", alltypes),
("cat", cat_pipeline),
])
full_pipeline = ColumnTransformer([
("num", num_full_pipe, numfeat),
("cat", cat_full_pipe, catfeat),
])
另见 Consistent ColumnTransformer for intersecting lists of columns。