【发布时间】:2017-05-23 15:56:56
【问题描述】:
我一直在尝试通过 pandas 将 CSV 文件加载到 scikit 中,并将目标列设置为 20 个分类变量的列表。我试过使用 label_binarize 但这似乎没有任何好处,所以在阅读了一些内容后,我切换到了 LabelEncoder 但它似乎没有太大变化。
from io import StringIO
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc, confusion_matrix
from sklearn.model_selection import train_test_split, ShuffleSplit
from sklearn.preprocessing import label_binarize, MultiLabelBinarizer, LabelEncoder
from sklearn.multiclass import OneVsRestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.naive_bayes import GaussianNB
#loading the data
data=pd.read_csv("data.csv")
y = data.iloc[:,19]
X = data.iloc[:,1:18+20:22]
#Binarize the output
le = LabelEncoder()
le.fit(["0-1","1-1.5","1.5-2","2-2.5","2.5-3","3-3.5","3.5-4","4-4.5","4.5-5","5-5.5","5.5-6","6-6.5","6.5-7","7-7.5","7.5-8","8-8.5","8.5-9","9-9.5","9.5-10","10+"
])
LabelEncoder()
le.transform(y)
y = label_binarize(y, le)
n_classes = y.shape[1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,
random_state=0)
model3 = KNeighborsClassifier(n_neighbors=7)
但当我运行它时,我得到:
Traceback (most recent call last):
File "file, line 30, in <module>
le.transform(y)
File "C:\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 149, in transform
classes = np.unique(y)
File "\Anaconda3\lib\site-packages\numpy\lib\arraysetops.py", line 198, in unique
ar.sort()
TypeError: '>' not supported between instances of 'str' and 'float'
scikit 甚至可以使用这种目标数据吗?
【问题讨论】:
-
能否贴出完整的代码。您发布的代码与错误的堆栈跟踪不匹配。
-
@VivekKumar 我已经添加了一些额外的东西,添加其余的没有任何意义,因为它在运行模型之前就失败了。
-
您使用的是哪个版本的 scikit?也展示一些 y 的样本。您确定这些来自您在 le.fit() 中使用的值吗?如果我从中获取 y 值,那么它按预期对我有用。
-
另外,LabelEncoder 只会将字符串转换为整数到数字。不会对它们进行二值化。对于二值化,您必须使用 label_binarize 或 LabelBinarizer。顺便说一句,大多数 scikit 估计器(包括 KNeighborsClassifier)将毫无问题地处理目标 (y) 中的字符串。那么为什么需要在您的场景中对它们进行编码呢?
-
@VivekKumar 找出了问题所在,必须将实际数据用引号括起来才能将它们识别为字符串。
标签: python scikit-learn categorical-data