k折交叉验证

一、K折交叉验证介绍
K折交叉验证(K-fold cross-validation)是一种常用的模型评估技术,用于评估机器学习模型在训练数据上的性能。它将原始数据集分成K个子集,称为折(fold)。然后,模型在K个不同的训练集上进行K次训练和验证,在每次训练中,其中一个折被作为验证集,而剩下的K-1个折被用作训练集。这样就产生了K个模型和对应的K个验证分数。

K折交叉验证的步骤如下:

将原始数据集分成K个子集。
对于每个子集i,将其作为验证集,其余的K-1个子集作为训练集。
训练模型,并在验证集上进行评估,记录评估指标(如准确率、精确度、召回率等)。
重复步骤2和3,直到每个子集都充当一次验证集,从而产生了K个评估指标。
对K个评估指标取平均值作为最终的模型性能评估指标。
K折交叉验证的优点包括:

有效利用数据:每个样本都有机会被训练和验证,提高了数据的利用率。
减少过拟合:由于每个样本都会被验证,因此模型的性能评估更具代表性,有助于减少过拟合。
对模型泛化能力的评估更可靠:通过多次验证可以更准确地评估模型在未见数据上的泛化能力。
K折交叉验证的缺点包括:

计算成本较高:需要训练和验证K次模型,因此需要更多的计算资源和时间。
结果可能不稳定:由于每次划分的训练集和验证集都不同,因此模型评估的结果可能会有一定的波动性。

分类
K-折交叉验证主要分为两类:

分层K-折交叉验证(Stratified K-fold Cross Validation):确保每个子集中类别比例与完整数据集相同。
留一交叉验证(Leave-One-Out Cross Validation, LOOCV):当K等于数据集中的样本数量时,即为留一交叉验证。
用途
评估模型的泛化能力。
选择模型或模型参数。
在有限的数据集上优化模型性能
您选择最适合特定任务的模型。通过绘制ROC曲线、计算AUC值、精确度、召回率等指标,可以更全面地评估不同模型的性能优劣。

选择最优训练集和验证集训练模型:K折交叉验证可以帮助您更充分地利用有限的数据集,减少因数据划分不合理而引入的偶然性。通过将数据集分成K个子集,依次将每个子集作为验证集,其余作为训练集,可以得到K个模型,进而对模型性能进行更准确的评估。

超参数调优:通过交叉验证,可以帮助您在训练过程中调整模型的超参数,以提高模型的泛化能力和性能。

防止过拟合:K折交叉验证可以减少过拟合的风险,因为模型在多个不同的训练集上进行训练,有助于更好地泛化到未见过的数据。

评估模型的稳定性:通过多次重复K折交叉验证,可以评估模型在不同数据集上的稳定性,从而更全面地了解模型的性能表现。

综上所述,比较不同模型的性能和K折交叉验证是机器学习中常用的重要技术,除了帮助选择最佳模型和训练集外,还有助于超参数调优、防止过拟合、评估模型稳定性等方面的作用。

三、在K折交叉验证中,每次模型的训练都是独立于上一次的
如五折交叉验证

在K折交叉验证中,每次模型的训练都是独立于上一次的。在五折交叉验证的过程中,首先将整个数据集平均分成五个部分,然后进行五次训练和测试的迭代。在每一次迭代中,使用其中的一部分数据作为测试集,其余的四部分数据合并起来作为训练集。这样保证了每个样本都有一次机会作为测试集出现,而同时在训练集中则不会出现。

以下是该过程的关键要点:

独立性:在第二次以及后续的迭代中,模型从头开始训练,不会保留第一次迭代训练中的任何参数或“记忆”。
评价指标:每次迭代完成后都会得到一个模型的性能评估。通过比较五次迭代得到的评估结果,可以选择最佳模型或者计算模型的平均性能。
模型选择:最终选择的模型通常是在所有迭代中表现最好的那一个
数据划分:为了确保每次迭代的训练和测试都是独立的,需要在每次迭代之前重新划分数据集。

Python代码详细实现

在这段代码中,我们首先加载了鸢尾花数据集,并定义了K折交叉验证的折数。然后,我们初始化了一个随机森林分类器,并使用KFold类来生成训练集和验证集的索引。在循环中,我们分别对每个折进行模型训练和验证,并计算准确率。最后,我们计算了所有折的平均准确率,以评估模型的泛化能力。

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

fiber = pd.read_csv("./fiber.csv")
fiber.head(5) #展示下头5条数据信息

X = fiber.drop(['Grade'], axis=1)
Y = fiber['Grade']

X_train, X_test, y_train, y_test = train_test_split(X,Y,train_size=0.75,test_size=0.25,random_state=42,shuffle=True)

print(X_train.shape) #(36,6) 
print(y_train.shape) #(36,)
print(X_test.shape) #(12,6)
print(y_test.shape) #(12,)

svc = SVC(C=3.0,kernel='sigmoid',gamma='auto',random_state=42)

k_corss = cross_val_score(svc, X, Y, cv=3)
print(k_corss)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值