Mnist数据集KNN分类

Mnist数据集KNN分类

  • Mnist数据集KNN分类
    • KNN分类算法
    • python代码实现

Mnist数据集KNN分类

将测试点最近的k个训练样本的标签中最多的一个作为测试样点的标签。

KNN分类算法

1.进行训练集和测试集的采样。
2.遍历测试集中每一个测试点,将测试点最近的k个训练样本的标签中最多的一个作为测试样点的标签。

python代码实现

from __future__ import print_function
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
# 读取MNIST数据集
mnist = datasets.load_digits()
X = np.array(mnist.data)
Y = mnist.target
print(X.shape)
print(Y.shape)
'''
(1797, 64)
(1797,)
'''
#将数据划分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.30)  

from sklearn.metrics import classification_report, confusion_matrix
#生成classifier分类器,neighbors设置为7
classifier = KNeighborsClassifier(n_neighbors=7)  
#训练分类器
classifier.fit(X_train, Y_train) 
#用训练得到的分类器去测试训练集的数据,用confusion_matrix来反映预测结果
Y_pred1 = classifier.predict(X_train)
print(confusion_matrix(Y_train, Y_pred1))  
print(classification_report(Y_train, Y_pred1))
'''
[[133   0   0   0   0   0   0   0   0   0]
 [  0 121   0   0   0   0   0   0   0   0]
 [  0   0 125   0   0   0   0   1   0   0]
 [  0   0   0 128   0   0   0   1   0   0]
 [  0   0   0   0 123   0   0   0   1   0]
 [  0   0   0   0   0 122   1   0   0   0]
 [  0   0   0   0   0   0 136   0   0   0]
 [  0   0   0   0   0   0   0 128   0   0]
 [  0   3   0   1   0   0   0   0 119   0]
 [  0   1   0   1   0   1   0   0   0 111]]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00       133
           1       0.97      1.00      0.98       121
           2       1.00      0.99      1.00       126
           3       0.98      0.99      0.99       129
           4       1.00      0.99      1.00       124
           5       0.99      0.99      0.99       123
           6       0.99      1.00      1.00       136
           7       0.98      1.00      0.99       128
           8       0.99      0.97      0.98       123
           9       1.00      0.97      0.99       114

    accuracy                           0.99      1257
   macro avg       0.99      0.99      0.99      1257
weighted avg       0.99      0.99      0.99      1257

'''
#用训练得到的分类器去测试训练集的数据,用confusion_matrix来反映预测结果
Y_pred = classifier.predict(X_test)
print(confusion_matrix(Y_test, Y_pred))  
print(classification_report(Y_test, Y_pred))
'''
[[45  0  0  0  0  0  0  0  0  0]
 [ 0 60  0  0  0  0  1  0  0  0]
 [ 0  0 51  0  0  0  0  0  0  0]
 [ 0  0  0 53  0  0  0  1  0  0]
 [ 0  0  0  0 55  0  0  1  1  0]
 [ 0  0  0  0  0 58  0  0  0  1]
 [ 0  0  0  0  0  0 45  0  0  0]
 [ 0  0  0  0  0  0  0 51  0  0]
 [ 0  5  1  1  0  0  0  1 43  0]
 [ 0  0  0  0  0  0  0  0  2 64]]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        45
           1       0.92      0.98      0.95        61
           2       0.98      1.00      0.99        51
           3       0.98      0.98      0.98        54
           4       1.00      0.96      0.98        57
           5       1.00      0.98      0.99        59
           6       0.98      1.00      0.99        45
           7       0.94      1.00      0.97        51
           8       0.93      0.84      0.89        51
           9       0.98      0.97      0.98        66

    accuracy                           0.97       540
   macro avg       0.97      0.97      0.97       540
weighted avg       0.97      0.97      0.97       540
'''
#探究预测误差与neighbors值大小的关系
error = []
for i in range(3, 21):  
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train, Y_train)
    pred_i = knn.predict(X_test)
    error.append(np.mean(pred_i != Y_test))
plt.plot(range(3, 21), error, color='red', linestyle='dashed', marker='o',  
         markerfacecolor='blue', markersize=10)
plt.title('Error Rate K Value')  
plt.xlabel('K Value')  
plt.ylabel('Mean Erro')
plt.show()

Mnist数据集KNN分类_第1张图片

你可能感兴趣的:(python,机器学习,数据挖掘)