机器学习实战kNN中的文本转换为数组程序心得
- 原程序
- 出现的问题
- 解决的办法
原程序
在机器学习实战书中2.2.1章节中,作者在准备数据时,打算从文本文件中解析数据,其代码为:
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
>>>reload(kNN)
>>>datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')
在其中文版的书中,datingLabels输出是[3,2,1…],因为在输入文件datingTestSet.txt(可以去网站下载)中,他的标签是largeDoses,smallDoses,didntLike,估计他的本意就是用1,2,3来代替标签largeDoses,smallDoses,didntLike。
出现的问题
但是运行这个程序是有问题的,主要出现在
classLabelVector.append(int(listFromLine[-1]))
本意是将listFromLine最后一列的字符标签转成int类型,但是运行是不行的,会出错。
解决办法
* 按照英文版机器学习实战,输出的就是标签字符,所以,可以改为如下:*
classLabelVector.append(listFromLine[-1])
* 按照中文版机器学习实战,要输出int型数字,可以使用一个字典:*
def file2matrix(filename):
'''
:param filename: 输入为文件名字符串
:return: 输出为训练样本矩阵和类标签向量
'''
fr = open(filename)
arrayOLines = fr.readlines()
numberOfLines = len(arrayOLines)
returnMat = zeros((numberOfLines, 3))
classLabelVector = []
index = 0
string2int = {'largeDoses':3, 'smallDoses':2, 'didntLike':1}# 创建一个字典
for line in arrayOLines:
line = line.strip()# 截取回车字符
listFromLine = line.split('\t')# 将整行的数据分割成一个元素列表
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(string2int.get(listFromLine[-1]))# 取字典值所对应的键
index += 1
return returnMat, classLabelVector