Scikit-learn 列转换器无法返回特征名称

我试图使用列转换器和独热编码器来转换我的分类数据:

快速查看我的数据:

enter image description here

我想对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 转换后所有特征名称都被移除了,这让我在调试时有点困惑:

enter image description here

那么,有没有办法在转换后保留我的列名?我想将这个转换器整合到一个管道中,所以我不能使用 pd.get_dummies。谢谢!!


回答:

用户需要编写自定义的 Transformer,它可以传递数据并支持 get_feature_names

步骤如下:

  1. 自定义 Transformer,通过 get_feature_names 返回传递的列名
  2. 不要使用 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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注