sklearn.compose.make_column_transformer():在一个数据框列上一步使用 SimpleImputer() 和 OneHotEncoder()
sklearn.compose.make_column_transformer(): using SimpleImputer() and OneHotEncoder() in one step on one dataframe column
我有一个包含分类变量列的数据框,其中还包括 NaN。
Category
1 A
2 A
3 Na
4 B
我想使用 sklearn.compose.make_column_transformer()
以干净的方式准备 df。我尝试使用以下代码估算 nan 值和 OneHotEncode 列:
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_transformer
transformer= make_column_transformer(
(SimpleImputer(missing_values=np.nan, strategy='most_frequent'), ['Category']),
(OneHotEncoder(sparse=False), ['Category'])
)
运行我训练数据上的transformer raises
ValueError: Input contains NaN
transformer.fit(X_train)
X_train_trans = transformer.transform(X_train)
期望的输出应该是这样的:
A B
1 1 0
2 1 0
3 1 0
4 0 1
这提出了两个问题:
transformer 是在原始数据上并行计算 SimpleImputer
和 OneHotEncoder
还是按照我在 transformer 中引入它们的顺序?
如何更改我的代码,以便 OneHotEncoder
获取估算值作为输入?我知道我可以通过 pandas 在转换器之外通过两个不同的步骤解决它,但我希望代码采用干净的管道格式
您应该使用 sklearn Pipeline 来 顺序应用转换列表:
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
s = pd.DataFrame(data={'Category': ['A', 'A', np.nan, 'B']})
category_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(missing_values=np.nan, strategy='most_frequent')),
('ohe', OneHotEncoder(sparse=False))
]
)
transformer = ColumnTransformer(transformers=[
('category', category_pipeline , ['Category'])
],
)
transformer.fit_transform(s)
array([[1., 0.],
[1., 0.],
[1., 0.],
[0., 1.]])
我有一个包含分类变量列的数据框,其中还包括 NaN。
Category
1 A
2 A
3 Na
4 B
我想使用 sklearn.compose.make_column_transformer()
以干净的方式准备 df。我尝试使用以下代码估算 nan 值和 OneHotEncode 列:
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_transformer
transformer= make_column_transformer(
(SimpleImputer(missing_values=np.nan, strategy='most_frequent'), ['Category']),
(OneHotEncoder(sparse=False), ['Category'])
)
运行我训练数据上的transformer raises
ValueError: Input contains NaN
transformer.fit(X_train)
X_train_trans = transformer.transform(X_train)
期望的输出应该是这样的:
A B
1 1 0
2 1 0
3 1 0
4 0 1
这提出了两个问题:
transformer 是在原始数据上并行计算
SimpleImputer
和OneHotEncoder
还是按照我在 transformer 中引入它们的顺序?如何更改我的代码,以便
OneHotEncoder
获取估算值作为输入?我知道我可以通过 pandas 在转换器之外通过两个不同的步骤解决它,但我希望代码采用干净的管道格式
您应该使用 sklearn Pipeline 来 顺序应用转换列表:
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
s = pd.DataFrame(data={'Category': ['A', 'A', np.nan, 'B']})
category_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(missing_values=np.nan, strategy='most_frequent')),
('ohe', OneHotEncoder(sparse=False))
]
)
transformer = ColumnTransformer(transformers=[
('category', category_pipeline , ['Category'])
],
)
transformer.fit_transform(s)
array([[1., 0.],
[1., 0.],
[1., 0.],
[0., 1.]])