首页 > 其他分享 >关于交叉验证的一些介绍

关于交叉验证的一些介绍

时间:2024-09-09 18:53:21浏览次数:12  
标签:iris 交叉 验证 介绍 scores import sklearn

在这篇文章中,我将介绍“交叉验证”这一评估泛化性能的统计学方法,它比起单次划分训练集与测试集的方法更稳定与全面。首先我会简单介绍它的概念,然后是分层k折交叉验证和其他策略,最后是一些代码实现。

一、 概念

交叉验证(k-fold cross-validation),是指将数据集进行多次划分,分为几个互斥的子集来进行模型的训练与验证。其中k是用户指定的数字,通常取5或10。

在进行5次的交叉验证时,我们首先将数据大致划分为均等的5份,其中每一份都叫一折,然后先用第一折作为测试集,其余折作为训练集来训练模型,然后当这一次的训练完后在1折上评估精度,再之后便构建另一模型,此时就用第二折作为测试集,其余来作为训练集,重复方才的操作,完成后剩下的3、4、5折都与刚才的1、2折进行一样的行为。因为每一次用不同的折作为测试集时都要计算精度,所以在完成后我们会得到5个精度值。

(这里我用我自学的书籍之一的《Introduction to Machine Learning with Python》中的图像来展示交叉验证中的数据划分)

二、 分层k折交叉验证和其他策略

2.1 分层k折交叉验证

如果当数据集有些特殊时,我们直接使用交叉验证并非一个好的选择,事实胜于雄辩,看下面这个例子:

iris labels:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

在这个数据集中我们发现其前三分之一是类别0,中间三分之一是1,最后三分之一是类别2,那么当我们进行交叉验证时,就会发现我们选取的第一折中将全是类别0的存在,至于训练集则全是类别1与类别2,那么最后我们发现在这一折的交叉验证中得到的精度就会有大问题,所以这时就需要分层k折交叉验证了。

在分层k折交叉验证中,我们让不同类别之间的比例在每一折中都与在整个数据集中的比例相同,就是说,在上述的数据集中,0占整体的1/3,那么在每一折中我们也同样保证0的占比为1/3。

(同样用书中的图来展示)

2.2 交叉验证分离器

在函数cross_val_score中,我们可以通过调整cv参数来改变所用的折数,而实现对于数据集更精准的划分。同时,它本身并不直接评估模型,而是生成用于训练和验证的数据索引。

2.3 留一法交叉验证

留一法交叉验证其实就是每折只包含单个样本的k折交叉验证。简单说,就是选择单个数据点作为测试集。

2.4 打乱交叉验证

在打乱交叉验证中,通过随机打乱数据集后再进行分割,从而确保每次分割都是随机的。

(同样,如下图)

2.5 分组交叉验证

分组交叉验证是一种特殊的交叉验证方法,它在数据集中考虑了一种特殊的结构——即样本之间的“组”关系。这种交叉验证方法适用于数据集中样本间存在某种依赖或相关性的情况,例如数据来自不同的个体、不同的时间段或不同的地理区域等。

三、 python代码实现

3.1 交叉分离器

首先先给出最原本的交叉验证的代码:

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

iris = load_iris()
logreg = LogisticRegression()
scores = cross_val_score(logreg,iris.data,iris.target)
print("score:{}".format(scores))

关于它,我们会得到这样一个结果:

并且输出结果为:score:[0.96666667 1.         0.93333333 0.96666667 1.        ]

这是因为优化器未能在预定的最大迭代次数内达到收敛标准。

然后我们略作修改,如下:

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

iris = load_iris()
X = iris.data
y = iris.target

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 创建逻辑回归模型,并增加最大迭代次数
logreg = LogisticRegression(max_iter=1000)

# 使用交叉验证计算得分
scores = cross_val_score(logreg, X_scaled, y)
分
print("Scores:", scores)
print("Mean Score:", scores.mean())

这样结果就是:

Scores: [0.96666667 1.         0.93333333 0.9        1.        ]
Mean Score: 0.9600000000000002

在默认情况下,cross_val_score将执行3折交叉验证,并返回三个精度值,我们可以通过修改cv来改变参数。

3.2 分层k折交叉验证

接下来是分层k折交叉验证的代码:

from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

iris = load_iris()
logreg = LogisticRegression()

# 使用分层k折交叉验证
stratified_kfold = StratifiedKFold(n_splits=5)

scores = cross_val_score(logreg, iris.data, iris.target, cv=stratified_kfold)

print("Scores:{}".format(scores))

结果为:

Scores:[0.96666667 1.         0.93333333 0.96666667 1.        ]

3.3 交叉分离器

然后是交叉分离器的代码,在这里我们会发现使用交叉分离器后,是直接将之索引带入到了cv参数里。

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import KFold

iris = load_iris()
logreg = LogisticRegression()

#获得分离器,并分5折
kfold = KFold(n_splits=5)

scores = cross_val_score(logreg, iris.data, iris.target, cv=kfold)

print("Scores:{}".format(scores))

结果为:

Scores:[1.         1.         0.86666667 0.93333333 0.83333333]

3.4 留一法交叉验证

