25丨KNN(下):如何对手写数字进行识别?
25丨KNN(下):如何对手写数字进行识别?
讲述:陈旸
时长08:33大小7.85M
如何在 sklearn 中使用 KNN
如何用 KNN 对手写数字进行识别分类
总结
赞 12
提建议
精选留言(41)
- 不做键盘侠2019-02-08为什么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。
共 6 条评论28 - Ricardo2019-04-10accuracy_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,规范的话应该按照官方文档的顺序来调用参数。多谢反馈
27 - 牛奶布丁2019-02-13老师,为什么做多项式朴素贝叶斯分类的时候,传入的数据不能有负数呢,之前老师讲文本分类的时候好像没有提到这一点?
编辑回复: 多项式朴素贝叶斯实际上是符合多项式分布,不会存在负数。而高斯朴素贝叶斯呈现的是高斯分布,也就是正态分布,比如均值为0,方差为1的标准正态分布,可以存在负数。
13 - Yiuway2019-09-30在做项目的时候,应该什么时候用Min-Max,什么时候用Z-Score呢?当我不做规范化的时候,反而准确率更高,这是为什么呢?在数据规范化该什么时候做不太理解,希望得到回复!
作者回复: 数据比较零散的话可以使用Min-Max规范化,如果数据符合高斯分布,可以使用Z-Score规范化。 有些分类方法对归一化比较敏感,比如GaussianNB,效果就不一定好。不过大部分情况下,还是需要先对数据做规范化处理
共 2 条评论12 - 滢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 > 高斯朴素贝叶斯展开
作者回复: 对的 Good Job 滢离数据总监越来越近了
6 - third2019-02-18KNN常用的构造参数 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是叶子数展开5
- Geek_dd384f2019-07-01#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)展开共 1 条评论3
- Lee2019-02-14KNN 中的 K 值设置为 200,KNN 准确率: 0.8489,k值过大,导致部分未知物体没有分类出来,所以准确率下降了
编辑回复: 对的,K值过大,无法将未知物体分类出来,会降低准确率。
3 - FORWARD―MOUNT2019-02-16train_x与train_y都是训练集?
编辑回复: 对 训练集的特征矩阵和分类结果。对应test_x和test_y是测试集的特征矩阵和分类结果。
共 2 条评论2 - JingZ2019-02-15#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值大未必好
2 - Ronnyz2019-11-14老师能解释下数据分割时random_state的取值有什么规范吗? 我自己测试的random_state=666与老师=33得出的准确度还是有一些差距的: KNN准确率:0.9778 SVM准确率:0.9733 多项式朴素贝叶斯准确率:0.9067 CART决策树准确率:0.8489展开
作者回复: random_state 就是随机数种子,没有必要调整个参数,每次运算结果不同 还是正常的
1 - 从未在此2019-02-12那个标准化函数已经在训练集上拟合并产生了平均值和标准差。所以测试集用同样的标准直接拿来用就行了
作者回复: 可以
1 - Geek_35a6a82022-05-18运行出的图像是什么意思,应该怎么看呢
- Fan2021-07-21train_x, test_x, train_y, test_y = train_test_split(data, target, test_size=0.25, random_state=33) 这句代码中random_state=33 是什么意思呢?
- Fan2021-07-21贴下代码 from operator import imod from scipy.sparse.construct import random from sklearn.model_selection import train_test_split from sklearn import preprocessing from sklearn.metrics import accuracy_score from sklearn.datasets import load_digits from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from sklearn.naive_bayes import MultinomialNB from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplot as plt #加载数据 digits = load_digits() data = digits.data # 数据探索 print(data.shape) # print(data[0]) # 查看第一幅图像 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() knn.fit(train_ss_x, train_y) predict_y=knn.predict(test_ss_x) print("KNN准确率: %.4lf" % accuracy_score(test_y, predict_y)) # 创建SVM分类器 svm = SVC() svm.fit(train_ss_x, train_y) predict_y=svm.predict(test_ss_x) print("SVM准确率: %0.4lf" % accuracy_score(test_y, predict_y)) # 采用Min-Max规范化 mm=preprocessing.MinMaxScaler() train_mm_x=mm.fit_transform(train_x) test_mm_x=mm.transform(test_x) # 创建Naive Bayes分类器 mnb=MultinomialNB() mnb.fit(train_mm_x, train_y) predict_y=mnb.predict(test_mm_x) print("多项式朴素贝叶斯准确率: %.4lf" % accuracy_score(test_y, predict_y)) # 创建CART决策树分类器 dtc=DecisionTreeClassifier() dtc.fit(train_mm_x, train_y) predict_y=dtc.predict(test_mm_x) print("CART决策树准确率: %.4lf" % accuracy_score(test_y, predict_y)) =============== KNN准确率: 0.9756 SVM准确率: 0.9867 多项式朴素贝叶斯准确率: 0.8844 CART决策树准确率: 0.8578展开
- 彭涛2021-06-16老师您好,请问这里的 KNN 分类器没看见 K 值是如何设置的,请问是使用了默认值吗?共 1 条评论
- 完美坚持2021-04-111. 如何实现用CV来选择合适的k 2. 深度学习+GPU运算怎么实现
- McKee Chen2020-12-23KNN常用构造函数为KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30) 其中: n_neighbors代表K值,K值不宜太大,会欠拟合;也不宜太小,会过拟合; weights代表邻居的权重; algorithm代表计算邻居的方法 leaf_size达标构造KD树或球树的叶子数 计算逻辑: 对样本数据集按一定比例进行划分,训练集通过fit函数对模型进行训练,然后将测试集的数据输入训练好的模型中,再通过predict函数预测测试集的分类结果,最后通过accuracy_score计算模型的准确率 KNN是一种监督学习,可以用于图像识别、字符识别、文本分类,K值通过交叉验证得出,且K值不能太大 #当K值=200时,计算KNN分类器的准确率 #导入包 import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import accuracy_score from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_digits from sklearn.naive_bayes import MultinomialNB from sklearn.tree import DecisionTreeClassifier #数据加载 digits = load_digits() #获得图像和分类结果 data = digits.data target = digits.target #将样本集进行划分,选取25%作为测试集,其余为训练集 train_x, test_x, train_y, test_y = train_test_split(data, 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分类器 knn = KNeighborsClassifier(n_neighbors=200)#取K值=200 #训练分类器 knn.fit(train_ss_x, train_y) #预测测试集结果 predict_y = knn.predict(test_ss_x) #计算准确率 print('KNN分类器准确率为:', accuracy_score(test_y, predict_y)) #输出结果 KNN分类器准确率为: 0.8488888888888889展开
- 斯盖丸2020-11-01老师,这个z-score规范化,把数据变成标准正态分布,在这个例子里的作用是什么?也就是说数据变化前是什么样的,变化后又是什么样的……如果不这么变化会带来什么结果?
作者回复: 当模型中存在对不同特征进行线性加权求和这种操作的时候通常都需要对特征进行规范化操作,例如:StandardScaler(标准化)或MinMaxScaler(归一化)等)。 进行规范化后,有利于加速模型收敛,且可以避免某列特征由于值较大而被模型判断为具有较大权重。 建议你利用线性回归模型,对未规范化和规范化后的特征,分别建模,然后打印出拟合后的模型权重,看看每个特征权重的差别。
- §mc²ompleXWr2020-06-27为什么每次计算KNN和SVM分类器的准确率都是一样的?而朴素贝叶斯和决策树分类器每次计算的准确率都不一样呢?
作者回复: CART决策树如果不使用random_state参数指定随机数种子,则每次准确率将会不同。 即使分割器设置为“best”,每个分割中的特征也始终是随机排列的。 当max_features <n_features时,算法将在每个分割处随机选择max_features,然后再在其中找到最佳分割。 但即使max_features = n_features,找到的最佳分割也可能因不同的运行而有所不同。 就是这种情况,如果对于几个分割而言标准的改进是相同的,并且必须随机选择一个分割。