Python中sklearn实现交叉验证示例分析

 更新时间:2023年08月19日 10:23:34   作者:嵌入式技术  
这篇文章主要介绍了Python中sklearn实现交叉验证,本文python的版本为3.8,各个版本之间函数名字略有不同,但是原理都是一样的,集成开发环境使用的是Anaconda的Spyder,需要的朋友可以参考下

Python中sklearn实现交叉验证

一、概述

1.1 交叉验证的含义与作用

交叉验证的思想是,将数据集分为k等份,其中k-1份作为训练集,单独留出的一份作为测试集。进行模型验证的目的就是为了确定最合适的模型,对于监督学习而言,为了使得创建的模型具有很好的泛化能力,通常需要将得到的数据预留出测试数据进行交叉验证。因此,交叉验证的目的主要为了解决建立模型的过拟合问题。交叉验证的具体过程为,将所有数据分为训练集与测试集两部分,采用训练集对模型进行训练。采用测试准确度指标,对得到的模型用测试集来衡量模型的预测能力。

1.2 交叉验证的分类

1、k折交叉验证(KFold),将数据集划分为k等份,使用python的sklearn.model_selection库中的KFold方法实现。
2、p次k折交叉验证(RepeatedKFold),在实际应用中,只进行以此k折交叉验证往往不够,需要进行多次交叉验证,使用python的sklearn.model_selection库中RepeatedKFold方法实现。
3、留一法(LeaveOneOut),是对整个数据集每次选取一个样本作为验证集,其余样本作为训练集。它是k折交叉验证的一种特殊情况,即k=n(n为数据集的个数)的情况,使用python的sklearn.model_selection库中的LeaveOneOut方法实现。
4、留p法(LeavePOut),原理与留一法一样,只不过是对整个数据集每次选取p个样本作为验证集,其余样本作为训练集。它使用python的sklearn.model_selection库中的LeavePOut方法实现。
5、随机分配(ShuffleSplit),随机把数据打乱,然后划分训练集与测试集,使用python的sklearn.model_selection库中的ShuffleSplit方法实现。
另外,针对某些特殊情况,通常采用特殊的交叉验证方法:
1、对于分类数据,预测目标可能是不均匀分配的,比如抽烟的烟得肺癌的比率彼不抽的人大,这种情况的数据划分通常采用StratifiedKFold、StratifiedShuffleSplit方法。
2、对于分组数据来说,它的划分方法是不一样的,主要的方法有 GroupKFold,LeaveOneGroupOut,LeavePGroupOut,GroupShuffleSplit。
3、对于时间关联的数据,方法有TimeSeriesSplit。

二、交叉验证实例分析

本文python的版本为3.8,各个版本之间函数名字略有不同,但是原理都是一样的,集成开发环境使用的是Anaconda的Spyder,以下程序都是经过编译后,顺利执行的,读者如果有什么疑问,可以留言。

2.1 留一法实例

留一法的python源代码如下所示:

from sklearn.datasets import load_iris  #导入鸢尾花数据库
#下面语句导入留一法LeaveOneOut,交叉验证评价指标cross_val_score评价指标
from sklearn.model_selection import LeaveOneOut, cross_val_score
#下面语句导入逻辑斯特回归LogisticRegression
from sklearn.linear_model import LogisticRegression
iris = load_iris()	#将鸢尾花数据库中的数据放入iris变量中
print('Iris labels:\n{}'.format(iris.target))	#输出鸢尾花的目标分类,共有三种分别表示为0,1,2
logreg = LogisticRegression()	#逻辑斯特回归对象logreg
loout = LeaveOneOut()	#留一法对象loout
#下面的语句计算评价指标并输出到scores对象,采用cress_val_score方法,
#方法参数含义为,采用逻辑斯特回归方法logreg拟合数据:iris.data,iris.target,
#交叉验证的方法为留一法loout
scores = cross_val_score(logreg,iris.data,iris.target,cv=loout)
#下面语句输出每个样本的拟合评价结果
print("leave-one-out cross validation scores:{}".format(scores))
#下面语句输出整体评价结果,即所有样本的评价结果平均值
print("Mean score of leave-one-out cross validation:{:.2f}".format(scores.mean()))

输出结果如下图所示:

在这里插入图片描述

2.2 留p法实例

留p法的python源代码如下所示:

#导入训练集数据划分方法库train_test_split、留p法库LevePOut
from sklearn.model_selection import train_test_split, LeavePOut
from sklearn import datasets	#导入数据集
from sklearn import svm			#导入支持向量机svm
from sklearn.metrics import accuracy_score	#导入评价指标库
import numpy as np	#导入数学分析库
iris = datasets.load_iris()		#将鸢尾花数数据放入iris变量中
clf_svc = svm.SVC(kernel='linear')	#线性核函数svm模型对象为clf_svc
lpo = LeavePOut(p=3)				#留p法对象lpo
lpo.get_n_splits(iris.data)		#对鸢尾花数据进行划分
mean_accuracy_score_list = []
for train_index, test_index in lpo.split(iris.data):
	clf_svc.fit(iris.data[train_index], iris.target[train_index])
	prediction = clf_svc.predict(iris.data[test_index])
	mean_accuracy_score_list.append(accuracy_score(iris.target[test_index],prediction))
print(np.average(mean_accuracy_score_list))

输出结果如下图所示:

在这里插入图片描述

2.3 k折交叉验证(Standard Cross Validation)实例

