Python 如何在sklearn中编码分类特征?

Python 如何在sklearn中编码分类特征?,python,scikit-learn,categorical-data,one-hot-encoding,dictvectorizer,Python,Scikit Learn,Categorical Data,One Hot Encoding,Dictvectorizer,我有一个数据集,有41个特征[从0到40列],其中7个是分类的。该分类集分为两个子集: 字符串类型的子集(列的特征为1、2、3) int类型的子集,二进制形式为0或1(列的特征为6、11、20、21) 此外,列特征1、2和3(字符串类型)分别具有基数3、66和11。 在这种情况下,我必须对它们进行编码,以使用支持向量机算法。 这是我的代码: import numpy as np import pandas as pd from sklearn import preprocessing fro

我有一个数据集,有41个特征[从0到40列],其中7个是分类的。该分类集分为两个子集:

  • 字符串类型的子集(列的特征为1、2、3)
  • int类型的子集,二进制形式为0或1(列的特征为6、11、20、21)
此外,列特征1、2和3(字符串类型)分别具有基数3、66和11。 在这种情况下,我必须对它们进行编码,以使用支持向量机算法。 这是我的代码:

import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import feature_extraction

df = pd.read_csv("train.csv")
datanumpy = df.as_matrix()
X = datanumpy[:, 0:40]  # select columns 1 through 41 (the features)
y = datanumpy[:, 41]  # select column 42 (the labels)
我不知道是否最好使用
DictVectorizer()
onehotcoder()
[出于我上面提到的原因],主要是以何种方式使用它们[就代码而言]和我拥有的
X
矩阵。 或者我应该简单地为字符串类型子集中的每个基数分配一个数字(因为它们的基数很高,所以我的特征空间将以指数方式增加)

编辑 关于int类型的子集,我想最好的选择是保持列特征不变(不要将它们传递给任何编码器)
对于具有高基数的字符串类型子集,问题仍然存在。

这是迄今为止最简单的:

 df = pd.get_dummies(df, drop_first=True)
如果内存溢出或速度太慢,请减少基数:

top = df[col].isin(df[col].value_counts().index[:10])
df.loc[~top, col] = "other"

您可以使用上面@simon建议的
pandas
方法
.get_dummies()
,也可以使用
onehotcoder
提供的
sklearn
等效方法

更喜欢
OneHotEncoder
,因为您可以向它传递参数,如您要编码的分类功能和每个功能保留的值的数量(如果未指明,它将自动选择最佳数量)

如果对于某些功能,基数太大,则施加较低的
n\u值。
如果您有足够的内存,请不要担心,对您的功能的所有值进行编码


我想对于基数66,如果你有一台基本的计算机,编码所有66个特性不会导致内存问题。内存溢出通常发生在一个特性的值与数据集中的样本数相等时(对于每个样本唯一的ID的情况)。数据集越大,越有可能出现内存问题。

根据一个热编码器的官方文档,它应该应用于组合数据集(训练和测试)。否则,它可能无法形成正确的编码


就性能而言,我认为一个热编码器比DictVectorizer好得多。

我同意你的观点,但由于我的数据集非常庞大,我还担心支持向量机运行所需的时间。无论如何,您是否有使用OneHotEncoder的脚本库(我猜是以前使用的LabelEncoder)?在我的理解中,这不是一个可接受的答案,因为它不能保证不同
数据帧
对象之间的一致性(例如,训练和测试)。在训练/测试的情况下,您可以在分割之前申请,当然,您尝试预测的新数据集可能会出现相同的问题。在这种情况下,一种解决方案是使用分类数据指定类别,然后对每个数据集应用相同的规范。这样,get_假人每次都会使用相同的编码。为什么一个热编码器比DictVectorizer好得多?是否有任何数据可以支持这一点?