Kaggle比赛1:Don't overfit

Kaggle比赛1:Don't overfit

本文的代码在github上,我自编的代码在其中的jiading文件夹下
这是我接触的第一场Kaggle比赛,本题的难点在于训练集相比测试集合很小,很容易overfit。表现如下:


本题的关键分为两部分,一个是数据的预处理,一个是模型的选择。在模型选择中,我们选择了lasso模型,它最原始是回归模型的一个变形,详情见这篇文章,它也可被用来分类(分类和回归的方法是一样的,都是fit和predict,这里可以把二分类作为回归的一个特殊情况,它们都属于线性模型的处理范围)。选择lasso的原因是它可以有效选择attributes:岭回归可以让线性模型中一些attributes的weights接近于0,而lasso会让其直接为0,从而起到筛选变量的作用

数据的预处理方法就比较多了。效果最好的是probing,听起来很厉害,其实是一种鸡贼的方法:使用linear model,每次只判断一个attribute,然后看判断哪个attribute时准确率最高,也就是说明这个attribute比较关键、相关性比较大,最后选出相关性最大的前n个attributes.这种办法的原理类似于“探测”,可能只能用在比赛中,并且工作量比较大。

和它处理效果差不多的是RFECV,关于这种办法的介绍看这篇:https://www.cnblogs.com/jiading/articles/12627234.html 。probing和它一起用效果会更好一点点。使用这种方法时我们需要选择一个关键的参数min_features_to_select,它的意思是最终通过PFECV筛选剩下的features数量。这个也需要多试一下

值得注意的是,本题中使用probing和grid search效果并不好,可能是因为grid search选出的有些overfit。还有,如果使用了REFCV,就不能再用grid search了。当然不是说所有情况下这些方法都不能组合,可以看这篇https://www.cnblogs.com/jiading/articles/12629465.html ,使用pipeline即可:先将组件放进pipeline,然后在外部用grid search来wrap。但是pipeline中的组件之间必须是解耦的,像REFCV或者RFE需要传入lasso这个estimator,就不行。RFECV不行的另外一个原因是RFECV也用了CV,grid search也用了CV,这两个很明显有冲突。

另外,本题也可以用PCA来降维,但是效果非常差,和probing搭配使用的效果还不如不用。主要原因可能是使用train_x来训练PCA、选择最佳的attributes时train_x无论从数量上还是维度上都太小了,用它训练出来的模型不够准确,还可以有原理上的原因:这篇文章从直观的角度解释了PCA<我们在使用sklearn的PCA时会指定一个维度,而PCA可能并不能很好地映射到这个维度上,这个过程会产生误差,而这里的情况是这些误差甚至抵消了PCA的作用。这里要注意train_x和test_x都只能用一个训练好的模型,不能每段fit一个,这样最后映射的都很可能对不上。

posted @ 2020-04-03 21:45  别再闹了  阅读(216)  评论(0)    收藏  举报