使用 sklearn 时出现错误:ValueError:无法将字符串转换为浮点数:

Posted

技术标签:

【中文标题】使用 sklearn 时出现错误:ValueError:无法将字符串转换为浮点数:【英文标题】:I have an error when use sklearn : ValueError: could not convert string to float: 【发布时间】:2020-08-09 13:01:49 【问题描述】:

我在 csv 文件中的数据:

黄瓜,绿色,15,4
番茄,红色,7,7
胡萝卜,橙子,13,3
洋葱,白,8,8
土豆,灰色,8,6
苹果,红,7,6
苹果,黄色,6,5
椰子,棕色,25,20
橙色,橙色,7,7
香蕉,黄色,16,4
柠檬,黄色,5,4
西瓜,绿色,30,25
樱桃,黑色,2,2

我想预测一个水果!

导入 csv 从 sklearn 导入树 x = [] y = [] lst = [] 使用 open('F5-ML-TEST.csv', 'r') 作为 csvfile: 数据 = csv.reader(csvfile) 对于数据行: lst.append(行[1]) lst.append(行[2]) lst.append(行[3]) x.append(lst) y.append(行[0]) lst = [] 打印('x ----- >', x) print('y ----- >', y) clf = tree.DecisionTreeClassifier() clf = clf.fit(x, y) new_data = [["红色", 7, 7], ["黄色", 5, 6]] 答案 = clf.predict(new_data) print('answer[0]======>', answer[0]) print('answer[1]======>', answer[1])

【问题讨论】:

你只能用数字来预测数字。所以 sklearn 不明白“黄瓜”是如何预测的。你需要onehot编码什么的 可能重复,@RezaFiouji 看看这里***.com/q/38108832/4476612 这能回答你的问题吗? Passing categorical data to Sklearn Decision Tree 【参考方案1】:

因此,您需要将字符串数据编码为数字特征。我在这里复制您的输入:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
from sklearn.tree import DecisionTreeClassifier

df = pd.read_clipboard(header=None, sep=',')
             0       1   2   3
0     cucumber   green  15   4
1       tomato     red   7   7
2      carrots  Orange  13   3
3        onion   White   8   8
4     potatoes    Gray   8   6
5        apple     Red   7   6
6        apple  Yellow   6   5

您需要对“颜色”列进行编码:

ohe = OneHotEncoder(sparse=False)

colors = ohe.fit_transform(df.iloc[:, 1].values.reshape(-1, 1))

现在看起来像这样,每种颜色都是一列:

array([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.], ...

然后你需要将它与其他已经是数字的列连接起来:

inputs = np.concatenate([df.iloc[:, 2:].values, colors], axis=1)

现在,您需要将目标(水果)转化为数字:

oe = OrdinalEncoder()

targets = oe.fit_transform(df.iloc[:, 0].values.reshape(-1, 1))

现在,它们看起来像这样:

array([[ 5.],
       [10.],
       [ 2.],
       [ 7.],
       [ 9.],
       [ 0.], ...

然后,您可以拟合您的决策树:

clf = DecisionTreeClassifier()
clf = clf.fit(inputs, targets)

现在您甚至可以预测新数据:

new_data = [["red", 7, 7], ["Yellow", 5, 6]]

new_data = np.concatenate([[i[1:] for i in new_data],
    ohe.transform([[i[0]] for i in new_data])], axis=1)

answer = clf.predict(new_data)
oe.categories_[0][answer.astype(int)]
Out[88]: array(['tomato', 'apple'], dtype=object)

【讨论】:

以上是关于使用 sklearn 时出现错误:ValueError:无法将字符串转换为浮点数:的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn 中使用 datasets.fetch_mldata() 时出现 IO 错误

拟合 Sklearn 模型时出现“设备上没有剩余空间”错误

当 Sklearn 朴素贝叶斯与浮点数一起使用时出现未知标签类型错误

使用 sklearn 时出现错误:ValueError:无法将字符串转换为浮点数:

导入 sklearn 时出现不可排序的类型错误

使用自定义转换器子类对 sklearn 管道进行评分时出现 AttributeError,但在拟合时却没有