我有一个包含41个特征[从0到40列]的数据集,其中7个是分类的。此分类集分为两个子集:
此外,列特征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类型的子集,我猜最好的选择是保持列特征不变(不要将它们传递给任何编码器) 对于具有高基数的字符串类型的子集,问题仍然存在。
答案 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()