重生归来,我要成功 Python 高手--day30 利用knn算法实现手写数字识别
·
数据:
1.数据文件 train.csv 和 test.csv 包含从 0 到 9 的手绘数字的灰度图像。
2 每个图像高 28 像素,宽28 像素,共784个像素。
3 每个像素取值范围[0,255],取值越大意味着该像素颜色越深
4 训练数据集(train.csv)共785列。 第一列为 "标签",为该图片对应的手写数字。其余784列为该图像的像素值
5 训练集中的特征名称均有pixel前缀,后面的数字([0,783])代表了像素的序号
因为数据集的第一列为标签所有需要进行数据集的划分来获取特征和标签
x=df.iloc[:,1:] # 第一列往后的所有列 y=df.iloc[:,0] # 第零列为标签
模型划分时stratify=y参数,进行数据集划分的时候,避免测试集和训练集因为划分造成数据比例失衡,导致某些数据比例过高,影响模型的训练,,保证了测试集和训练集与原始数据集中数字的比例相同
import joblib 进行模型的保存
joblib.dump:第一个参数时要保存的模型,第二个参数时保存的路径
joblib.load:进行了模型的读取
图片的读取:img=plt.imread('路径')
在进行模型的使用的时候,因为原始模型使用的使用的维度为(1,784)
所有需要将验证的图片进行变形,将其转变为(1,784)以便进行识别
import matplotlib.pyplot as plt import pandas as pd from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler # 标准化 import joblib
# 以模型的方式实现
def model_show():
df = pd.read_csv(r'../../data/手写数字识别.csv', encoding='utf-8')
# 对数据集进行拆分,x为特征,y为标签
x=df.iloc[:,1:]
y=df.iloc[:,0]
# 对数据集进行划分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=21,stratify=y)
# 对数据进行标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
# 创建模型
model=KNeighborsClassifier(n_neighbors=3)
# 太久了
# # 创建超参数
# param_grid = {
# 'n_neighbors': [i for i in range(1, 11)]
# }
# # 模型的交叉验证和网格搜索
# model = GridSearchCV(model, param_grid, cv=4)
# 进行模型的训练
model.fit(x_train,y_train)
# # 获取最优
# print(f'最优评分{model.best_score_}')
# print(f'最优超参组合{model.best_params_}')
# print(f'最优估计器对象{model.best_estimator_}')
# 模型
y_pre=model.predict(x_test)
print(f"预测结果为:{y_pre}")
# 模型的准确率
print(f"准确率:{accuracy_score(y_test, y_pre)}")
#7.模型保存
joblib.dump(model,"../../model/手写数字识别案例.pkl") #pickle文件:python独有文件类型
print("模型保存成功")
# 模型的应用
def use_model():
# 读取图片
img=plt.imread('../../data/demo_2.png')
# 读取模型加载模型
model=joblib.load('../../model/手写数字识别案例.pkl')
#使用模型进行预测
# 这个图片是28*28的需要转变为1*784的
# 使用-1的原因是让他自己计算需要多少列
y_pred=model.predict(img.reshape(1,-1))
print(f'预测结果是{y_pred}')
if __name__ == '__main__':
# model_show()
use_model()更多推荐
所有评论(0)