第一部分:交叉验证
机器学习建立和验证模型,常用的方法之一就是交叉验证。在机器学习过程中,往往数据集是有限的,而且可能具有一定的局限性。如何最大化的利用数据集去训练、验证、测试模型,常用的方法就是交叉验证。交叉验证,就是重复的使用数据,对样本数据进行划分为多组不同的训练集和测试集(训练集训练模型,测试集评估模型)。
交叉验证一般使用在数据不是很充足情况。一般问题,如果数据样本量小于一万条,就会采用交叉验证优化模型。数据样本量大于一万条,就随机把数据分成三份(训练集、验证集、测试集)(来自博主刘建平)
交叉验证主要分为以下几种:
第一种是简单数据划分(train_test_split)。按照一定比例,如7:3,直接将样本分为训练集train和测试集test两部分。然后利用train训练模型,test验证模型,最后选择损失函数评估最优的模型和参数。这种方式只进行了一次划分,数据划分具有偶然性。
from sklearn.model_selection import train_test_split
第二种是简单交叉验证(Standard Cross Validation、S-Folder Cross Validation)。针对上述问题,所以提出了多次train_test_split划分。每次划分时,在不同的数据集上进行训练、测试评估,从而得出一个评价结果;如果是5折交叉验证,意思就是在原始数据集上,进行5次划分,每次划分进行一次训练、评估,最后得到5次划分后的评估结果,一般在这几次评估结果上取平均得到最后的 评分。k-fold cross-validation ,其中,k一般取5或10。
from sklearn.model_selection import cross_val_score
logreg = LogisticRegression()
scores = cross_val_score(logreg,cancer.data, cancer.target,CV=5)
第三种是分层交叉验证(Stratified k-fold cross validation)。分层的意思是说在每一折中都保持着原始数据中各个类别的比例关系,比如说:原始数据有3类,比例为1:2:1,采用3折分层交叉验证,那么划分的3折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。可以把KFold参数代入CV中。
from sklearn.model_selection import StratifiedKFold,cross_val_score
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
strKFold = StratifiedKFold(n_splits=3,shuffle=False,random_state=0)
scores = cross_val_score(logreg,iris.data,iris.target,cv=strKFold)
第四种是留一法(Leave-one-out Cross-validation)。如果样本容量为n,则k=n,进行n折交叉验证,每次留下一个样本进行验证。主要针对小样本数据。
from sklearn.model_selection import LeaveOneOut,cross_val_score
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
loout = LeaveOneOut()
scores = cross_val_score(logreg,iris.data,iris.target,cv=loout)
Shuffle-split cross-validation。可以控制划分迭代次数、每次划分时测试集和训练集的比例(可以存在既不在训练集也不再测试集的情况)
参考:https://www.cnblogs.com/ysugyl/p/8707887.html
http://www.cnblogs.com/pinard/p/5992719.html刘博主,很赞!
第二部分:网格搜索
Grid Search 是一种穷举的调参方法。通过循环遍历的方式,把每一种候选的参数组合,全部调试一遍。最后表现效果最好的参数就是最终的结果。
嵌套循环方式实现:(每次调参时,数据集要保持一致性)。为了避免test data既用于检验模型参数,又用于测试模型好坏,会提高模型结果的评分。可以将数据集分成三部分:train/val/test,分别对应训练、验证、测试。
第三部分:交叉验证与网格搜索结合应用
交叉验证经常和网格搜索结合应用(grid search with cross validation)。sklearn中有个类GridSearchCV, 实现了fit/predict/score等方法。