4

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

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

4

3 回答 3

3

这是迄今为止最简单的:

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

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

top = df[col].isin(df[col].value_counts().index[:10])
df.loc[~top, col] = "other"
于 2016-11-15T20:32:37.830 回答
1

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

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

于 2017-11-10T12:48:09.930 回答
0

您可以使用上面@simon 建议的方法,也可以pandas使用..get_dummies()sklearnOneHotEncoder

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

如果对于某些特征,基数太大,则施加 low n_values。如果您有足够的内存,请不要担心,对特征的所有值进行编码。

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

于 2016-11-16T10:38:32.307 回答