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

时间:2016-11-15 19:11:05

标签: 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
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()OneHotEncoder() [由于我在上面暴露的原因],并且主要以哪种方式使用它们[在代码方面]与{我拥有的{1}}矩阵。 或者我应该简单地为字符串类型的子集中的每个基数分配一个数字(因为它们具有高基数,因此我的特征空间将呈指数级增长)?

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

4 个答案:

答案 0 :(得分:3)

这是迄今为止最简单的方法:

 df = pd.get_dummies(df, drop_first=True)

如果内存溢出或速度过慢,请减少基数:

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

答案 1 :(得分:1)

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

在性能方面,我认为One Hot Encoder比DictVectorizer好得多。

答案 2 :(得分:0)

您可以按照上面@simon的建议使用pandas方法.get_dummies(),也可以使用sklearn给出的OneHotEncoder等效值。

更喜欢 OneHotEncoder因为您可以传递参数,例如您要编码的分类功能以及每个功能要保留的值(如果没有标明,它将自动选择最佳数字。)

如果对于某些功能,基数太大,则强加低n_values。 如果您有足够的内存,请不要担心,请编码功能的所有值。

我认为基数为66,如果你有一台基本的计算机,编码所有66个功能都不会导致内存问题。例如,当您具有与数据集中的样本数量一样多的特征值时,通常会发生内存溢出(每个样本的ID唯一的情况)。数据集越大,您就越有可能遇到内存问题。

答案 3 :(得分:-1)

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()