《机器学习实战》——P21,用KNN算法改进约会网站的配对效果
在把数据放进算法训练前,需要先从数据集/txt文本等地方读入数据。
今天这篇文章尝试进行读入数据
解析数据
1.在读入数据之前,要先知道数据存放的结构。是一行数据代表一个数据样本?还是一列数据代表一个数据样本?这首先要弄清楚。不过通常是一行数据代表一个数据样本。
2.假设是一行数据代表一个样本,那么这行数据里面每个元素是data特征之一还是label
以下就是读取数据的常规操作,用代码展示:
with open("数据路径") as inline:
for line in inline:
元素1, 元素2, ..... 等等 = line.split('分隔符')
数据格式化,把数据放入列表/元组
3.读取数据之后通常会把数据放进list"[元素1,元素2,…]" 或者tuple"(元素1,元素2,…)"
然后假设:
第1条数据所有元素放进list1[元素1,元素2…]
第2条数据所有元素放进list2[元素1,元素2…]
…
第N条数据所有元素放进listN[元素1,元素2…]
这N条数据的list放进一个大的list里面,组成:
list[list1, list2, …, listN]
最后再对这个list进行输出,输出给一个变量,就可以完成对数据读入的处理。
用代码展示:
list = []
with open("数据路径") as inline:
for line in inline:
元素1, 元素2, .....等等 = line.split('分隔符')
#进行的新的操作
list.append([元素1, 元素2, .....等等])
#第一次进行之后list会变成[[元素1, 元素2, .....等等],]
#所有for循环进行完成后list会变成
#[[元素1, 元素2, .....等等],
# [元素1, 元素2, .....等等],
# ...n个
# [元素1, 元素2, .....等等]]
return list
演示例子
这里有datingTestSet2.txt数据集,展示部分数据
datingTestSet2.txt数据集,以及《机器学习实战》书本代码以及其他数据都可以在下面的链接下载:
https://www.manning.com/downloads/1108
本文数据集在 “Ch02\datingTestSet2.txt” 目录下
datingTestSet2.txt:
40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1
75136 13.147394 0.428964 1
38344 1.669788 0.134296 1
…
以上是datingTestSet2.txt的部分数据
每两列数据之间都用 "\t" —— 制表符 分隔
格式化后
特征1 | 特征2 | 特征3 | label |
---|---|---|---|
40920 | 8.326976 | 0.953952 | 3 |
14488 | 7.153469 | 1.673904 | 2 |
26052 | 1.441871 | 0.805124 | 1 |
75136 | 13.147394 | 0.428964 | 1 |
38344 | 1.669788 | 0.134296 | 1 |
… | … | … | … |
前三列为特征,最后一列label,是表示分类的标签
用代码展示:
1.用file_path找到txt数据文件
2.再用with… open…打开,取得所有行数据——inline
3.用for循环读取 inline 中 每行数据 —— line ,并且计数循环了多少次——用于表示数据数量
4.用split函数分割 line——每行数据 赋值给 变量
5.打包 变量 中的 特征变量 成为一个 list,给 变量 data_list
同时
6.打包 变量 中的 label变量 成为一个 list,给 变量 label_list
def file2Matrix(file_path):
data_list = []
label_list = []
count = 0
with open(file_path) as inline:
for line in inline:
#strip(),用于移除字符串头尾指定的字符
#可移除末尾的"\n"换行符
line = line.strip()
#分割之后a1,a2,a3都是string类型
#所以要转换成float,再放进列表
#不然到后面运算错误
a1, a2, a3, label = line.split("\t")
data_list.append([a1 ,a2 ,a3])
#data_list.append([float(a1) ,float(a2) ,float(a3)])
label_list.append(label)
count += 1
return count, data_list, label_list
测试
测试代码
count, data_list, label_list = file2Matrix("C:\\Users\\hello\\Desktop\\MLBook\\Ch02\\datingTestSet2.txt")
print(array(data))
print(array(label))
print(count)
测试结果:
到后面输入KNN算法函数进行测试出现:
Traceback (most recent call last):
File "C:/Users/hello/PycharmProjects/pythonProject/KNNinPage19.py", line 130, in <module>
classs = classfly0(a,data_list_np,label_list_np,10)
File "C:/Users/hello/PycharmProjects/pythonProject/KNNinPage19.py", line 19, in classfly0
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
原因是因为split之后特征data都是string类型,需要转换成float/int
a1, a2, a3, label = line.split("\t")
#错误
#data_list.append([a1 ,a2 ,a3])
#正确
data_list.append([float(a1), float(a2), float(a3)])