在交叉验证中,我们将训练数据生成多个小的训练测试分割,使用这些拆分来调整您的模型。例如,在标准的 k 折交叉验证中,我们将数据划分为 k 个子集。然后,我们在 k-1 个子集上迭代训练算法,同时使用剩余的子集作为测试集。通过这种方式,我们可以在未参与训练的数据上测试我们的模型。在本文中,我将分享 7 种最常用的交叉验证技术及其优缺点,我还提供了每种技术的代码片段,欢迎收藏学习,喜欢点赞支持。下面列出了这些技术方法:
from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_scoreiris=load_iris()X=iris.dataY=iris.targetprint("Size of Dataset {}".format(len(X)))logreg=LogisticRegression()x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3,random_state=42)logreg.fit(x_train,y_train)predict=logreg.predict(x_test)print("Accuracy score on training set is {}".format(accuracy_score(logreg.predict(x_train),y_train)))print("Accuracy score on test set is {}".format(accuracy_score(predict,y_test)))
2、K 折交叉验证
在这种 K 折交叉验证技术中,整个数据集被划分为 K 个相等大小的部分。每个分区称为一个“折叠”。因此,因为我们有 K 个部分,所以我们称之为 K 折叠。一折用作验证集,其余 K-1 折用作训练集。该技术重复 K 次,直到每个折叠用作验证集,其余折叠用作训练集。模型的最终精度是通过取 k-models 验证数据的平均精度来计算的。优点:1. 整个数据集既用作训练集又用作验证集。缺点:1. 不用于不平衡的数据集:正如在 HoldOut 交叉验证的情况下所讨论的,在 K-Fold 验证的情况下也可能发生训练集的所有样本都没有样本形式类“1”,并且只有 类“0”。验证集将有一个类“1”的样本;2. 不适合时间序列数据:对于时间序列数据,样本的顺序很重要。但是在 K 折交叉验证中,样本是按随机顺序选择的。代码片段:
from sklearn.datasets import load_irisfrom sklearn.model_selection import cross_val_score,KFoldfrom sklearn.linear_model import LogisticRegressioniris=load_iris()X=iris.dataY=iris.targetlogreg=LogisticRegression()kf=KFold(n_splits=5)score=cross_val_score(logreg,X,Y,cv=kf)print("Cross Validation Scores are {}".format(score))print("Average Cross Validation score :{}".format(score.mean()))
from sklearn.datasets import load_irisfrom sklearn.model_selection import cross_val_score,StratifiedKFoldfrom sklearn.linear_model import LogisticRegressioniris=load_iris()X=iris.dataY=iris.targetlogreg=LogisticRegression()stratifiedkf=StratifiedKFold(n_splits=5)score=cross_val_score(logreg,X,Y,cv=stratifiedkf)print("Cross Validation Scores are {}".format(score))print("Average Cross Validation score :{}".format(score.mean()))
4、Leave P Out 交叉验证
Leave P Out 交叉验证是一种详尽的交叉验证技术,其中 p 样本用作验证集,剩余的 n-p 样本用作训练集。假设我们在数据集中有 100 个样本。如果我们使用 p=10,那么在每次迭代中,10 个值将用作验证集,其余 90 个样本将用作训练集。重复这个过程,直到整个数据集在 p 样本和 n-p 训练样本的验证集上被划分。优点:1. 所有数据样本都用作训练和验证样本。缺点:1. 计算时间长:由于上述技术会不断重复,直到所有样本都用作验证集,因此计算时间会更长;2. 不适合不平衡数据集:与 K 折交叉验证相同,如果在训练集中我们只有 1 个类的样本,那么我们的模型将无法推广到验证集。代码片段:
from sklearn.model_selection import LeavePOut,cross_val_scorefrom sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifieriris=load_iris()X=iris.dataY=iris.targetlpo=LeavePOut(p=2)lpo.get_n_splits(X)tree=RandomForestClassifier(n_estimators=10,max_depth=5,n_jobs=-1)score=cross_val_score(tree,X,Y,cv=lpo)print("Cross Validation Scores are {}".format(score))print("Average Cross Validation score :{}".format(score.mean()))