使用 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 朴素贝叶斯与浮点数一起使用时出现未知标签类型错误