机器学习day03

超参数选择方法--交叉验证、网格搜索、手写数字识别案例

1交叉验证

1.1 什么是交叉验证?

是一种数据集的分割方法,将训练集划分为 n份,拿一份做验证集 (测试集)、其他n-1份做训练集

1.2交叉验证法原理:将数据集划分为 cv=4
  1. 第一次:把第一份数据做验证集,其他数据做训练

  2. 第二次:把第二份数据做验证集,其他数据做训练

  3. ... 以此类推,总共训练4次,评估4次。

  4. 使用训练集+验证集多次评估模型,取平均值做交叉验证为模型得分

  5. 若k=5模型得分最好,再使用全部训练集(训练集+验证集) 对k=5模型再训练 一边,再使用测试集对k=5模型做评估

交叉验证法,是划分数据集的一种方法,目的就是为了得到更加准确可信的模型评分。

2.网格搜索

2.1为什么需要网格搜索?
  • 模型有很多超参数,其能力也存在很大的差异。需要手动产生很多超参数组合,来训练模型

  • 每组超参数都采用交叉验证评估,最后选出最优参数组合建立模型。

网格搜索是模型调参的有力工具。寻找最优超参数的工具! 只需要将若干参数传递给网格搜索对象,它自动帮我们完成不同超参数的组合、模型训练、模型评估, 最终返回一组最优的超参数。

网格搜索 + 交叉验证的强力组合 (模型选择和调优)

  • 交叉验证解决模型的数据输入问题(数据集划分)得到更可靠的模型

  • 网格搜索解决超参数的组合

  • 两个组合再一起形成一个模型参数调优的解决方案

3.交叉验证网格搜索 – API和应用举例

3.1交叉验证网格搜索API介绍
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv= None)
对估计器的指定参数值进行详尽的搜索
estimator:估计对象
param_grid:估计器参数(dict){"n_neighbors":[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率
结果分析:
    bestscore_:在交叉验证中的最好结果
    bestestimator:最好的参数模型
    cvresults:每次交叉验证后的验证集准确结果和训练集准确率结果

4.案例

4.1利用KNN算法对鸢尾花分类 – 交叉验证网格搜索
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
----------------------------------
@Project :pythonclass 
@File    :cv_iris_05.py
@IDE     :PyCharm 
@Author  :chizhayuehaiyuyumao
@Date    :2024/6/19 11:15 
----------------------------------
    Deos TODO 鸢尾花案例,补充超参调优
    # todo 1.导包
    # todo 2.加载数据集
    # todo 3.数据基本处理
    # todo 3.1 划分数据集并
    # todo 3.2 划分数据集并
    # todo 4.实例化模型
    # todo 5.超参调优
    # todo 6.模型预测
----------------------------------
'''
# todo 1.导包
​
from sklearn.neighbors import KNeighborsClassifier  # 导入knn分类算法
from sklearn.datasets import load_iris  # 导入鸢尾花数据集
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split,GridSearchCV
​
# todo 2.加载数据集
iris_data = load_iris()
print(iris_data.DESCR)
​
# todo 3.数据基本处理
x = iris_data.data
y = iris_data.target
# todo 3.1划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)
​
# todo 3.2 数据预处理(标准化)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)  # 为什么不用fit 是因为可以直接使用已经拟合好的函数
​
# todo 4.实例化模型
estimator = KNeighborsClassifier()
​
# todo 5.超参调优
estimator = GridSearchCV(estimator, param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, cv=5)
estimator.fit(x_train, y_train)
​
print(f'最佳参数:{estimator.best_params_}')
print(f'最佳分数:{estimator.best_score_}')
print(f'最佳模型:{estimator.best_estimator_}')
​
# todo 6.模型预测
estimator = estimator.best_estimator_
score = estimator.score(x_test, y_test)
print(f'准确率:{score}')
4.2利用KNN算法实现手写数字识别

已知数据

  • MNIST手写数字识别

  • 1999年发布,成为分类算法基准测试的基础

  • MNIST仍然是研究人员和学习者的可靠资源

需求:

  • 从数万个手写图像的数据集中正确识别数字

数据介绍:

  1. 数据文件 train.csv 和 test.csv 包含从 0 到 9 的手绘数字的灰度图像。

  2. 每个图像高 28 像素,宽28 像素,共784个像素。

  3. 每个像素取值范围[0,255],取值越大意味着该像素颜色越深

  4. 训练数据集(train.csv)共785列。 第一列为 "标签",为该图片对应的手写数字。其余784列为该图像的像素值

  5. 训练集中的特征名称均有pixel前缀,后面的数字([0,783])代表了像素的序号。

图片处理:

from PIL import Image, ImageOps
import numpy as np
​
​
def process_image(input_path, output_path):
    # 1. 加载图像
    image = Image.open(input_path)
​
    # 2. 转换为灰度图像
    gray_image = image.convert("L")
​
    # 3. 二值化处理
    threshold = 128
    binary_image = gray_image.point(lambda p: p > threshold and 255)
​
    # 4. 调整尺寸到28x28像素
    resized_image = binary_image.resize((28, 28), Image.LANCZOS)
​
    # 5. 转换为黑底白字
    inverted_image = ImageOps.invert(resized_image)
​
    # 6. 保存处理后的图像
    inverted_image.save(output_path)
    inverted_image.show()
​
​
# 示例调用
input_image_path = r"D:\pycharm\pythonclass\jiqixuexi\first\pythonProject2\data\test_9.png"
output_image_path = r"D:\pycharm\pythonclass\jiqixuexi\first\pythonProject2\data\picture_out\test_new.png"
process_image(input_image_path, output_image_path)

训练模型:

def knn_train():
    # todo 2.加载数据集并查看
    data = pd.read_csv(r'D:\pycharm\pythonclass\jiqixuexi\first\pythonProject2\data\手写数字识别.csv')
    # print(data.head(5))
​
    # todo 3.数据基本处理
    # todo 3.1归一化
    scaler = MinMaxScaler()
    x = scaler.fit_transform(data.iloc[:, 1:])
    y = data.iloc[:,0]
​
    # todo 3.2 划分数据集
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=20)
​
    # todo 4.实例化模型
    estimator = KNeighborsClassifier()
    # todo 5.超参调优
    param = {'n_neighbors':range(3,10,2)}
    estimator = GridSearchCV(estimator,param_grid=param,cv=5)
    estimator.fit(x_train,y_train)
​
    # todo 6.模型预测
    estimator = estimator.best_estimator_
    score = estimator.score(x_test,y_test)
    print(f'准确率:{score}')
​
    # todo 7.模型保存
    joblib.dump(estimator,r'D:\pycharm\pythonclass\jiqixuexi\first\pythonProject2\data\knn_digit.pth')
if __name__ == '__main__':
    knn_train()

结果预测:

def knn_predict():
    # todo 1.加载图片
    img = plt.imread(r'D:\pycharm\pythonclass\jiqixuexi\first\pythonProject2\data\picture_out\test_new.png')
​
    # todo 2.图片转换成矩阵
    img = img.reshape(1,-1)
​
    # todo 3.加载模型
    estimator = joblib.load(r'D:\pycharm\pythonclass\jiqixuexi\first\pythonProject2\data\knn_digit.pth')
​
    # todo 4.预测图片
    y_pre =  estimator.predict(img)
    print(f'预测结果:{y_pre}')
​
if __name__ == '__main__':
    knn_predict()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值