来源:机器学习社区本文约3400字,建议阅读10分钟本文与你分享7种最常用的交叉验证技能及其优缺陷,供应了每种技能的代码片段。
在任何有监督机器学习项目的模型构建阶段,我们演习模型的目的是从标记的示例中学习所有权重和偏差的最佳值。
如果我们利用相同的标记示例来测试我们的模型,那么这将是一个方法论缺点,由于一个只会重复刚刚看到的样本标签的模型将得到完美的分数,但无法预测任何有用的东西 - 未来的数据,这种情形称为过拟合。

为了战赛过度拟合的问题,我们利用交叉验证。以是你必须知道什么是交叉验证?以及如何办理过拟合的问题?
什么是交叉验证?交叉验证是一种用于估计机器学习模型性能的统计方法,它是一种评估统计剖析结果如何推广到独立数据集的方法。
它是如何办理过拟合问题的?
在交叉验证中,我们将演习数据天生多个小的演习测试分割,利用这些拆分来调度您的模型。例如,在标准的 k 折交叉验证中,我们将数据划分为 k 个子集。然后,我们在 k-1 个子集上迭代演习算法,同时利用剩余的子集作为测试集。通过这种办法,我们可以在未参与演习的数据上测试我们的模型。
在本文中,我将分享 7 种最常用的交叉验证技能及其优缺陷,我还供应了每种技能的代码片段,欢迎收藏学习,喜好点赞支持。
下面列出了这些技能方法:
HoldOut 交叉验证K-Fold 交叉验证分层 K-Fold交叉验证Leave P Out 交叉验证留一交叉验证蒙特卡洛 (Shuffle-Split)韶光序列(滚动交叉验证)
1、HoldOut 交叉验证在这种交叉验证技能中,全体数据集被随机划分为演习集和验证集。根据履历,全体数据集的近 70% 用作演习集,别的 30% 用作验证集。
优点:
1.快速实行:由于我们必须将数据集拆分为演习集和验证集一次,并且模型将在演习集上仅构建一次,因此可以快速实行。
缺陷:
1. 不适宜不平衡数据集:假设我们有一个不平衡数据集,它具有“0”类和“1”类。假设 80% 的数据属于“0”类,别的 20% 的数据属于“1”类。在演习集大小为 80%,测试数据大小为数据集的 20% 的情形下进行演习-测试分割。可能会发生“0”类的所有 80% 数据都在演习集中,而“1”类的所有数据都在测试集中。以是我们的模型不能很好地概括我们的测试数据,由于它之前没有看到过“1”类的数据;
2. 大量数据无法演习模型。
在小数据集的情形下,将保留一部分用于测试模型,个中可能具有我们的模型可能会错过的主要特色,由于它没有对该数据进行演习。
代码片段:
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()))
3、分层 K 折交叉验证
分层 K-Fold 是 K-Fold 交叉验证的增强版本,紧张用于不平衡的数据集。就像 K-fold 一样,全体数据集被分成大小相等的 K-fold。
但是在这种技能中,每个折叠将具有与全体数据集中相同的目标变量实例比率。
优点:
1. 对付不平衡数据非常有效:分层交叉验证中的每个折叠都会以与全体数据集中相同的比率表示所有类别的数据。
缺陷:
1. 不适宜韶光序列数据:对付韶光序列数据,样本的顺序很主要。但在分层交叉验证中,样本是按随机顺序选择的。
代码片段:
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()))
5、留一交叉验证
留一交叉验证是一种详尽的交叉验证技能,个中 1 个样本点用作验证集,别的 n-1 个样本用作演习集。
假设我们在数据集中有 100 个样本。然后在每次迭代中,1 个值将用作验证集,别的 99 个样本作为演习集。因此,重复该过程,直到数据集的每个样本都用作验证点。
它与利用 p=1 的 LeavePOut 交叉验证相同。
代码片段:
from sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import LeaveOneOut,cross_val_scoreiris=load_iris()X=iris.dataY=iris.targetloo=LeaveOneOut()tree=RandomForestClassifier(n_estimators=10,max_depth=5,n_jobs=-1)score=cross_val_score(tree,X,Y,cv=loo)print("Cross Validation Scores are {}".format(score))print("Average Cross Validation score :{}".format(score.mean()))
6、蒙特卡罗交叉验证(Shuffle Split)
蒙特卡罗交叉验证,也称为Shuffle Split交叉验证,是一种非常灵巧的交叉验证策略。在这种技能中,数据集被随机划分为演习集和验证集。
我们已经决定了要用作演习集的数据集的百分比和用作验证集的百分比。如果演习集和验证集大小的增加百分比总和不是 100,则剩余的数据集不会用于演习集或验证集。
假设我们有 100 个样本,个中 60% 的样本用作演习集,20% 的样本用作验证集,那么剩下的 20%( 100-(60+20)) 将不被利用。
这种拆分将重复我们必须指定的“n”次。
优点:
1.我们可以自由利用演习和验证集的大小;
2.我们可以选择重复的次数,而不依赖于重复的折叠次数。
缺陷:
1. 可能不会为演习集或验证集选择很少的样本;
2. 不适宜不平衡的数据集:在我们定义了演习集和验证集的大小后,所有的样本都是随机选择的,以是演习集可能没有测试中的数据种别 设置,并且该模型将无法概括为看不见的数据。
代码片段:
from sklearn.model_selection import ShuffleSplit,cross_val_scorefrom sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegressionlogreg=LogisticRegression()shuffle_split=ShuffleSplit(test_size=0.3,train_size=0.5,n_splits=10)scores=cross_val_score(logreg,iris.data,iris.target,cv=shuffle_split)print("cross Validation scores:n {}".format(scores))print("Average Cross Validation score :{}".format(scores.mean()))
7、韶光序列交叉验证
什么是韶光序列数据?
韶光序列数据是在不同韶光点网络的数据。由于数据点是在相邻韶光段网络的,因此不雅观测值之间可能存在干系性。这是区分韶光序列数据与横截面数据的特色之一。
在韶光序列数据的情形下如何进行交叉验证?
在韶光序列数据的情形下,我们不能选择随机样本并将它们分配给演习集或验证集,由于利用未来数据中的值来预测过去数据的值是没故意义的。
由于数据的顺序对付韶光序列干系问题非常主要,以是我们根据韶光将数据拆分为演习集和验证集,也称为“前向链”方法或滚动交叉验证。
我们从一小部分数据作为演习集开始。基于该凑集,我们预测稍后的数据点,然后检讨准确性。
然后将预测样本作为下一个演习数据集的一部分包括在内,并对后续样本进行预测。
优点:
1. 最好的技能之一。
缺陷:
1. 不适用于其他数据类型的验证:与其他技能一样,我们选择随机样本作为演习或验证集,但在该技能中数据的顺序非常主要。
代码片段:
import numpy as npfrom sklearn.model_selection import TimeSeriesSplitX = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])y = np.array([1, 2, 3, 4, 5, 6])time_series = TimeSeriesSplit()print(time_series)for train_index, test_index in time_series.split(X): 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]
结论
在本文中,我试图概述各种交叉验证技能的事情事理以及我们在履行这些技能时应牢记的事变,我诚挚地希望在这个数据科学之旅中对你有所帮助。
编辑:黄继彦校正:龚力