我来填坑了,最近好忙,没有时间写博客,今天上午刚刚进行完本课程的实验考试,在这里进行简要汇总。网络
任务介绍
- 利用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再作分类器,不过能够采用多层前向残差网络设计模型。这种模型仍是很简单的,调参功底极大影响最终的成绩。