ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kNN-预测

2021-11-16 23:33:43  阅读:148  来源: 互联网

标签:kNN 预测 predict num labelSet classifier norm


现在进行第五步,对数据进行预测

那么要做的的是从数据集里面拿出一部分作为要预测的,剩下的去比较,书上使用的是10%

# 对之前做好的kNN算法进行预测
# 首先获取之前构造好的kNN分类器、数据、规则化之后的数据
import kNN
import norm
# 倒完包之后先别急,目的是从规则化的数据集里面选100个出来,用分类器进行预测,计算错误率
# 这里图简单,直接用的前100个进行预测,后面会打乱数据集进行真正的随机

labelSet = norm.labelSet
norm_data = norm.norm_data
random_ratio = 0.10
norm_num = len(norm_data)  # 1000
predict_num = int(random_ratio * norm_num)  # 100
errorNum = 0.0

然后进行预测,预测的思路是:

  • 100行预测,剩下900行作为比对
  • 每次取1行,然后经过分类器得出结果,再与标记的结果进行比较,看正误
  • 输出结果并计算错误率
# 开始预测
for i in range(predict_num):
    predict_result = kNN.classifier(norm_data[i, :], norm_data[predict_num:norm_num, :], labelSet[predict_num:norm_num], 3)
    # print(predict_result)
    print("the classifier came back with:%d,the real answer is:%d " % (predict_result, labelSet[i]))
    if predict_result != labelSet[i]:
        errorNum += 1.0
print("the total error rate is:%f"%(errorNum/float(predict_num)))

然鹅,报错了

TypeError: unhashable type: 'numpy.ndarray'

这里的报错,网上找了很多,都没有解决,尝试自己一步一步解决

  • 首先,在kNN文件中使用classifier是没有问题的
  • 这里的错误指向的是kNN.classifier,但是检查了网上说的几种情况如变量名冲突、np.array类型都没有问题
  • 那么只有可能是kNN中classifier的数据类型出了问题
  • 通过报错提示的行数,将字典中的label类型从str修改为int,即可成功

修改代码如下

# kNN.py
label = int(label)

再次运行predict.py

# 对之前做好的kNN算法进行预测
# 首先获取之前构造好的kNN分类器、数据、规则化之后的数据
import kNN
import norm

# 倒完包之后先别急,目的是从规则化的数据集里面选100个出来,用分类器进行预测,计算错误率
# 这里图简单,直接用的前100个进行预测,后面会打乱数据集进行真正的随机

labelSet = norm.labelSet
norm_data = norm.norm_data
random_ratio = 0.10
norm_num = len(norm_data)  # 1000
predict_num = int(random_ratio * norm_num)  # 100
errorNum = 0.0



# 开始预测
for i in range(predict_num):
    predict_result = kNN.classifier(norm_data[i, :], norm_data[predict_num:norm_num, :], labelSet[predict_num:norm_num], 3)
    # print(predict_result)
    print("the classifier came back with:%d,the real answer is:%d " % (predict_result, labelSet[i]))
    if predict_result != labelSet[i]:
        errorNum += 1.0
print("the total error rate is:%f"%(errorNum/float(predict_num)))

结果如下

the classifier came back with:3,the real answer is:3 
the classifier came back with:2,the real answer is:2 
the classifier came back with:1,the real answer is:1 
...
the classifier came back with:3,the real answer is:1 
the total error rate is:0.050000

但是,这也会带来一个问题,那就是原来kNN中的预测会报错,因为原来标签是对应的str类型

标签:kNN,预测,predict,num,labelSet,classifier,norm
来源: https://www.cnblogs.com/lpzju/p/15564443.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有