如何在scikit中对分类数据使用一个热编码器?

时间:2016-01-31 00:24:51

标签: python machine-learning scikit-learn

我有以下数组(实际上是一个具有类似数组结构的Panda数据框),类似于以下内容:

[
   ['M', 4, 15]
   ['M', 3, 7]
   ['F', 5, 9]
   ['I', 4, 15]
]

我希望预处理这些数据,以便在线性回归中使用它。 我相信这样做的方法是使用一个热编码器:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder

但是,只有在类别为整数时才有效。

我相信您可以使用DictVectorizerhttp://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.DictVectorizer.html#sklearn.feature_extraction.DictVectorizer

执行此操作

但是,这似乎只适用于字典,而不适用于数组。

2 个答案:

答案 0 :(得分:1)

假设您的数据框df是这样的:

>>> df
  col1  col2  col3
0    M     4    15
1    M     3     7
2    F     5     9
3    I     4    15

要将col1转换为单热编码向量,您可以使用pandas get_dummies方法。

>>> df = pd.get_dummies(df, columns=['col1'])
>>> df
   col2  col3  col1_F  col1_I  col1_M
0     4    15       0       0       1
1     3     7       0       0       1
2     5     9       1       0       0
3     4    15       0       1       0

答案 1 :(得分:0)

将您的类别映射到整数,代码类似于以下代码:

def tokenize(data, col_of_category):
    str_to_int, int_to_str = {}, {}
    for row in data:
        cat = row[col_of_category]
        if cat in str_to_int.keys(): token = str_to_int[cat]
        else:
            token = len(str_to_int.keys())
            str_to_int[cat] = token
            int_to_str[token] = cat
        row[col_of_category] = token # assuming your rows are mutable
    return str_to_int, int_to_str

然后,您可以使用返回的词典来管理将来的映射和取消映射。然后,您可以使用OneHotEncoder。您的算法并不关心是否涉及到字符串。