工程构建
- 导入
sklearn
相关包
import numpy as np
from sklearn import neighbors
- 定义
readDataSet(fileName, isTest)
函数,用于加载训练数据,返回特征数据(dataSet)和标签(label)
# fileName: 文件名字
# isTest: =True为测试数据时,只有54列,label直接设0
def readDataSet(fileName, isTest):
fr = open(fileName,encoding='utf-8')
lines = fr.readlines()
numLabels = len(lines)
labels = np.zeros(numLabels) #用于存放标签数据
dateSet = np.zeros([numLabels,54],int) #用于存放特征数据
# 逐行读取数据到dataSet,labels
# 总共55列,前54列是样本特征,最后一列是样本类别(label)
for i in range(numLabels):
line = lines[i]
label = 0
if isTest: #True:测试集只有54列,最后标签直接设为0
label = 0
else: # False:取最后一列为标签数据
label = line.split(' ')[54]
labels[i] = label
dates = np.zeros(54)
for j in range(53): # 前54列添加为特征数据
dates[j] = line.split(' ')[j]
dateSet[i] = dates
fr.close()
return dateSet,labels
添加isTest
参数是为了区别训练集(55列)与测试集数据(54列)列数不同,便于交叉验证时,统计错误数量,核算正确率.
- 加载训练数据
train_dataSet,train_labels = readDataSet('data_train.txt', False)
- 构建KNN分类器,并调用fit()函数
knn = neighbors.KNeighborsClassifier(algorithm='kd_tree', n_neighbors=3)
knn.fit(train_dataSet,train_labels)
- 加载测试集,使用构建好的KNN分类器对测试集进行预测
test_dataSet,test_labels = readDataSet('test.txt', False)
res = knn.predict(test_dataSet)
error = 0
for i in range(len(res)):
if res[i] != test_labels[i]:
error += 1
print('error:',error,'正确率:',(len(res) - error) / len(res))
邻居数量K影响对比
n_neighbors | 1 | 3 | 5 | 7 |
---|---|---|---|---|
错误数量 | 1524 | 1446 | 1495 | 1621 |
正确率 | 0.96136 | 0.96333 | 0.96209 | 0.95889 |
k = 3时正确率最高,当K > 3 后正确率开始下降
网友评论