数据分析实战 45 讲
陈旸
清华大学计算机博士
123928 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

25丨KNN(下):如何对手写数字进行识别?

predict()
fit()
leaf_size
algorithm
weights
n_neighbors
K值设置为200的准确率
对KNN的理解
功能函数
KNN分类器的常用构造参数
深度学习+GPU运算
结果评估
模型训练
数据规范化
数据可视化
数据探索
决策树
朴素贝叶斯
SVM
KNN分类器准确率
数据规范化
数据探索
分类阶段
准备阶段
数据加载
KNeighborsClassifier
思考题
总结
与其他分类器对比
手写数字识别分类
sklearn中使用KNN
KNN

该思维导图由 AI 生成,仅供参考

今天我来带你进行 KNN 的实战。上节课,我讲了 KNN 实际上是计算待分类物体与其他物体之间的距离,然后通过统计最近的 K 个邻居的分类情况,来决定这个物体的分类情况。
这节课,我们先看下如何在 sklearn 中使用 KNN 算法,然后通过 sklearn 中自带的手写数字数据集来进行实战。
之前我还讲过 SVM、朴素贝叶斯和决策树分类,我们还可以用这个数据集来做下训练,对比下这四个分类器的训练结果。

如何在 sklearn 中使用 KNN

在 Python 的 sklearn 工具包中有 KNN 算法。KNN 既可以做分类器,也可以做回归。如果是做分类,你需要引用:
from sklearn.neighbors import KNeighborsClassifier
如果是做回归,你需要引用:
from sklearn.neighbors import KNeighborsRegressor
从名字上你也能看出来 Classifier 对应的是分类,Regressor 对应的是回归。一般来说如果一个算法有 Classifier 类,都能找到相应的 Regressor 类。比如在决策树分类中,你可以使用 DecisionTreeClassifier,也可以使用决策树来做回归 DecisionTreeRegressor。
好了,我们看下如何在 sklearn 中创建 KNN 分类器。
这里,我们使用构造函数 KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30),这里有几个比较主要的参数,我分别来讲解下:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用KNN算法对手写数字进行识别分类。KNN算法通过计算待分类物体与其他物体之间的距离,并统计最近的K个邻居的分类情况来决定物体分类。文章首先介绍了在sklearn中使用KNN算法的方法,包括KNN分类器的构造和参数设置。通过实战演示,展示了KNN分类器的训练和预测过程。此外,还介绍了手写数字数据集的特点和数据探索方法,以及对数据进行规范化处理的步骤。最后,通过对比KNN算法与其他分类器在手写数字数据集上的效果,展示了KNN算法的准确率。整体来说,本文通过实例演示了KNN算法在图像识别领域的应用,为读者提供了一种快速了解和使用KNN算法的方法。文章还提到了其他分类器的效果,并指出在数据量较大时,深度学习+GPU运算更适合。读者可以通过实例了解数据探索、数据可视化、数据规范化、模型训练和结果评估的使用过程。文章最后留下了两道思考题,鼓励读者深入思考KNN分类器的构造参数、功能函数以及K值对分类器准确率的影响。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(41)

  • 最新
  • 精选
  • Ricardo
    accuracy_score的参数顺序都错了,由于是计算真实标签和预测标签重合个数与总个数的比值,总能得到正确的答案,但是官方文档中写明的正确顺序应该是(y_true,y_pred)

    编辑回复: 看的很认真,我刚查了下官方文档确实是先写y_true,然后是y_pred,也就是:accuracy_score(y_true, y_pred, normalize=True, sample_weight=None) 关于score的计算,是判断y_true和y_pred是否相等,也就是 score = y_true == y_pred,然后再根据样本的权重做归一化处理,调用_weighted_sum(score, sample_weight, normalize) 所以我刚用代码测试了下accuracy_score(y_true, y_pred)和accuracy_score(y_pred, y_true)的结果是一样的。Anyway,规范的话应该按照官方文档的顺序来调用参数。多谢反馈

    2019-04-10
    31
  • 不做键盘侠
    为什么test只需要使用transform就可以了?test_ss_x = ss.transform(test_x)

    编辑回复: 一个很好的问题。我在train的时候用到了:train_ss_x = ss.fit_transform(train_x) 实际上:fit_transform是fit和transform两个函数都执行一次。所以ss是进行了fit拟合的。只有在fit拟合之后,才能进行transform 在进行test的时候,我们已经在train的时候fit过了,所以直接transform即可。 另外,如果我们没有fit,直接进行transform会报错,因为需要先fit拟合,才可以进行transform。

    2019-02-08
    6
    28
  • 牛奶布丁
    老师,为什么做多项式朴素贝叶斯分类的时候,传入的数据不能有负数呢,之前老师讲文本分类的时候好像没有提到这一点?

    编辑回复: 多项式朴素贝叶斯实际上是符合多项式分布,不会存在负数。而高斯朴素贝叶斯呈现的是高斯分布,也就是正态分布,比如均值为0,方差为1的标准正态分布,可以存在负数。

    2019-02-13
    13
  • Yiuway
    在做项目的时候,应该什么时候用Min-Max,什么时候用Z-Score呢?当我不做规范化的时候,反而准确率更高,这是为什么呢?在数据规范化该什么时候做不太理解,希望得到回复!

    作者回复: 数据比较零散的话可以使用Min-Max规范化,如果数据符合高斯分布,可以使用Z-Score规范化。 有些分类方法对归一化比较敏感,比如GaussianNB,效果就不一定好。不过大部分情况下,还是需要先对数据做规范化处理

    2019-09-30
    2
    12
  • 用代码计算来以下准确率: knn默认k值为5 准确率:0.9756 knn的k值为200的准确率:0.8489 SVM分类准确率:0.9867 高斯朴素贝叶斯准确率:0.8111 多项式朴素贝叶斯分类器准确率:0.8844 CART决策树准确率:0.8400 K值的选取如果过大,正确率降低。 算法效率排行 SVM > KNN(k值在合适范围内) >多项式朴素贝叶斯 > CART > 高斯朴素贝叶斯

    作者回复: 对的 Good Job 滢离数据总监越来越近了

    2019-04-18
    7
  • Lee
    KNN 中的 K 值设置为 200,KNN 准确率: 0.8489,k值过大,导致部分未知物体没有分类出来,所以准确率下降了

    编辑回复: 对的,K值过大,无法将未知物体分类出来,会降低准确率。

    2019-02-14
    3
  • FORWARD―MOUNT
    train_x与train_y都是训练集?

    编辑回复: 对 训练集的特征矩阵和分类结果。对应test_x和test_y是测试集的特征矩阵和分类结果。

    2019-02-16
    2
    2
  • JingZ
    #knn 将K值调为200,准确率变为0.8489了,相比较默认K=5的准确率 0.9756,下降13% from sklearn.datasets import load_digits import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn import preprocessing from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score #加载数据 digits = load_digits() data = digits.data #数据探索 print(data.shape) #查看第一幅图像 print(digits.images[0]) print(digits.target[0]) #数据可视化 plt.gray() plt.imshow(digits.images[0]) plt.show() #训练集 测试集 train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33) #采用 Z-Score 规范化 ss = preprocessing.StandardScaler() train_ss_x = ss.fit_transform(train_x) test_ss_x = ss.transform(test_x) #创建 KNN 分类器 knn = KNeighborsClassifier(n_neighbors=200) #用训练集训练 knn.fit(train_ss_x, train_y) #用测试集预测 predict_y = knn.predict(test_ss_x) #模型评估 print('KNN 准确率:%.4lf' % accuracy_score(predict_y, test_y))

    编辑回复: 对的K值大未必好

    2019-02-15
    2
  • Ronnyz
    老师能解释下数据分割时random_state的取值有什么规范吗? 我自己测试的random_state=666与老师=33得出的准确度还是有一些差距的: KNN准确率:0.9778 SVM准确率:0.9733 多项式朴素贝叶斯准确率:0.9067 CART决策树准确率:0.8489

    作者回复: random_state 就是随机数种子,没有必要调整个参数,每次运算结果不同 还是正常的

    2019-11-14
    1
  • 从未在此
    那个标准化函数已经在训练集上拟合并产生了平均值和标准差。所以测试集用同样的标准直接拿来用就行了

    作者回复: 可以

    2019-02-12
    1
收起评论
显示
设置
留言
41
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部