第一次Kaggle比赛——Don't Overfit! II

  这是新手小白的第一场比赛,写这篇博客也是为了整理比赛思路,以便应对即将到来的提前批招聘及秋招。
  首先简单介绍一下这个比赛,这场比赛的训练集仅有250个样本,测试集有19750个样本,输入样本是300维数据 x ∈ R 300 x\in R^{300} xR300,输出是二分类即 y ∈ { 0 , 1 } y\in\lbrace0,1\rbrace y{0,1},比赛没有模拟任何实际背景。公共训练数据集中含有1975个样本,提交文件显示的LB的分数就是依据着1975个样本的得分进行排名。

1. EDA

  进行EDA的步骤:1、了解训练数据、测试数据的维度;2、数据的缺失值检查;3、对非数字型的特征数字化;4、对数据的列’target’有一定的了解。
  通过绘制数据的直方图,我们发现300个特征的均值都是在0附近,方差在1附近的高斯分布。我们认为20000个数据点分布在以原点为中心,半径约为3的300维超球体内(逻辑回归系数是300维空间中分离数据的超平面的法向量)。接下来就是将数据输入到写好的pipeline中运行,运行结果发现Lasso回归和LogisticRegression的效果最好,将文件提交后LB的分数也验证了这个结论。初步能够判定这些数据点大致是线性可分的。
  简单的逻辑回归、Lasso回归的效果优于XGBoost、随机森林。那么接下来就要思考下一步的改进。我们发现Lasso回归的效果比岭回归的得分高,L1正则化的逻辑回归也要比L2正则化的逻辑回归得分要高。对比于L1与L2正则化,L1正则化能够让系数矩阵更加稀疏,也就是许多特征被设为无用特征,也就说明生成这些数据点的原始模型中有很多的无用特征,那么接下来的思路就集中在如何更有效的筛选特征。(Lasso回归是带L1正则化的线性回归,岭回归是带L2正则化的线性回归。)
  仅仅使用LogisticRegression+RFE对结果的提升并不大,private score从0.837提高到了0.839,特征保留数设定为25。采用Robust+Lasso+rfe&GridSearch:使用Robustscaler()能够更好的处理数据离群点。sklearn有三种不同的 API 用于评估模型预测的质量,其中sklearn.metrics模块定义了一些模型评估的方法。使用交叉验证的方式,将数据集进行多次划分,对每一次划分都进行一次递归特征消除,然后再使用GridSearch的方法找出当前情况下的最优参数,将得到的结果输入到评价标准中,根据得分与阈值的关系,决定是否保留这个训练结果。最后将保留下来的所有训练结果求均值作为最后的结果,发现得分从0.837提高到0.848。

5.解决的问题:

  • 仅用极少的样本,250个train data,及1975个public data,给出了CV和LB的评价标准,而最后的测试文件有19万多,我们可以信任CV或LB的分数吗?需要对这个问题进行探索。
  • 当不论模型融合或是特征筛选等方法的分数都不能高过0.863之后,我认为仅仅使用250个训练样本进行训练的最好得分大概就是在0.863左右。于是我一边看以前相似项目的经验帖子,一边思考尝试使用主动学习的一些思想:用逻辑回归训练250个样本后,再训练19750个样本,并且找出其中概率最高和概率最低的样本添加到训练集中,这样我们的训练样本就会增加。但是结果并没有提高,思考后发现,比如我训练的逻辑回归模型,目的是找出一个超平面能够将训练样本准确的分开,于是我们在数据集中添加置信度较高的(概率最高和最低的)样本,但是模型循环训练后分数逐渐降低。我们添加进去的预测为正的样本点可能在实际情况下不是正样本,这就影响了原本正确的超平面的确定,导致分数降低。后来我发现上面的方法就是伪标签法,这场比赛中对同一个模型使用伪标签法得分并不会得到提高,那我们就可以将A模型预测出的准确数据添加到另外一个模型当中,可以降低A模型的偏见,所以可以使用B模型来修正A模型的结果。于是将用Lasso得到的预测结果作为伪标签添加到概率模型中。

6.一些比赛获得的tips

  1. 超参数:无法从学习数据中估计得到的参数就是超参数。
  2. 通过estimator.get_params()得到学习器模型的参数列表和当前取值。超参数空间搜索有以下五个部分组成:
    SKlearn提供了两种通用的参数优化方法:网格搜索与随机采样
    网格搜索交叉验证(GridSearchCV):提供了
    随机采样交叉验证()

你可能感兴趣的:(深度学习,Kaggle,机器学习)