K折交叉验证的原理以及实战&使用StratifiedKFold来实现分层抽样

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: K折交叉验证的原理以及实战&使用StratifiedKFold来实现分层抽样

前言


交叉验证的由来:在机器学习的过程中,我们不能将全部数据都用于数据的模型训练,否则会导致我们没有数据集对该模型进行验证,无法评估模型的预测效果。


一、交叉验证(Cross-Validation)


众所周知,模型训练的数据量越大时,通常训练出来的模型效果会越好,所以如何充分利用我们手头的数据呢?


1-1、LOOCV(Leave-One-Out Cross Validation)(留一交叉验证)


这个方法是将数据集分为训练集和测试集,只用一个数据作为测试集,其它的数据都作为训练集,并将此步骤重复N次。


05629aae9e8a4ccf8ae6cd6bf4734eb6.png



结果就是我们训练了n个模型,每次都得到一个MSE,计算最终的MSE就是将这n个MSE取平均。

缺点是计算量太大。


1-2、K-fold Cross Validation


为了解决LOOCV计算量太大的问题,我们提出了K折交叉验证,测试集不再只是包含一个数据,而是包含多个数据,具体数目根据K的选取而决定,比如说K=5。即:

1、将所有数据集分为5份。

2、不重复地每次取其中一份作为测试集,其它四份做训练集来训练模型,之后计算该模型在测试集上的MSE

3、5次的MSE取平均,就得到最后的MSE。


优点

1、相比于LOOCV,K折交叉验证的计算量小了很多,而且和LOOCV估计很相似,效果差不多

2、K折交叉验证可以有效的避免过拟合和欠拟合的发生。


1-3、k的选取


根据经验,k一般都选择为5或者是10。

也可以通过网格搜索来确定最佳的参数


1-4、k折交叉验证的作用


1、可以有效的避免过拟合的情况

2、在各种比赛的过程中,常常会遇到数据量不够大的情况,那么这种技巧可以帮助提高精度!


二、K折交叉验证实战。


2-1、K折交叉验证实战


# 导入包
from sklearn.model_selection import KFold
import numpy as np
# 构建数据集
X = np.arange(24).reshape(12,2)
print(X)
# KFold()
# 参数:
# n_splits: 分为几折交叉验证
# shuffle: 是否随机,设置为True后每次的结果都不一样。
# random_state: 设置随机因子,设置了这个参数之后,每次生成的结果是一样的,而且设置了random_state之后就没必要设置shuffle了。
kf = KFold(n_splits=3,shuffle=True)
for train,test in kf.split(X):
    # 返回值是元组,训练集和验证集组成的元组
    print('%s %s' % (train, test))

输出:

[[ 0 1]

[ 2 3]

[ 4 5]

[ 6 7]

[ 8 9]

[10 11]

[12 13]

[14 15]

[16 17]

[18 19]

[20 21]

[22 23]]

[ 0 1 2 3 8 9 10 11] [4 5 6 7]

[ 0 4 5 6 7 8 9 10] [ 1 2 3 11]

[ 1 2 3 4 5 6 7 11] [ 0 8 9 10]


三、使用StratifiedKFold(分层K折交叉验证器)实现分层抽样


Tips:使用StratifiedKFold可以实现分层抽样方法,StratifiedKFold是K-fold的变种。(解决训练集和测试集分布不一致的问题)

import numpy as np
from sklearn.model_selection import StratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [5, 6], [7, 8], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1, 2, 2, 3, 3])
skf = StratifiedKFold(n_splits=2).split(X, y)
#c= skf.get_n_splits(X, y)
for train_index, test_index in skf:
     print("TRAIN:", train_index, "TEST:", test_index)
     X_train, X_test = X[train_index], X[test_index]
     y_train, y_test = y[train_index], y[test_index]
