一 KNN算法: K-近邻算法(K Nearest Neighbor,简称KNN),比如根据你的’邻居’你的类别.
KNN算法思想:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这一个类别.
二 交叉验证:是一种数据集的分割方式,将训练集划分为n份,拿一份做验证集,其他做训练集,交叉验证是划分数据集的一种方法,目的就是为了得到更加准确可行的模型评分.
三 网格搜索:是模型调参的有利工具
为什么需要网格搜索?
-
模型有很多超参数,其他能力也存在很大的差异,需要手动产生很多超参数组合,来训练模型.
-
每组超参数都采用交叉验证评估,最后选出最优参数组合建立模型.
利用KNN算法实现手写数字识别
已知数据:
1.MI=NIST手写数字
2.1999年发布,成为分类算法基准测试的标准
3.MNIST仍然是研究人员和学习者的可靠资源
需求:
从数万个手写图像的数据集中正确识别数字
数据介绍:
1.数据文件是包含从0到9的手绘数字的灰度图像
2.每个图像高28像素,宽28像素,共784个像素
3.每个像素取值范围[0,255], 取值越大意味着颜色越深
4.训练数据集共785行
第一列为'标签', 为该图片对应的手写数字,其余为该图像的像素值,
5.训练集中的特征名称均为pixel前缀,后面代表像素的符号
训练模型, 程序效果
# 4.编写KNN代码手写数字识别
# 导包
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
import joblib
from collections import Counter
from sklearn.metrics import accuracy_score
# 加载数据
data = pd.read_csv('./手写数字识别.csv')
# 读取数据
x = data.iloc[:, 1:]
y = data.iloc[:, 0]
# 显示指定的图片 #data 修改为ndarray类型
# data =x.iloc[44].values
# 展示数据
# data_ = data.reshape(28, 28)
# plt.imshow(data_, cmap='gray')
# plt.imsave('demo.png', data_)
# plt.show()
# 数据预处理 归一化
x = x / 255.
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y, random_state=22)
# 模型训练
model = KNeighborsClassifier(n_neighbors=5)
model.fit(x_train, y_train)
# 模型预测
y_predict = model.predict(x_test)
print(y_predict)
# 模型评估
print(model.score(x_test, y_test))
print(accuracy_score(y_predict, y_test))
# 模型保存
joblib.dump(model, './knn_model.pkl')
# 模型加载
knn = joblib.load('knn_model.pkl')
img = plt.imread('./demo.png')
plt.imshow(img, cmap='gray')
plt.show()
y_pred = knn.predict(img.reshape(1, -1))
print(y_pred)
效果如下:
这里写自定义目录标题