《机器学习实战》笔记 第二章 (2)
2.2 约会网站配对
代码实现
这里原作者给出的数据集的标签不是int,实现代码的时候,出现了问题,给出两种解决方案。以下是书上的源代码
#将约会数据文本记录转化为numpy的解析程序
def file2matrix(filename):
fr = open(filename)
arrayOlines = fr.readlines()
#得到文件的行数
numberOfLines = len(arrayOlines)
#创建返回Numpy的矩阵
returnMat = zeros((numberOfLines,3))
classLabelVector = []
index = 0
#解析文件数据到列表
for line in arrayOlines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
解决方案①
替换classLabelVector.append(int(listFromLine[-1]))
#将约会数据文本记录转化为numpy的解析程序
def file2matrix(filename):
fr = open(filename)
arrayOlines = fr.readlines()
#得到文件的行数
numberOfLines = len(arrayOlines)
#创建返回Numpy的矩阵
returnMat = zeros((numberOfLines,3))
classLabelVector = []
index = 0
#解析文件数据到列表
for line in arrayOlines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
if listFromLine[-1] == 'did_not_Like':
classLabelVector.append(1)
elif listFromLine[-1] == 'small_Doses':
classLabelVector.append(2)
elif listFromLine[-1] == 'large_Doses':
classLabelVector.append(3)
index += 1
return returnMat,classLabelVector
注意,Python2可直接输入reload()
但Python3必须先import importlib导入!
在ipython下
>>>import importlib
>>>importlib.reload(kNN)
>>>datingDataMat, datingLabels = kNN.files2matrix('datingTestSet.txt')
解决方案②
代码同书
#将约会数据文本记录转化为numpy的解析程序
def file2matrix(filename):
fr = open(filename)
arrayOlines = fr.readlines()
#得到文件的行数
numberOfLines = len(arrayOlines)
#创建返回Numpy的矩阵
returnMat = zeros((numberOfLines,3))
classLabelVector = []
index = 0
#解析文件数据到列表
for line in arrayOlines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
在ipython下引用把标签格式改为int的datingTestSet2.txt
>>>datingDataMat, datingLabels = kNN.files2matrix('datingTestSet2.txt')
输出datingDataMat和datingLabels
In[1]: datingDataMat
Out[1]:
array([[4.0920000e+04, 8.3269760e+00, 9.5395200e-01],
[1.4488000e+04