我正在使用来自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列中的值转换为浮点数,无论如何,这样做应该是什么问题!!
提前感谢您的建议!
答案 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的文档在这方面非常误导。