4.1 模型训练技巧

模型训练技巧

k-折交叉验证

1:k-fold
将样例划分为K份,若K=样例数,即为留一交叉验证,K-1份作为训练。
2:Stratified k-fold 分层交叉验证
StratifiedKFold()这个函数较常用,比KFold的优势在于将k折数据按照百分比划分数据集,每个类别百分比在训练集和测试集中都是一样,这样能保证不会有某个类别的数据在训练集中而测试集中没有这种情况,同样不会在训练集中没有全在测试集中,这样会导致结果糟糕透顶。

## 加载包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
## 图像在jupyter notebook中显示
%matplotlib inline
## 显示的图片格式(mac中的高清格式),还可以设置为"bmp"等格式
%config InlineBackend.figure_format = "retina"
## 输出图显示中文
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = "D:\Desktop\python在机器学习中的应用\旗黑55扩B6字.ttf",size=14)

from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
## 忽略提醒
import warnings
warnings.filterwarnings("ignore")
## 读取鸢尾花数据集
Iris = load_iris()
Iris.data.shape
Iris.target #目标输出

将数据集切分为k个于集,每次采用其中的一个子集用于模型的测试集,余下的k-1个自己用于模型训练,这个过程重复k次,做种将k次测试集的测试结果的均值作为模型的效果评价。k常取10,10折交叉验证
在这里插入图片描述

1.随机不放回抽样

即随机地将数据集分为k份,每份没有重复的样本

##  k-折交叉验证
## 1:使用k-fold对Iris数据集分类
from sklearn.model_selection import KFold
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
Irkf = KFold(n_splits=10,random_state=42) #random_state参数,设置随机生成器种子。n_splits参数切分子集个数
## 使用 线性判别 分析算法进行数据分类
LDA_clf = LinearDiscriminantAnalysis(n_components=2) #n_components表示希望保留的方差比率
scores = []
for ii,(train_index, test_index) in enumerate(Irkf.split(Iris.data)):
    ## 训练模型
    LDA_clf.fit(Iris.data[train_index],Iris.target[train_index])
    ## 测试模型效果
    prey = LDA_clf.predict(Iris.data[test_index])
    acc = metrics.accuracy_score(Iris.target[test_index],prey)
    print("Fold:",ii+1,"Acc:",np.round(acc,4))
    scores.append(acc)
## 计算准确率的平均值
print("平均Acc:",np.round(np.mean(scores),4))

在这里插入图片描述
通过使用10折交叉验证的最终预测精度为0.9667
省略上行代码段可用下面代替

## 同时sklearn还提供了cross_val_score函数直接计算平均得分
from sklearn.model_selection import cross_val_score
scores = cross_val_score(estimator=LDA_clf,cv=10,
                         X=Iris.data,y = Iris.target,
                         n_jobs = 4)
print("10折交叉验证的Acc:\n",scores)
print("平均Acc:",np.round(np.mean(scores),4))

在这里插入图片描述

2.分层抽样

即按照匪类数据百分比划分数据及,使每个类别百分比在训练集合测试集中都一样

## 2:Stratified k-fold 分层交叉验证
from sklearn.model_selection import StratifiedKFold
Skf_ir = StratifiedKFold(n_splits=3,random_state=2)
scores = []
## 使用Skf_ir.split()时需要同时提供X和Y
for ii,(train_index, test_index) in enumerate(Skf_ir.split(Iris.data,Iris.target)):
    ## 训练模型
    LDA_clf.fit(Iris.data[train_index],Iris.target[train_index])
    ## 测试模型效果
    prey = LDA_clf.predict(Iris.data[test_index])
    acc = metrics.accuracy_score(Iris.target[test_index],prey)
    print("每个测试集的类别比例:\n",pd.value_counts(Iris.target[test_index]))
    scores.append(acc)
## 计算准确率的平均值
print("平均Acc:",np.mean(scores))

在这里插入图片描述

参数网格搜索

使用网格搜索为模型寻找更优的参数。结合K近邻判别分析介绍如何使用参数网格搜素方法,找到更优的参数

## 参数网格搜索
## 切分数据集
train_x,test_x,train_y,test_y = train_test_split(Iris.data,Iris.target,
                                                 test_size = 0.25,random_state = 42)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
## 定义模型流程
pipe_KNN = Pipeline([("scale",StandardScaler()),
                    ("KNN",KNeighborsClassifier())])
## 定义需要搜索的参数
n_neighbors = np.arange(1,10)
para_grid = [{"scale__with_mean":[True,False],
#               "scale__with_std":[True,False],
              "KNN__n_neighbors" : n_neighbors}]

## 应用到数据上
gs_KNN_ir = GridSearchCV(estimator=pipe_KNN,param_grid=para_grid,
                         cv=10,n_jobs=4)
gs_KNN_ir.fit(train_x,train_y)
## 输出最优的参数
gs_KNN_ir.best_params_

在这里插入图片描述

在这里插入图片描述
使用*best_estimator_*获取最好的模型并保存,保存后直接用于测试集的预测,不需要重新训练

## 获取最好的模型
Iris_clf = gs_KNN_ir.best_estimator_
## 用来预测
prey = Iris_clf.predict(test_x)
print("Acc:",'{:.2%}'.format(metrics.accuracy_score(test_y,prey)))

在这里插入图片描述

正确率100%,所有样本都能预测正确

训练集、验证集、测试集的引入

引入验证集防止模型过拟合,将数据集分为训练集、验证集(验证模型效果,帮助模型优化)、测试集(测试模型的泛化能力,避免模型过拟合)
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
idesigner4.1 是一款功能强大的设计软件。该软件具有多项设计功能,可以用于创建各种平面设计、网页设计、UI设计等。它具有简单易用的界面,使得用户能够迅速上手并进行设计。 首先,idesigner4.1 提供了大量的设计工具和功能,例如矢量绘图工具、图层管理、色彩管理等。用户可以利用这些工具绘制复杂的图形、编辑和处理照片,使设计作品更加精美和专业。 其次,该软件具有丰富的设计模板和素材库,用户可以根据自己的需求选择合适的模板或素材进行设计。这些模板和素材不仅可以提供创意灵感,还可以节省设计时间,提高工作效率。 此外,idesigner4.1 还支持多种格式的输出和导出。用户可以将设计作品保存为常见的图片格式,如PNG、JPEG等,方便用于打印、发布或在网上展示。同时,该软件还支持与其他设计软件的兼容,可以方便地与其他设计工具进行文件的导入和导出。 最后,idesigner4.1 还具备一定的学习和交流功能。用户可以通过在线教程学习软件的使用技巧和设计思路,还可以与其他用户交流和分享设计作品,进一步提升自己的设计水平。 总的来说,idesigner4.1 是一款功能全面、操作简单的设计软件,适用于各类设计师和爱好者。它能够满足用户的设计需求,提高设计的效率和质量,是一款值得推荐和使用的软件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桃子技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值