KNN算法实践Day3

利用KNN算法实现手写数字识别

一、数据准备

        数据来源基于kaggle的Digit Recognizer.一个带有标签的train.csv数据,一个不带标签的test.scv数据。

​
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import joblib
from collections import Counter


def show_digit(idx):
    # 1 加载数据
    data = pd.read_csv('train.csv')
    if idx < 0 or idx >= len(data):  # 使用 >= 而不是 > 来处理边界情况
        return
    #将标签与像素特征分开,使用DataFrame格式
    x = data.iloc[:, 1:]
    y = data.iloc[:, 0]
    print('数据基本信息:', x.shape)
    print('类别数据比例:', Counter(y))
    print('当前数字的标签为:', y[idx])

    # 3 显示指定的图片
    data_ = x.iloc[idx].values
    # print(data_ )
    # 确保 data_ 是一维数组,并且长度为784
    if len(data_) != 784:
        print("错误:data_ 数组长度不是 784,可能是 CSV 文件格式问题或缺失值。")
        return

    # 将数据形状修改为 28*28
    data_ = data_.reshape(28, 28)

    # 关闭坐标轴标签
    plt.axis('off')

    # 显示图像
    plt.imshow(data_, cmap='gray')
    plt.show()

​

二、归一化处理和数据划分

#归一化处理
x = train_data.iloc[:,1:]/255
y = train_data.iloc[:,0]
#划分训练集和测试集
split_data = train_test_split(x, y, test_size=0.2, stratify=y, random_state=0)
x_train, x_test, y_train, y_test = split_data

三、模型训练

#模型训练
estimator = KNeighborsClassifier(n_neighbors=3) #设置k=3
estimator.fit(x_train, y_train)

四、模型评估

acc = estimator.score(x_test, y_test)
print('测试集准确率: %.2f' % acc)

五、模型保存

joblib.dump(estimator, 'model/knn.pth')

六、模型测试,程序效果

def test_model():
    # 1 读取图片数据(由于没有图片,所以使用kaggle数据集中的test.scv数据进行测试)
    test_data = pd.read_csv('test.csv ')
    x_test = test_data.iloc[:, 0:]
    test_x = x_test.iloc[0].values
    data_ = test_x.reshape(28, 28)
    # 关闭坐标轴标签
    plt.axis('off')
    # 显示图像
    plt.imshow(data_, cmap='gray')
    plt.show()

    test_x = [test_x.tolist()] #由DataFrame数据格式转化为numpy矩阵形式,并转化为二维矩阵
    # 2 加载模型
    knn = joblib.load('model/knn.pth')
    # # 3 预测图片
    y_pred = knn.predict(test_x )
    print('您绘制的数字是:', y_pred)
test_model()

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值