hagiaatcos 例如,我把数据分成10份,分别是: D1,D2,D3...D10 进行10折交叉验证,过程是否如下: 取D1,D2,D3...D9建立模型mod1,并在D10进行验证; 取D1,D2,D3...D8,D10建立模型mod2,并在D9进行验证; 取D1,D2,D3...D7,D9,D10建立模型mod3,并在D8进行验证; ... 取D2,D3,D4...D10建立模型mod10,并在D1进行验证。 这样我共建立10个模型,最终应该选哪个模型呢?
nan.xiao 交叉验证的目的主要是为了调参。流程上首先训练了 k 个模型,训练后计算所有折上的平均性能,选择性能最高的那组参数,再用完整的训练集结合那组最优参数建一个模型。最后在最开始留出的的独立测试集上评估最后这个模型的性能。 这个过程在 scikit-learn 的文档里写得还算清楚,看图就可以了。
hagiaatcos nan.xiao 感谢回复,今天刚刚把这个 sklearn 的文档看完了,关于如何进行 k 折交叉验证大致明白, 但是对里面那个图: 右边那个的“finding parameters"不太理解,我知道做 k 折验证目的是找最优 parameters,但是不知道parameters具体是啥。比如我做一个多元线性回归、LASSO 回归和随机森林等,他们的”parameters“是什么呢?不胜感激。
hagiaatcos fenguoerbian 请问交叉验证的调参,是自动进行的吗? 例如cv.glmnet(x,y,family = 'binomial')这样的式子里我没有指定具体超参数,那么cv.glmnet这个函数就自己调参了?
fenguoerbian hagiaatcos 不是。cv的时候是把大量的备选参数都尝试了一遍,并给出了它们在交叉验证中的验证结果,用户自己选择到底要用哪一个参数。 但是cv.glmnet默认是给出两个选择结果的,一个是最小的交叉验证误差所对应的超参数(cv.min准则),一个是在最小交叉误差的一倍标准差范围内最大的惩罚参数(cv.1se准则,一般给出的模型比cv.min更稀疏,但性能差异不大)。
hagiaatcos fenguoerbian 感谢解答! 还有一点不懂,这里您说cv.glmnet给出了cv.min和cv.1se的超参数,我在哪里可以看到这个超参数呢? 我通过cv.glmnet能知道cv.min和cv.1se分别选出来的变量名称和变量的系数。
hagiaatcos fenguoerbian 噢,看了一下https://www.rdocumentation.org/packages/glmnet/versions/4.1-7/topics/cv.glmnet 也就是说,lambda就是lasso模型的超参数?然后cv.glmnet返回的values里,lambda.min,lambda.1se,就是lambda可以选择的具体取值,然后lambda定下来,模型的变量和每个变量的系数就定下来了,不知道这样理解是否正确,原谅我数学基础太差……