一个热门编码分类功能,用作sklearn中具有数字特征的训练数据

时间:2017-07-07 02:41:53

标签: python csv machine-learning scikit-learn one-hot-encoding

我正在尝试训练一个从csv读取数据作为训练数据的模型。为此,我尝试对分类特征进行一次热编码,然后将得到的1和0数组作为特征传递,同时只传递香草数字特征。

我有以下代码:

X = pd.read_csv('Data2Cut.csv')

Y = X.select_dtypes(include=[object])

le = preprocessing.LabelEncoder()

Y_2 = Y.apply(le.fit_transform)


enc = preprocessing.OneHotEncoder()

enc.fit(Y_2)

onehotlabels = enc.transform(Y_2).toarray()
onehotlabels.shape

features = []
labels = []
mycsv = csv.reader(open('Data2Cut.csv'))
indexCount = 0
for row in mycsv:
  if indexCount < 8426:
    features.append([onehotlabels[indexCount], row[1], row[2], row[3], row[6], row[8], row[9], row[10], row[11]])
    labels.append(row[12])
    indexCount = indexCount + 1

training_data = np.array(features, dtype = 'float_')
training_labels = np.array(labels, dtype = 'float_')

log = linear_model.LogisticRegression()
log = log.fit(training_data, training_labels)
joblib.dump(log, "modelLogisticRegression.pkl")

似乎正在走上界限:

training_data = np.array(features, dtype = 'float_')

在崩溃之前发出以下错误:

ValueError: setting an array element with a sequence.

我认为这是一个热编码值是数组而不是浮点数的结果。如何更改/调整此代码以处理分类和数字功能作为训练数据?

编辑:我正在进行的一行示例,其中每列是一个功能:

mobile, 1498885897, 17491407,   23911,  west coast, 2,  seagull, 18,    41.0666666667,  [0.325, 0.35],  [u'text', u'font', u'writing', u'line'],    102, 5  
#...

2 个答案:

答案 0 :(得分:1)

您必须已经找到答案,但是我在这里为有相同问题的人张贴我的发现(我一直在努力)。实现此目的的方法是将生成的编码后的稀疏矩阵的列附加到训练数据帧中。例如。 (忽略第一行中的价格错误):

Source: https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f

如果您的类别中没有太多唯一值,这当然是一个实用的解决方案。对于分类特征可以采用许多不同值的情况,您可以研究更高级的编码方法,例如Backward Difference CodingPolynomial Coding

答案 1 :(得分:0)

您使用的是哪个版本的sklearn?

我在sklearn版本0.18.1中看到,不推荐使用1d数组作为数据,并给出如下警告,并且没有给出所需的结果。

DeprecationWarning:传递1d数组作为数据在0.17中弃用,并将在0.19中引发ValueError。如果数据具有单个要素,则使用X.reshape(-1,1)重新整形数据;如果包含单个样本,则使用X.reshape(1,-1)重新整形数据。   DeprecationWarning)

尝试替换以下代码行

onehotlabels = enc.transform(Y_2).toarray()

到下面的一个

onehotlabels = enc.transform(Y_2.reshape((-1,1)).toarray()

或者您可以使用pd.get_dummies来获取一个热编码特征矩阵。