我试图使用列转换器和独热编码器来转换我的分类数据:
快速查看我的数据:
我想对3个特征进行独热编码:’sex’,’smoker’,’region’,所以我使用了scikit-learn的列转换器。(我不希望将数值型和分类型数据分开,然后分别转换它们,我只想在一个数据集上进行转换)
我的代码如下:
cat_feature = X.select_dtypes(include = 'object') #只选择分类列
enc = ColumnTransformer([ ('one_hot_encoder' , OneHotEncoder() , cat_feature ) ] ,
remainder = 'passthrough')
X_transformed = enc.fit_transform(X) # 原始数据的转换版本
我的问题是,X_transformed
转换后所有特征名称都被移除了,这让我在调试时有点困惑:
那么,有没有办法在转换后保留我的列名?我想将这个转换器整合到一个管道中,所以我不能使用 pd.get_dummies
。谢谢!!
回答:
用户需要编写自定义的 Transformer
,它可以传递数据并支持 get_feature_names
步骤如下:
- 自定义
Transformer
,通过get_feature_names
返回传递的列名 - 不要使用
remainder = 'passthrough'
,而是使用我们的自定义Transformer
使用 enc.get_feature_names()
来获取特征列表。
示例:
from sklearn.base import BaseEstimator
df = pd.DataFrame({
'age': [1,2,3,4],
'sex': ['male', 'female']*2,
'bmi': [1.1,2.2,3.3,4.4],
'children': [1]*4,
'smoker': ['yes', 'no']*2})
cat_features = df.select_dtypes(include = 'object').columns
passthrough_features = [c for c in df.columns if c not in cat_features]
class PassthroughTransformer(BaseEstimator):
def fit(self, X, y = None):
self.cols = X.columns
return self
def transform(self, X, y = None):
self.cols = X.columns
return X.values
def get_feature_names(self):
return self.cols
enc = ColumnTransformer([ ('1hot' , OneHotEncoder() , cat_features ),
('pass' , PassthroughTransformer(), passthrough_features)])
X_transformed = enc.fit_transform(df)
pd.DataFrame(X_transformed, columns=enc.get_feature_names())
输出结果:
1hot__x0_female 1hot__x0_male 1hot__x1_no 1hot__x1_yes pass__age pass__bmi pass__children
0 0.0 1.0 0.0 1.0 1.0 1.1 1.0
1 1.0 0.0 1.0 0.0 2.0 2.2 1.0
2 0.0 1.0 0.0 1.0 3.0 3.3 1.0
3 1.0 0.0 1.0 0.0 4.0 4.4 1.0