一种热门编码分类功能 - 仅限稀疏形式

时间:2017-03-28 16:13:52

标签: pandas scikit-learn categorical-data one-hot-encoding

我有一个具有int和分类功能的数据框。分类特征有两种类型:数字和字符串。

我能够使用一个热门编码列,这些列是int和分类的数字。当我尝试一个热串编码分类列时,我收到一个错误。

  

ValueError:无法将字符串转换为float:'13367cc6'

由于数据帧很大且基数高,所以我只想将其转换为稀疏形式。我更喜欢使用from sklearn.preprocessing import OneHotEncoder的解决方案,因为我熟悉它。

我也检查了其他问题,但没有一个能解决我的问题。

data = [[623, 'dog', 4], [123, 'cat', 2],[623, 'cat', 1], [111, 'lion', 6]]

以上数据框包含4行3列

列名 - ['animal_id', 'animal_name', 'number']

假设animal_idanimal_name存储在pandas中作为类别和编号存储为int64 dtype。

2 个答案:

答案 0 :(得分:1)

假设你有以下DF:

In [124]: df
Out[124]:
   animal_id animal_name  number
0        623         dog       4
1        123         cat       2
2        623         cat       1
3        111        lion       6

In [125]: df.dtypes
Out[125]:
animal_id         int64
animal_name    category
number            int64
dtype: object

首先保存animal_name列(如果将来需要):

In [126]: animal_name = df['animal_name']

animal_name列转换为分类(内存保存)数字列:

In [127]: df['animal_name'] = df['animal_name'].cat.codes.astype('category')

In [128]: df
Out[128]:
   animal_id animal_name  number
0        623           1       4
1        123           0       2
2        623           0       1
3        111           2       6

In [129]: df.dtypes
Out[129]:
animal_id         int64
animal_name    category
number            int64
dtype: object

现在OneHotEncoder应该可以工作:

In [130]: enc = OneHotEncoder()

In [131]: enc.fit(df)
Out[131]:
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)

In [132]: X = enc.fit(df)

In [134]: X.n_values_
Out[134]: array([624,   3,   7])

In [135]: enc.feature_indices_
Out[135]: array([  0, 624, 627, 634], dtype=int32)

答案 1 :(得分:1)

仅供参考,还有其他功能强大的编码方案,它们没有将大量列作为onehot编码添加(实际上,它们根本没有添加任何列)。其中一些是计数编码,目标编码。有关更多详细信息,请参见我的答案here和我的ipynb here