使用来自sklearn的LabelEncoder和OneHotEncoder对数据进行编码时出现意外问题

时间:2017-03-11 14:13:03

标签: python encoding machine-learning scikit-learn

我正在使用来自sklearn的LabelEncoder和OneHotEncoder对一些数据进行编码以传递到ML模型中,但是我收到的错误与我不认为应编码的列I有关。

这是我的代码;

import numpy as np
import pandas as pd
import matplotlib.pyplot as py

Dataset = pd.read_csv('C:\\Users\\taylorr2\\Desktop\\SID Alerts.csv', sep = ',')
X = Dataset.iloc[:,:-1].values
Y = Dataset.iloc[:,18].values

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()

我只能看到我是如何编写第一列数据的,但是我得到的错误如下:

onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
Traceback (most recent call last):

  File "<ipython-input-132-360fc0133165>", line 2, in <module>
    X = onehotencoder.fit_transform(X).toarray()

  File "C:\Users\taylorr2\AppData\Local\Continuum\Anaconda2\lib\site-    packages\sklearn\preprocessing\data.py", line 1902, in fit_transform
    self.categorical_features, copy=True)

  File "C:\Users\taylorr2\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\preprocessing\data.py", line 1697, in _transform_selected
    X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)

  File "C:\Users\taylorr2\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\utils\validation.py", line 382, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)

ValueError: could not convert string to float: 'A string that only appears in column 16 or 18 of my data'

我的代码是什么让它认为需要尝试将第16列或第18列中的值转换为浮点数,无论如何,这样做应该是什么问题!!

提前感谢您的建议!

2 个答案:

答案 0 :(得分:0)

对不起,这实际上是评论,但由于我的声誉,我还不能发表评论:(

可能该字符串出现在您的数据的第17列,我认为这是因为由于某种原因,首先检查数据的最后一列(您可以尝试传递较少的列(例如通过X传递17 [:,0:17] ])看看会发生什么。它会再次抱怨最后一栏。)

无论如何,OneHotEncoder的输入应该是整数矩阵,如下所述:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html。 但是我认为既然你已经为OneHotEncoder类指定了分类特征的索引,那么无论如何都应该无关紧要(至少我希望非分类特征被“忽略”)。

读取'sklearn / preprocessing / data.py'中的代码我看到当他们做“X = check_array(X,accept_sparse ='csc',copy = copy,dtype = FLOAT_DTYPES)”时,他们正在考虑非分类功能,即使它们的索引作为参数传递给调用check_array的函数。我不知道,也许它应该与github上的sklearn社区一起检查?

答案 1 :(得分:0)

@Taylrl,

我遇到了同样的行为并发现它令人沮丧。正如@Vivek指出的那样,Scikit-Learn要求所有数据在被考虑选择categorical_features参数中提供的列之前是数字的。

具体来说,列选择由/sklearn/preprocessing/data.py中的_transform_selected()方法处理,该方法的第一行是

X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)

如果提供的数据框X中的任何数据无法成功转换为浮点数,则此检查将失败。

我同意sklearn.preprocessing.OneHotEncoder的文档在这方面非常误导。