在机器学习在行动中第2章,一个示例从文件中读取记录,每行如下:
124 110 223 largeDoses
(忘记它的实际含义)
kNN.py
中的一个功能是:
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines())
returnMat = zeros((numberOfLines,3))
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
问题是listFromLine[-1]
是一个字符串('largeDoses'
等),它如何转换为int
?
在书中,它说numpy
可以解决这个问题。
(从书中:你必须明确地告诉翻译你想要列表中最后一项的整数版本,否则它会给你字符串版本。通常,你必须这样做,但NumPy会为您处理这些细节。) 但是,
ValueError: invalid literal for int() with base 10: 'largeDoses'
发生
import kNN
kNN.file2matrix('dataset.txt')
BTW,这本书的中文版与英文版不同。
答案 0 :(得分:1)
String(确实)不能在python中转换为int,也不能在其他环境中转换为
然而,
解决方案是
如果所有kNN
- 输入培训/交叉验证记录(a.k.a.观察,示例)
符合[ 3x FEATURE, 1x LABEL]
使用:
classLabelVector.append( listFromLine[-1] ) # to .append a LABEL, not an int()
答案 1 :(得分:1)
你应该将那些“大剂量”转换成“大剂量”。 ' smallDoses' ' didntLike'手数到手数。除非String inside是int。
,否则String不能转换为int<form method="post" action="{{ path('save', {'id': id, 'myObject': myObject}) }}">
答案 2 :(得分:0)
可以看出,它不是简单地将字符串更改为整数数据,而是将其更改为表。因此,修改程序如下。
labels = {'didntLike':1,'smallDoses':2,'largeDoses':3}
classLabelVector.append(labels[listFromLine[-1]])