# 注意:这里输出的是索引,想输出分割后的结果,直接输出X_train,X_test ,y_train,y_test 就可以。
# 可以看到分割后训练集和测试集的分布是相同的。

输出

TRAIN: [1 3 5 7] TEST: [0 2 4 6]

TRAIN: [0 2 4 6] TEST: [1 3 5 7]

直接使用KFold来输出


import numpy as np
from sklearn.model_selection import StratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [5, 6], [7, 8], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1, 2, 2, 3, 3])
skf = KFold(n_splits=2).split(X, y)
#c= skf.get_n_splits(X, y)
for train_index, test_index in skf:
     print("TRAIN:", train_index, "TEST:", test_index)
     X_train, X_test = X[train_index], X[test_index]
     y_train, y_test = y[train_index], y[test_index]
     print(X_train, y_train) 
     print(X_test, y_test)
     # 可以看到分布是不均匀的。


输出

TRAIN: [4 5 6 7] TEST: [0 1 2 3]

[[5 6]

[7 8]

[5 6]

[7 8]] [2 2 3 3]

[[1 2]

[3 4]

[1 2]

[3 4]] [0 0 1 1]

TRAIN: [0 1 2 3] TEST: [4 5 6 7]

[[1 2]

[3 4]

[1 2]

[3 4]] [0 0 1 1]

[[5 6]

[7 8]

[5 6]

[7 8]] [2 2 3 3]

参考文章

【机器学习】Cross-Validation(交叉验证)详解.

交叉验证(Cross Validation).

python 利用sklearn.cross_validation的KFold构造交叉验证数据集.

K折交叉验证法原理及python实现.

sklearn官方文档.


总结


每天中午都睡不醒,很烦。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
机器学习/深度学习 算法
低门槛实战线性回归模型
本文是学习线性回归模型的总结,以图文相结合的方式,分享线性回归模型的技术原理,以及用代码实现验证,供大家参考。
85 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
交叉验证之KFold和StratifiedKFold的使用(附案例实战)
交叉验证之KFold和StratifiedKFold的使用(附案例实战)
109 0
|
18天前
|
机器学习/深度学习 索引
|
14天前
|
机器学习/深度学习 算法
【机器学习】支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择(面试回答)?
文章对支持向量机(SVM)、逻辑回归(LR)和决策树(DT)进行了直观和理论上的对比,并提供了在选择这些算法时的考虑因素,包括模型复杂度、损失函数、数据量需求、对缺失值的敏感度等。
25 1
|
1月前
|
机器学习/深度学习 数据采集 算法
Python实现贝叶斯岭回归模型(BayesianRidge算法)并使用K折交叉验证进行模型评估项目实战
Python实现贝叶斯岭回归模型(BayesianRidge算法)并使用K折交叉验证进行模型评估项目实战
|
3月前
|
机器学习/深度学习 算法 数据挖掘
survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?
survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?
149 1
|
11月前
|
机器学习/深度学习 搜索推荐 算法
课时2:基于GBDT算法的CTR预估
课时2:基于GBDT算法的CTR预估
218 0
|
机器学习/深度学习 算法 前端开发
从k折到自助法:常用交叉验证方法的优缺点
为了评估和改进机器学习(ML)算法的可靠性和泛化能力,交叉验证已被广泛采用[1]。交叉验证是一种在有限数据集上评估和比较不同模型性能的方法,其通过分割数据集为训练集和测试集以验证模型的性能。通过使用交叉验证,研究人员可以避免对单一实验的依赖,因此可以更好地评估模型的泛化能力。
2126 0
|
机器学习/深度学习
【技术分享】什么是K折交叉验证?
【技术分享】什么是K折交叉验证?
172 0
实战案例|K折交叉验证与GridSearch网格搜索
大家好,我是志斌~ 今天跟大家分享一下如何用GridSearch网格搜索和K折交叉认证对决策树模型进行参数调优。
473 0
实战案例|K折交叉验证与GridSearch网格搜索