值错误:无法将字符串转换为浮点数:med。

4

我正在编写一个非常简单的脚本,只需要使用panda读取数据,然后在数据上训练决策树。我要使用的数据是:

https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data

以下是我的脚本

import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn import tree
from sklearn import preprocessing
import pandas as pd
balance_data=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data",
                           sep= ',', header= None)
#print "Dataset:: "

#df1.head()

X = balance_data.values[:, 0:5]
Y = balance_data.values[:,6]
X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size = 0.2, random_state = 100)
clf_gini = DecisionTreeClassifier(criterion = "gini", random_state = 100,
                               max_depth=3, min_samples_leaf=5)

clf_gini.fit(X_train, y_train)

从错误信息来看,我猜测它无法将 "med" 属性值转换为浮点数。通过查看数据,我的猜测是 "low" 前面有一个空格而 "med" 没有。这就是为什么会出现混淆的原因。但我不确定。请告诉我可能出了什么问题。 PS:错误发生在最后一行,以下是回溯信息

ValueError                                Traceback (most recent call last)
<ipython-input-26-b495e5f26174> in <module>()
     18                                max_depth=3, min_samples_leaf=5)
     19 X_train[X_train != '']
---> 20 clf_gini.fit(X_train, y_train)

/home/fatima/anaconda2/lib/python2.7/site-packages/sklearn/tree/tree.pyc in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    788             sample_weight=sample_weight,
    789             check_input=check_input,
--> 790             X_idx_sorted=X_idx_sorted)
    791         return self
    792 

/home/fatima/anaconda2/lib/python2.7/site-packages/sklearn/tree/tree.pyc in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    114         random_state = check_random_state(self.random_state)
    115         if check_input:
--> 116             X = check_array(X, dtype=DTYPE, accept_sparse="csc")
    117             y = check_array(y, ensure_2d=False, dtype=None)
    118             if issparse(X):

/home/fatima/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.pyc in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    400                                       force_all_finite)
    401     else:
--> 402         array = np.array(array, dtype=dtype, order=order, copy=copy)
    403 
    404         if ensure_2d:

ValueError: could not convert string to float: med
2个回答

9

数据集长这样:

       0      1  2  3      4     5      6
0  vhigh  vhigh  2  2  small   low  unacc
1  vhigh  vhigh  2  2  small   med  unacc
2  vhigh  vhigh  2  2  small  high  unacc
3  vhigh  vhigh  2  2    med   low  unacc
4  vhigh  vhigh  2  2    med   med  unacc

在数据类型(dtypes)全部为对象的情况下,机器学习算法只能从数字(int、float、doubles等)中学习。因此,在使用数据进行训练之前,您需要对其进行编码。

有几种方法可以对数据进行编码,其中一种方法是使用标签编码。要这样做,请在加载数据集后立即将以下行添加到您的代码中:

le = preprocessing.LabelEncoder()
balance_data = balance_data.apply(le.fit_transform)

现在balance_data中的数据看起来像这样:

   0  1  2  3  4  5  6
0  3  3  0  0  2  1  2
1  3  3  0  0  2  2  2
2  3  3  0  0  2  0  2
3  3  3  0  0  1  1  2
4  3  3  0  0  1  2  2

所有数据类型都是int。

通常,在训练/拟合模型之前,您需要执行一些数据预处理。为此,我建议您通过一些教程来了解这个过程。例如,请查看以下内容:


这是修复后的整体代码
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn import tree
from sklearn import preprocessing
import pandas as pd
balance_data=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data",
                           sep= ',', header= None)
#print "Dataset:: "

#df1.head()

le = preprocessing.LabelEncoder()
balance_data = balance_data.apply(le.fit_transform)

X = balance_data.values[:, 0:5]
Y = balance_data.values[:,6]
X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size = 0.2, random_state = 100)
clf_gini = DecisionTreeClassifier(criterion = "gini", random_state = 100,
                               max_depth=3, min_samples_leaf=5)

clf_gini.fit(X_train, y_train)

非常感谢 :) 我一直在尝试使用LabelEncoder(),但不知道如何使用它。 - Hannah Montanna
@HannahMontanna 不客气 :), 可以查看我提供的教程,学习一些关于数据预处理的经验。 - Mohamed Ali JAMAOUI
决策树分类器为什么需要对数据变量进行标签编码?它难道不应该与分类变量一起使用吗? - Mohith7548

0

我已经检查了您要处理的文件,并发现这是数据:

vhigh,vhigh,2,2,small,med,unacc
vhigh,vhigh,2,2,small,high,unacc
vhigh,vhigh,2,2,med,low,unacc
vhigh,vhigh,2,2,med,med,unacc
vhigh,vhigh,2,2,med,high,unacc

当您要求训练模型时,内部试图将您的向量转换为数字,但发现了字符串值(例如"small"、"med"、"high"等),这些值无法解析为数字。

一个好的开始可能是将分类值规范化为onehot编码。在此处查看:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接