在学习机器学习实战一书中的KNN算法中发现KNN算法没有对应的关于不同k值的测试算法,所以在学习完这一章后,自己尝试写了一下测试算法。
该算法选择数据集中的90%数据作为训练集,剩余的10%的数据作为测试集,测试在KNN算法取不同的k值时错误率的变化情况。
以下为代码段:
def knn_test(dataset, dataset_labels, number): # KNN算法测试函数
m = shape(dataset)[0] # 获取测试集的数据数目
rate = 0.10
testnum = int(m * rate)
print(testnum)
k = 1 # 初始化k为1
dataset_normal, dataset_ranges, dataset_min = autoNorm(dataset) # 对测试集进行归一化
error = 0 # 记录错误次数
error_rate = 0.0 # 记录错误率
result_list = {} # 创建字典记录不同的k值对应的错误率
while k <= number:
for i in range(testnum):
predict_class = classify0(14[i, :], dataset_normal[testnum:m, :], dataset_labels[testnum:m], k)
if predict_class != dataset_labels[i]:
error += 1
error_rate = error / testnum
# print(error_rate)
print(error)
result_list[k] = error_rate
k += 1
error = 0
return result_list
以下为输出结果(本例中选择的k值范围从1到30)
print(knn_test(datingDataMat, datingLabels, number=30)) # number参数控制k取到的最大值
{1: 0.08, 2: 0.08, 3: 0.05, 4: 0.04, 5: 0.05, 6: 0.05, 7: 0.04, 8: 0.05, 9: 0.05, 10: 0.06, 11: 0.06, 12: 0.06, 13: 0.06, 14: 0.06, 15: 0.06, 16: 0.06, 17: 0.06, 18: 0.06, 19: 0.06, 20: 0.06, 21: 0.06, 22: 0.06, 23: 0.06, 24: 0.06, 25: 0.06, 26: 0.06, 27: 0.06, 28: 0.06, 29: 0.06, 30: 0.06}