这是留一法交叉验证的代码:

from sklearn.model_selection import cross_val_score, LeaveOneOut
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

iris = load_iris()
logreg = LogisticRegression()

# 实例化留一
loo = LeaveOneOut()

scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)

print("Scores:{}".format(scores))
print("Number of cv iterations:{}".format(len(scores)))
print("Mean accuracy:{}".format(format(scores.mean())))

 其结果为:

Scores:[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1.
 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1.]
Number of cv iterations:150
Mean accuracy:0.9666666666666667

3.5 打乱交叉验证

代码如下:

from sklearn.model_selection import cross_val_score, ShuffleSplit
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

iris = load_iris()
logreg = LogisticRegression()

# 实例打乱交叉验证
shuffl_s = ShuffleSplit(test_size=.5,train_size=.5,n_splits=10)

scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffl_s)

print("Number of cv iterations:{}".format(len(scores)))
print("Mean accuracy:{}".format(format(scores.mean())))

结果为:

Number of cv iterations:10
Mean accuracy:0.9426666666666668

3.6 分组交叉验证

最后是分组交叉验证,代码如下:

from sklearn.model_selection import cross_val_score, GroupKFold
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_blobs

#创建模拟数据集
X, y = make_blobs(n_samples=12, random_state=0)
logreg = LogisticRegression()
group = [0,0,0,1,1,1,1,2,2,3,3,3]

scores = cross_val_score(logreg, X, y, groups=group, cv=GroupKFold(n_splits=3))

print("Number of cv iterations:{}".format(len(scores)))
print("Mean accuracy:{}".format(format(scores.mean())))

结果如下:

Number of cv iterations:3
Mean accuracy:0.6722222222222222
 

此上

标签:iris,交叉,验证,介绍,scores,import,sklearn
From: https://blog.csdn.net/2301_79096986/article/details/142003534

相关文章

  • C++: set与map容器的介绍与使用
    本文索引前言1.二叉搜索树1.1概念1.2二叉搜索树操作1.2.1查找与插入1.2.2删除1.2.3二叉搜索树实现代码2.树形结构的关联式容器2.1set的介绍与使用2.1.1set的构造函数2.1.2set的迭代器2.1.3set的容量2.1.4set的修改操作2.2map的介绍与使用2.2.1map的构造......
  • IIS标识介绍
    原文链接:https://blog.csdn.net/weixin_30607659/article/details/95294969应用程序池的标识是运行应用程序池的工作进程所使用的服务帐户名称。默认情况下,应用程序池以NetworkService 用户帐户运行,该帐户拥有低级别的用户权限。您可以将应用程序池配置为以 Windows Server......
  • django app介绍
    1.关于APP创建的django项目:E:/PycharmProjects/day004 -day004 -urls.pyURL和函数对应关系 -wsgi.py底层请求处理入口【同步】 -asgi.py底层请求处理入口【异步】 -settings.py配置文件(内置配置文件global_settings假设200项配置+用户3项配置......
  • Web大学生网页作业成品——动漫海贼王介绍网页设计与实现(HTML+CSS)(1个页面)
    ......
  • :2024年CISP认证考试内容详细介绍
    2024年CISP考试涉及的知识面广泛,包括网络安全、系统安全、应用安全、密码学等多个方面。下面就来详细介绍一下CISP认证的考试内容~1、信息安全技术:这一领域主要包括密码技术、访问控制、审计监控等安全技术机制,以及网络、系统软件和应用等各个层次的基本安全原理和实践......
  • 直流负载技术介绍
    直流负载技术是一种用于控制和调节电力系统运行状态的重要技术。它主要通过对电力系统中的直流负载进行有效的管理和控制,以保证电力系统的稳定运行,提高电力系统的运行效率,降低电力系统的运行成本。直流负载技术主要包括直流负载的检测、控制和调节等几个方面。首先,通过对电力系统......
  • 性能评估工具Profiler的使用与相关介绍
    性能评估工具Profiler经历三天的性能评估工具探索,终于找到了正确使用Profiler的正确使用方法。环境搭建#python环境搭建(python=3.10)condacreate--prefix=/path/to/you/env/namepython=3.10#torch环境搭建(CUDA12.1,linux,pip)pip3installtorchtorchvisiontorchaudio#......
  • 时空人工智能介绍
    时空人工智能  时空人工智能是AI领域的新型创新应用技术,定义为以时空为‘索引’对多源异构数据进行时空化治理和融合,并借力知识工程和AI算法进行智能化分析,从而挖掘知识和辅助决策。时空AI是地理空间智能、城市空间智能和时空大数据智能等的统一表示,包括从时空感知、认知到决策......
  • CheckNetIsolation介绍
    CheckNetIsolation是Windows操作系统中的一个命令行工具,用于管理UWP应用(UniversalWindowsPlatform,通用Windows平台应用)的网络隔离设置。该工具主要用于配置应用程序是否允许访问本地网络资源(如本地回环地址127.0.0.1),并排查与网络相关的问题。UWP应用由于其安全架构,默认......
  • 组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)
     一、什么是组态软件组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域,用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具,使用户能够创建用户界......