CV的过程就是通过把数据随机划分,人为区分出训练和测试集,于是可以用来调模型参数。但是既然是通过把数据随机划分得到的,就会想要度量说这种随机性对模型的调选参数有多少影响,这其中有调整fold数量的,也有不断重复CV的整个过程来再次求平均等的。
回到具体的Lasso模型上,从统计性质而言Lasso的估计结果是有偏的,因此Lasso的估计相合性和选择相合性是不可能同时达到的,因为这两者需要的lambda的阶数是相背离的。简而言之选变量准确的lasso,估计的结果会有偏;对那些潜在的真实变量的估计值无偏的lasso,实际选择出来的变量不会仅仅是潜在模型的真实变量。反映到CV的结果上,就是当你采用最小化CV误差的准则时,Lasso相对倾向于多选变量。这个在一些文献里也有体现和报道。
所以在使用CV的过程中到底如何选择最终的参数,除了“CV的平均误差最小”这样一个看起来体现的是泛化能力最好的准则外,也还有一些其他的经验性的准则,比如你代码里使用的“1se”准则,即选取“距离最小的CV平均误差在1倍标准差范围内的最稀疏模型”这样一个准则。对于Lasso正则而言一般这个准则会明显看到相对于最小CV误差而言,1se准则选择的模型泛化能力比较接近(必然是略微差一些),但是模型的变量数少了一些,模型更简洁,更有解释性。
如果你选择用最小CV误差准则(应该对应的是lambda.min
?我记不清了)的话,这么些次CV的结果选出来的模型应该会差别更大一些。你选用了1se
准则,本身就是一个倾向于考虑稀疏性的准则,那么与y的相关性比较明显的变量才会被纳入进来。即便如此这个结果还是有一定的随机性的,我自己测试的时候第二次的10个CV里就有选择到了两个变量的结果。
最后,对于Lasso而言,整个求解路径可以看作是当lambda从大到小时,变量依次被选择进来纳入了模型。那么后续选择进来的变量,相当于在当前的残差(y无法被当前已经纳入变量所解释的部分)中又提供了不错的解释性。你可以粗粗的看看,是否那个总是率先被选出来的变量,是所有变量里和y的相关性最强的?当然,这里y是个分类变量,但是你哪怕把它就当作数值变量去算算相关性,应该也能看出点东西来。而在你的逻辑回归模型已经包含这个变量的基础上,重新加入新的变量,是否提供的解释性已经很有限了?所以才会在1se准则下基本都是得到只选择第一个变量的结果。