sklearn的k折交叉验证的详细过程(数据和模型的角度)
前提:
一般博客大家都是介绍K折在数据上的拆分,再加一个sklearn代码的demo,就没了。
这样对于我来说,这两年就一直停留在这个阶段,知道他甚至感觉熟悉他,就是吃不透他。
直到今天,我才想到去看sklearn的交叉验证源码,sklearn的流程一般是公认的。
大概知道这个流程,但是由于缺乏看见权威资料什么的一直没敢确定。
所以这个卡了2年就很是无语。
分析的逻辑:
sklearn有现成的k折交叉验证代码,只要看懂了sklearn的流程,体会了它的思路,那么在神经网络上也是一样应用的。
分析:
- 完整的交叉验证评估demo
from sklearn import datasets
from sklearn import svm
from sklearn.model_selection import cross_val_score,cross_validate
iris = datasets.load_iris()
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
print(scores)
cross_validate()
- 进入
cross_val_score()
,第515-527
行调用函数cv_results = cross_validate()
- 进入
cross_validate()
,第266-283
行:results = parallel( delayed(_fit_and_score)( clone(estimator), X, y, scorers, train, test, verbose, None, fit_params, return_train_score=return_train_score, return_times=True, return_estimator=return_estimator, error_score=error_score, ) for train, test in cv.split(X, y, groups) )
clone(estimator)
表明,每次输入的estimator
都是重新初始化的,不是接着上一轮(上一个cv)中训练的。_fit_and_score()
训练和评估,这里好像只能用一个评价指标,没深究。
总结:
sklearn的五折交叉:
1. 数据上,分成5份,4份做训练集,1份做测试集,迭代5次,相当于构建了5个用于训练和测试的数据集
2. 模型上,每轮训练(每个cv)之前都要把模型初始化。
3. 总体而言,相当于,使用5个初始化一样的模型,在5个数据集(五折划分构建来的)上训练并测试。
one more thing:
参数寻优GridSearchCV()
结合了参数寻优和交叉验证,这个的详细过程如何?
由于以前看过这部分的代码,初步判定是:对每组参数集做k折交叉验证,再依据评估指标(如每折测试集评估指标的平均值和指定比较哪个指标)选出最佳参数集。