数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17333 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

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

陈旸 2019-02-08
今天我来带你进行 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(25)

  • 不做键盘侠
    为什么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
    1
    16
  • 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
    11
  • 牛奶布丁
    老师,为什么做多项式朴素贝叶斯分类的时候,传入的数据不能有负数呢,之前老师讲文本分类的时候好像没有提到这一点?

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

    2019-02-13
    5
  • third
    KNN常用的构造参数
    KNeighborsClassifier(n_neighbors=5,weights='uniform',algorithm='auto',leaf_size=30)
    n_neighbors是邻居的数目

    weights是权重
    uniform是权重相同,求平均值
    distance是根据距离的倒数
    自定义

    algorithm规定邻居的方式
    auto根据数据自动选择
    kd_tree,多维空间的数据结构,一般不超过20维,对关键数据检索很方便
    ball_tree,适用于维度大的
    brute包里搜索,线性扫描

    leaf_size是叶子数

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

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

    2019-09-30
    2
  • FORWARD―MOUNT
    train_x与train_y都是训练集?

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

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

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

    2019-02-14
    2
  • Geek_dd384f
    #preprocessing.StandardScaler 和preprocessing.scale的区别
    #使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。
    ss = preprocessing.StandardScaler()
    train_ss_x = ss.fit_transform(train_x) #这里的fit_transform相当于先fit 再 transform
    test_ss_x = ss.transform(test_x) #这里没有使用fit_transform 就是因为使用了StandardScaler()
    #使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。
    #train_ss_x = preprocessing.scale(train_x)
    #test_ss_x = preprocessing.scale(test_x)
    2019-07-01
    1
    1
  • 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
    1
  • Ronnyz
    老师能解释下数据分割时random_state的取值有什么规范吗?
    我自己测试的random_state=666与老师=33得出的准确度还是有一些差距的:
    KNN准确率:0.9778
    SVM准确率:0.9733
    多项式朴素贝叶斯准确率:0.9067
    CART决策树准确率:0.8489

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

    2019-11-14
  • Geek_94b54f
    实际上 数字图片只需要0 和1 区分开来 就可以了吧 期待问答
    2019-08-01
  • FeiFei
    #n_neighbors:K值
    #weights:节点权重。全一样,或者距离的倒数,或者自定义函数
    #algorithm:auto;kd_tree;ball_tree;brute
    #leaf_size:叶子节点数量

    0.8489
    2019-07-23
  • 张晓辉
    如果把K设置为200,KNN的准确率会下降到0.84。比之前默认值要差很多。

    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.datasets import load_digits
    from sklearn.preprocessing import StandardScaler
    from sklearn.preprocessing import MinMaxScaler
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn.svm import SVC
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.tree import DecisionTreeClassifier

    digits = load_digits()
    data = digits.data
    train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)
    ss = StandardScaler()

    train_ss_x = ss.fit_transform(train_x)
    test_ss_x = ss.transform(test_x)

    knn = KNeighborsClassifier()
    knn.fit(train_ss_x, train_y)
    predict_y = knn.predict(test_ss_x)
    print("KNN precision %.4lf" % accuracy_score(predict_y, test_y))

    svm = SVC(gamma='auto')
    svm.fit(train_ss_x, train_y)
    predict_y = svm.predict(test_ss_x)
    print("SVM precision %.4lf" % accuracy_score(predict_y, test_y))

    mm = MinMaxScaler()
    train_mm_x = mm.fit_transform(train_x)
    test_mm_x = mm.transform(test_x)
    mnb = MultinomialNB()
    mnb.fit(train_mm_x, train_y)
    predict_y = mnb.predict(test_mm_x)
    print("MultinomialNB precision %.4lf" % accuracy_score(predict_y, test_y))

    dtc = DecisionTreeClassifier()
    dtc.fit(train_mm_x, train_y)
    predict_y = dtc.predict(test_mm_x)
    print("DecisionTree precision %.4lf" % accuracy_score(predict_y, test_y))
    2019-05-21
  • 老师,想问个问题,KNeighborsClassifier的默认k值为5,我们可以给其设置默认k值。在上一节中讲到K值的选取用交叉验证,如果用sklearn实现的话,我们需要给KNeighborsClassifier设定不同的k值来寻找最优K值吗?
    2019-04-18
  • 用代码计算来以下准确率:
    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 > 高斯朴素贝叶斯
    2019-04-18
  • XP@培新
    请教老师一个可能很“外行”的问题,KNN分类器训练输出到底是什么? 感觉直接算不就可以了吗? 谢谢
    2019-04-15
  • 周飞
    如果把 KNN 中的 K 值设置为 200 ,那么准确率是 0.8489
    2019-04-14
  • 周飞
    knn分类器的常用构造参数有:
    1.n_neighbors 代表邻居的数量。
    2.weights: 代表所有邻居的权重,其中 uniform 代表所有邻居权重相同, distance 代表权重是距离的倒数。还可以自定义。
    3.algorithm: 计算邻居的方法,auto代表 根据数据的情况自动选择,kd_tree 是kd树,适用于维数不超过20的情况。ball_tree是球树,可以用于维度更大的情况。brute 是暴力搜索。
    4.leaf_size:是kd树或者球树的叶子数量,默认是20.
    2019-04-13
  • 滨滨
    knn算法就是说,邻居大多数是什么你就是什么。
    n_neighbors是邻居的数目

    weights是权重
    uniform是权重相同,求平均值
    distance是根据距离的倒数
    自定义

    algorithm规定邻居选择的方式
    auto根据数据自动选择
    kd_tree,类似平衡二叉树,提高查找效率,多维空间的数据结构,一般不超过20维,对关键数据检索很方便
    ball_tree,适用于维度大的
    brute 暴力搜索,线性扫描

    leaf_size是叶子数

    k为200的时候准确率降低。
    多项式分布没有负数,高斯分布可以有负数。
    2019-03-30
  • 叮当猫
    n_neighbors =5时,准确率是0.9756,当n_neighbors =200时,准确率是0.8489,K值大不一定效果好,可能会欠拟合。

    KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30)
    #参数n_neighbors,即knn中的k值,k值选取过小容易过拟合,k值选取过大鲁棒性强但欠拟合
    #参数weights,用来确定邻居的权重,uniform表示所有邻居权重相同,distance代表权重是距离的倒数,与距离成反比,自定义函数表示可以自定义不同距离对应的权重。
    #参数algorithm,用来规定计算邻居的方法,
    #参数algorithm=auto根据数据情况自动选择合适的算法
    #参数algorithm=kd_tree,kd树,多维空间的数据结构,方便对关键数据进行检索,适用维度少的情况,不超过20,大于20后效率下降
    #参数algorithm=ball_tree,球树,和kd树医院都是多维空间数据结果,适用于维度大的情况
    #参数algorithm=brute,暴力所搜,采用线性扫描,而不是通过构造树结果进行快速检索,训练集大的时候效率低
    #参数leaf_size,代表构造kd树或球树时的叶子树,默认是30,调整它会影响到树的构造和搜索速度
    2019-03-17
收起评论
25
返回
顶部