2021-12-31 python 机器学习 交叉验证(循环估计)

交叉验证(循环估计)

交叉验证是一种用来评价一个训练出的模型是否可以推广到另一个数据结构相同的数据集上的方法,所有的将数据分为训练集和验证集的方法都可以称之为交叉验证。交叉验证无法做到对模型进行调整,只能是对模型进行评价。
方法分为三类:随机子抽样验证(Hold-Out Method)K折交叉验证(K-fold Cross Validation)留一法交叉验证(Leave-One-Out Cross Validation)

1. Hold-Out Method

就是最普遍的随机在数据集中抽取一定量的数据作为训练集, 另一部分作为验证集
缺点就是训练集的数据分布可能不具有代表性,或者重复抽样造成模型的拟合能力较差。

Python 实现:
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
dataset = pd.read_csv("C:/Users/SSSSS/Desktop/data2.csv")
X_train,X_test,y_train,y_test=train_test_split(dataset.iloc[:,0:23],dataset.CSE,test_size=0.25,random_state=0)

2. K-fold Cross Validation

将数据分为K组, 用一组数据进行验证,其余数据进行训练,也就是说会得到k个模型,后对k个模型的评分计算均值,然后得到一个性能指标。 通常来讲,对于较小的数据来讲,k值的选择应该从小到大尝试。这种验证方式比较具有说服力(每一个集合都可以作为训练集),且可以有效避免过拟合以及欠拟合的发生。K-fold Cross Validation有几种变式,分别为KFoldStratifiedKFold(分层抽样),以及GroupKFold

2.1 KFold and Repeated K-Fold (重复n次kfold, 推荐使用)

既可以用于分类问题,也可以用于回归问题。

Python实现:
from sklearn.model_selection import KFold
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import cross_val_score
model = ensemble.AdaBoostRegressor()#建立一个模型
kf=KFold(n_splits=4,shuffle=True)#建立k折
rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state =100)#建立rkf
print(cross_val_score(model, x, y, cv=kf))#将k折应用到模型,并返回结果。
#cross_val_score是一个计算得分的函数
参数简介
image.png

Shuffle是打乱原本顺序随机抽样

image.png

Methods里的两个语句可以得到具体的分拆结果并且把数据拆分(通常不需要)


image.png

2.2 StratifiedKFold and RepeatedStratifiedKFold

只适用于分类问题

Python实现:
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import RepeatedStratifiedKFold
skf= StratifiedKFold(n_splits=2, random_state=None, shuffle=False)
rskf = RepeatedStratifiedKFold(n_splits=2, n_repeats=2, random_state=100)

2.3 GroupKFold

目的在于将groups严格分开,以减少过拟合现象。 group参数是通过不同的group标识符使训练集和测试集在划分时不会重叠。 目前我还没用到过这个函数...

3. Leave-One-Out Cross Validation(LOOCV)

如果数据集D的大小为100,那么用99条数据进行训练,用剩下的一条数据作为验证, 直到所有样本都作过验证集,共计算N次,最后对验证误差求平均,得到Eloocv(H,A)
留p交叉验证和 LOOCV同理,它通过从整个集合中删除 p 个样本来创建所有可能的 训练/测试集。对于 n 个样本,这产生了 {n \choose p} 个 训练-测试 对。与 LeaveOneOut 和 KFold 不同,当 p > 1 时,测试集会重叠。
留一法的优点显而易见,其数据损失只有一个样本,并且不会受到样本随即划分的影响。但是,其计算复杂度过高,空间存储占用过大

from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import LeavePOut, cross_val_score
lpo = LeavePOut(p=2)
loo = LeaveOneOut()
model = ensemble.AdaBoostRegressor()
score = cross_val_score(model, X, Y, cv=lpo)
print("Cross Validation Scores are {}".format(score))
print("Average Cross Validation score :{}".format(score.mean()))

loo和lpo不适用于R2作为评价参数,应该选取其他参数,否则报错

R^2 score is not well-defined with less than two samples.

—————————————————————————————————————
下一总结: 集成算法

你可能感兴趣的:(2021-12-31 python 机器学习 交叉验证(循环估计))