在python语言中,该方法需要通过 train_test_split 方法对数据集进行划分,然后再不同的数据集上进行训练、测试评估,进而得到评价结果。k通常取5或者10,如果取10,则表示再原始数据集上,进行10次划分,每次划分都进行以此训练、评估,对5次划分结果求取平均值作为最终的评价结果。10折交叉验证的原理图如下所示:

在这里插入图片描述

这里以python自带的乳腺癌数据为分析对象,采用k折交叉验证分析拟合模型的准确性,k折交叉验证的python源代码如下所示:

#以下几行代码,例行公事,载入需要的库函数
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
cancer = load_breast_cancer()
logreg = LogisticRegression()
#以下指令中的cross_val_score自动对乳腺癌数据进行k折交叉验证,
#注意:cross_val_score的参数cv没有设置,默认是3,可以修改cv为5或10,
#则该方法则成为5或10折交叉验证
scores = cross_val_score(logreg,cancer.data,cancer.target)
#打印分析结果,由于默认cv为3,即3折交叉验证,所以第一个输出为三个指标值
print("Cross validation scores:{}".format(scores))
print("Mean cross validation score:{:2f}".format(scores.mean()))

输出结果如下图所示:

在这里插入图片描述

2.4 随机分配交叉验证(Shuffle-split cross-validation)实例

使用ShuffleSplit方法,可以随机的把数据打乱,然后分为训练集和测试集。随机分配交叉验证的python源代码如下所示:

from sklearn.datasets import load_iris
from sklearn.model_selection import ShuffleSplit,cross_val_score
from sklearn.linear_model import LogisticRegression
iris = load_iris()
shufspl = ShuffleSplit(train_size=.5,test_size=.4,n_splits=8) #迭代8次;
logreg = LogisticRegression()
scores = cross_val_score(logreg,iris.data,iris.target,cv=shufspl)
print("shuffle split cross validation scores:\n{}".format(scores))
print("Mean score of shuffle split cross validation:{:.2f}".format(scores.mean()))

输出结果如下图所示:

在这里插入图片描述

2.5 分层交叉验证(Stratified k-fold cross validation)实例

分层交叉验证(Stratified k-fold cross validation):首先它属于交叉验证类型,分层的意思是说在每一折中都保持着原始数据中各个类别的比例关系,比如说:原始数据有3类,比例为1:2:1,采用3折分层交叉验证,那么划分的3折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。通常情况下,可以设置cv参数来控制几折,但是我们希望对其划分等加以控制,所以出现了KFold,KFold控制划分折,可以控制划分折的数目,是否打乱顺序等,可以赋值给cv,用来控制划分。分层交叉验证的python源代码如下所示:

from sklearn.datasets import load_iris
from sklearn.model_selection import ShuffleSplit,cross_val_score
from sklearn.linear_model import LogisticRegression
iris = load_iris()
shufspl = ShuffleSplit(train_size=.5,test_size=.4,n_splits=8) #迭代8次;
logreg = LogisticRegression()
scores = cross_val_score(logreg,iris.data,iris.target,cv=shufspl)
print("shuffle split cross validation scores:\n{}".format(scores))
print("Mean score of shuffle split cross validation:{:.2f}".format(scores.mean()))

输出结果如下图所示:

在这里插入图片描述

到此这篇关于Python中sklearn实现交叉验证的文章就介绍到这了,更多相关Python sklearn交叉验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3实现elasticsearch批量更新数据

    python3实现elasticsearch批量更新数据

    今天小编就为大家分享一篇python3实现elasticsearch批量更新数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python collections模块示例详解

    python collections模块示例详解

    Python的collections模块是其标准库中的一部分,包含了一些扩展内置数据类型的有用数据结构,如OrderedDict、defaultdict、Counter、deque和namedtuple等,这些数据结构在不同场景下都非常有用,能提供更高效的数据操作和方便的数据访问方式,有助于提升代码的性能和可读性
    2024-10-10
  • python中lambda匿名函数详解

    python中lambda匿名函数详解

    大家好,本篇文章主要讲的是python中lambda匿名函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Python3数据库操作包pymysql的操作方法

    Python3数据库操作包pymysql的操作方法

    这篇文章主要介绍了Python3数据库操作包pymysql的操作方法,文章通过实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • python 读写txt文件 json文件的实现方法

    python 读写txt文件 json文件的实现方法

    下面小编就为大家带来一篇python 读写、创建 文件的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 使用python编写批量卸载手机中安装的android应用脚本

    使用python编写批量卸载手机中安装的android应用脚本

    该脚本的功能是卸载android手机中安装的所有第三方应用,主要是使用adb shell pm、adb uninstall 命令,需要的朋友可以参考下
    2014-07-07
  • Python-copy()与deepcopy()区别详解

    Python-copy()与deepcopy()区别详解

    这篇文章主要介绍了Python-copy()与deepcopy()区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python中的decimal类型转换实例详解

    python中的decimal类型转换实例详解

    decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算。这篇文章主要介绍了python里的decimal类型转换,需要的朋友可以参考下
    2019-06-06
  • 自定义Django Form中choicefield下拉菜单选取数据库内容实例

    自定义Django Form中choicefield下拉菜单选取数据库内容实例

    这篇文章主要介绍了自定义Django Form中choicefield下拉菜单选取数据库内容实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 基于Python的人脸检测与分类过程详解

    基于Python的人脸检测与分类过程详解

    这篇文章主要介绍了基于Python的人脸检测与分类,算法分为两个部分识别人脸位置和确定人脸分类,由于这两项工作截然相反,所以我们使用了两个网络分别完成,详细过程跟随小编一起看看吧
    2022-05-05

最新评论