【问题标题】:OneHotEncoder - encoding only some of categorical variable columnsOneHotEncoder - 仅编码一些分类变量列
【发布时间】:2019-02-25 02:24:38
【问题描述】:

假设我有一个带有以下列名称的 pandas 数据框:

  • 'age'(例如 33、26、51 等)
  • 'seniority'(例如“初级”、“高级”等)
  • 'gender'(例如“男”、“女”)
  • 'salary'(例如 32000、40000、64000 等)

我想将seniority 分类变量转换为一个热编码值。出于这个原因,我正在做以下事情:

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(categorical_features=[1])
data = one_hot_encoder.fit_transform(data.values)

但是我得到了这个错误

ValueError: could not convert string to float: 'gender'

一行

data = one_hot_encoder.fit_transform(data.values)

但是,我已明确指定 categorical_features=[1],因此只有第 1 列 (seniority) 应考虑用于此热编码。

我该如何解决这个错误(例如删除“性别”列除外)?

我过去使用pandas.get_dummies,没有遇到这个问题。

【问题讨论】:

    标签: python scikit-learn one-hot-encoding


    【解决方案1】:

    我认为对于这种情况你应该坚持pd.get_dummies

    >>> data
       age seniority  gender  salary
    0    1    junior    male       5
    1    2    senior  female       6
    2    3    junior  female       7
    
    # One hot encode with get_dummies
    data = pd.concat((data,pd.get_dummies(data.seniority)),1)
    
    >>> data
       age seniority  gender  salary  junior  senior
    0    1    junior    male       5       1       0
    1    2    senior  female       6       0       1
    2    3    junior  female       7       1       0
    

    问题是sklearnOneHotEncoder 需要有一个整数数组作为输入。但是在数组data.values 中,您仍然拥有gender 的字符串表示形式。如果您愿意,您可以只对资历值进行一次热编码,但是如果您想知道这些功能的含义,这不是很好,您必须手动将列名传递给它(这在很多情况下是不可行的):

    from sklearn.preprocessing import LabelEncoder
    label_encoder = LabelEncoder()
    data['seniority'] = label_encoder.fit_transform(data['seniority'])
    
    from sklearn.preprocessing import OneHotEncoder
    one_hot_encoder = OneHotEncoder(sparse=False)
    data[['junior','senior']] = one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1))
    
    >>> data
       age  seniority  gender  salary  junior  senior
    0    1          0    male       5     1.0     0.0
    1    2          1  female       6     0.0     1.0
    2    3          0  female       7     1.0     0.0
    

    或者,如果功能名称无关紧要:

    from sklearn.preprocessing import LabelEncoder
    label_encoder = LabelEncoder()
    data['seniority'] = label_encoder.fit_transform(data['seniority'])
    
    from sklearn.preprocessing import OneHotEncoder
    one_hot_encoder = OneHotEncoder(sparse=False)
    data = pd.concat((data,pd.DataFrame(one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1)))),1)
    
       age  seniority  gender  salary    0    1
    0    1          0    male       5  1.0  0.0
    1    2          1  female       6  0.0  1.0
    2    3          0  female       7  1.0  0.0
    

    但最后,pd.get_dummies 以更好的方式完成了这项工作 (IMO)

    【讨论】:

    • 感谢您的回答(点赞)。我会稍等一下,看看是否有更好的答案,如果没有,我会勾选你的正确答案。
    • OneHotEncoder 不再要求输入为整数。见这里:scikit-learn.org/stable/modules/…
    • 为了使它工作,我不得不使用方括号而不是括号: data = pd.concat([data,pd.get_dummies(data.seniority)],1)
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多