计算机系统应用教程网站

网站首页 > 技术文章 正文

模型选择之交叉验证(简单交叉验证、S折交叉验证和留一交叉验证)

btikc 2024-10-11 11:21:32 技术文章 3 ℃ 0 评论

我们都知道,数据挖掘的最终目的是得到模型并且应用模型做一些分类和预测的事情,而且通过前面的学习,我们知道了评估模型指标(精确率、召回率、F1值等),但是会有这种情况,我们选择的训练集和测试集很好的拟合了模型,但是在实际应用中表现的却很差,这叫模型的过拟合现象(在测试集上表现很好,实际中表现很差),在这种情况下这个模型肯定是不能要的,那么有什么办法可以避免这种情况或者说尽量减少出现这种情况的概率呢?那就是今天要说的交叉验证。

交叉验证

如果说给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集、测试集和验证集。训练集用来训练模型,验证集用于模型的选择,而测试集用于对学习方法的评估。但是,在实际应用中,数据往往是不足的,在这种情况下,我们为了更好的选择模型,可以采用交叉验证方法,交叉验证的基本思想就是重复地使用数据,把给定的数据进行切分,将切分的数据组合为训练集合测试集,并在此基础上反复地进行训练、测试以及模型选择。

  • 简单交叉验证

简单交叉验证的方法是:首先随机地将已给数据集分为训练集和测试集,然后用训练集在各种条件下训练模型,从而得到不同的模型,在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

  • S折交叉验证

其实应用最多的是S折交叉验证(S-fold cross validation),首先随机地将已给数据切分为S个互不相交的子集,然后利用S-1个子集的数据训练模型,剩下的一份用来测试模型,将这一过程对可能的S种选择重复的进行,最后评选出S此评测中平均测试误差最小的模型。如下图表示:

  • 留一交叉验证

S折交叉验证的特殊情形是S=N,往往在数据缺乏的情况下使用,这里N是给定数据的容量。这里举个例子说明,如果给定样本只有100条,那么就将数据分成100份,每次只留下一条数据做测试,其他样本做训练。可以说留一法是样本利用率最高,计算最繁琐的方法,适合小样本数据。

sklearn.model_selection.KFold(s折交叉验证实现方法)

KFold这个类提供可以将样本数据集划分为指定的份数,实例化这个类只需要传3个参数,且这3个参数都是可选参数,参数n_splits表示需要划分的份数,默认为3份,shuffle表示在划分之前是否进行洗牌操作,random_state如果为整数,则指定了随机数生成器的种子,如果为randomstate实例,则指定了随机数生成器,如果为none则使用默认的随机数生成器。

主要方法介绍如下:

  • get_n_splits([X,y,groups]),返回的是实例化KFold类时指定的n_splits值。
  • split(X[,y,groups]):x为训练数据集,y为标记信息,它切分数据集为训练集和测试集。

下面我们就用代码演示上面的方法,并实现将数据集划分为4份。

import pandas as pd
import numpy as np
#从模型选择这个包导入KFold这个类
from sklearn.model_selection import KFold
#从本地用pandas读取样本数据
data=pd.read_csv("creditcard.csv")
columns=['V1','V2','V3','V4','Class']
data=data[columns]
#实例化KFold类,将样本数据划分为4份
kf = KFold(n_splits=4)
kf.get_n_splits()
#将data样本数据划分为train/test数据集
for train,test in kf.split(data):
 print("训练数据为:",train.shape)
 print("测试数据为:",test.shape)
 print("===============")

以上就是用KFold中的split方法将样本数据按指定的份数划分为训练集和测试集,划分之后便可以将train和test传入训练函数中进行模型训练,并计算出每个迭代的模型指标,最后求各迭代的平均指标即可。除此之外,关于模型选择,还有一个cross_val_score,我们下篇文章中讲解。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表