我来填坑了,最近好忙,没有时间写博客,今天上午刚刚进行完本课程的实验考试,在这里进行简要汇总。
任务介绍
- 利用20000条手写识别数据,提前训练好分类器,考试时只需要跑预测模型即可。
- 本质上一个分类问题,类别总数是10。
- 本任务比较有意思的一点是,老师提供的训练数据,是利用PCA与LDA降维得到的特征,而不是MNIST集原始的RGB特征。因此如果采用深度学习的方法,不适合使用CNN再次抽取特征。
我的模型
- 本实验主要采用ensemble学习的方式,对多个分类器进行集成,其中包括单模型成绩很好的SVM,KNN, MLP,也有单模型效果较弱的随机森林,GBDT模型。
- 在进行集成学习之前,对于每一个单模型,均采用十折交叉验证的方式进行训练,并且使用Stacking融合策略,将每一折验证集拼接,构成新一轮的训练集特征。交叉验证得到了10个不同的单模型,用这些模型分别对测试集进行预测,最后对预测的概率取平均,得到了新一轮的测试集特征。
- 每个单模型生成的数据特征维度为10维(因为一共有10个类别),之后将每个单模型对应的特征向量进行拼接,得到了5x10维的特征(因为一共有5个单模型),最用使用xgboost分类器进行集成学习,预测每个类别的概率值。
训练方式
- 从训练集中分出一部分数据作为验证集,用该验证集指导模型进行收敛,并记录下来模型达到最优情况时的迭代次数。
- 之后不划分验证集,用全体训练集进行模型训练,达到之前记录的迭代次数时,停止训练。
- 之所以采用这种方式,是因为我希望使用更多的数据进行训练,比较适用于训练集数目较小的情况。
实验结果
- 我在线下的最高得分有0.98325,但是今天进行实验考试的时候,成绩只有0.97885。我后来自己思考了一下,应该在Stacking融合阶段,我只是将训练集按照8:2划分验证集,Stacking会导致验证集泄漏,使得得分虚高,正确的做法应该是8:1:1这种划分方式,切分出测试集,并以测试集的分数作为模型真实的得分。如果只是在xgboost阶段划分验证集,有两个问题:
- 此验证集在前面一层stacking中参与了训练过程,容易造成过拟合。
- 验证集应该和测试集的处理过程保持一致。而测试集是十折模型相加取平均的,验证集只是某一折模型的预测结果,不公平,没有指导价值。
- 不过无所谓了,虽然模型过拟合了,但是最后的成绩好像是小组第二。
后记
- 因为数据的特征已经是抽取后的特征,所以不适合用CNN再做分类器,不过可以采用多层前向残差网络设计模型。这种模型还是很简单的,调参功底极大影响最终的成绩。