一种热编码分类特征 - 仅稀疏形式
Posted
技术标签:
【中文标题】一种热编码分类特征 - 仅稀疏形式【英文标题】:One hot encoding categorical features - Sparse form only 【发布时间】:2017-08-21 19:56:59 【问题描述】:我有一个具有 int 和分类特征的数据框。分类特征有 2 种类型:数字和字符串。
我能够对整数列和分类列进行热编码。当我尝试对作为字符串的分类列进行一个热编码时出现错误。
ValueError: 无法将字符串转换为浮点数:'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_id
和 animal_name
在 pandas 中存储为 category 和 number 作为 int64 dtype。
【问题讨论】:
能否提供一个小样本可重现的数据集? 添加了一个例子。如果您需要任何其他详细信息,请告诉我。 【参考方案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)
【讨论】:
如何选择需要转换为分类(节省内存)数字列的多个列。我在数据框中有 100 列将执行此操作。 我可以考虑使用 for 循环。但是有没有其他办法? @Aman,很高兴我能帮上忙 :) 那 100 个专栏中的dtypes
是什么?
Initiall 它们要么是 int64 要么是对象,但它们应该是分类的,所以在你的建议之后我写了一个 for 循环:for cols in columns: train[col] = train[col].astype('category' ).cat.codes.astype('category') 上述代码中的列表示需要转换为分类的所需列。
感谢所有帮助。我使用的“for”循环不是很慢。我可以使代码更好,但我想我现在很好,因为我在截止日期前运行。【参考方案2】:
仅供参考,还有其他强大的编码方案没有添加大量列作为 onehot 编码(实际上他们根本没有添加任何列)。其中一些是计数编码,目标编码。更多详情请看我的回答here和我的ipynbhere。
【讨论】:
以上是关于一种热编码分类特征 - 仅稀疏形式的主要内容,如果未能解决你的问题,请参考以下文章
机器学习:如何在具有分类和数字特征的 pandas 数据帧上应用一种热编码?
一种热编码及其与 DecisionTreeClassifier 的组合