【问题标题】:Feature names from OneHotEncoder来自 OneHotEncoder 的功能名称
【发布时间】:2019-07-01 10:17:18
【问题描述】:

我正在使用 OneHotEncoder 编码几个分类变量(例如 - 性别和年龄组)。编码器生成的特征名称类似于 - 'x0_female'、'x0_male'、'x1_0.0'、'x1_15.0' 等。

>>> train_X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})

>>> from sklearn.preprocessing import OneHotEncoder
>>> encoder = OneHotEncoder()
>>> train_X_encoded = encoder.fit_transform(train_X[['Sex', 'AgeGroup']])
>>> encoder.get_feature_names()
>>> array(['x0_female', 'x0_male', 'x1_0.0', 'x1_15.0', 'x1_30.0', 'x1_45.0',
       'x1_60.0', 'x1_75.0'], dtype=object)

有没有办法告诉OneHotEncoder 以在开头添加列名的方式创建特征名称,例如 - Sex_female、AgeGroup_15.0 等,类似于 Pandas get_dummies() 所做的。

【问题讨论】:

  • 谢谢。 Scikit-learn 处理数组而不是 dfs,所以我认为它不存储列名。 This question 和你的几乎一模一样。
  • 感谢@JoshFriedlander 分享另一个问题。我知道 Pandas get_dummies 做了我正在寻找的东西(我在问题中提到过)。我很想知道是否有办法使用 Scikit-learn OneHotEncoder 来实现这一点。所以另一个问题的答案对我没有帮助。但是,您的评论 Scikit-learn 处理的是数组而不是 dfs,所以我认为它不存储列名。 表明在 Sklearn 中无法实现相同的目标。
  • 是的,我认为那个问题中的 OP 想要和你一样,并被告知 get_dummies 是实现它的唯一方法
  • 根据最近的提交和讨论,他们似乎在 2019 年初积极开展这项工作。例如,“使用 ColumnTransformer 的一个缺点是,在 0.20 版中,在所有情况下,尚无法轻松找到哪些输入列对应于列转换器的哪些输出列。” oreilly.com/library/view/introduction-to-machine/9781449369880/…另见github.com/scikit-learn/scikit-learn/commit/…

标签: python-3.x scikit-learn one-hot-encoding


【解决方案1】:

您可以将带有原始列名的列表传递给get_feature_names

encoder.get_feature_names(['Sex', 'AgeGroup'])

将返回:

['Sex_female', 'Sex_male', 'AgeGroup_0', 'AgeGroup_15',
 'AgeGroup_30', 'AgeGroup_45', 'AgeGroup_60', 'AgeGroup_75']

【讨论】:

    【解决方案2】:
    column_name = encoder.get_feature_names(['Sex', 'AgeGroup'])
    one_hot_encoded_frame =  pd.DataFrame(train_X_encoded, columns= column_name)
    

    【讨论】:

    • 这很聪明!有没有办法将其合并到 sklearn 管道中?
    【解决方案3】:

    感谢您提供一个不错的解决方案。 @Nursnaaz 稀疏矩阵需要转换成密集矩阵。

    column_name = encoder.get_feature_names(['Sex', 'AgeGroup'])
    one_hot_encoded_frame =  pd.DataFrame(train_X_encoded.todense(), columns= column_name)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2014-11-13
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多