最近结束了数据挖掘的课程设计,做的内容比较简单,是MNIST手写数据集的识别(课程要求),这篇主要是写写其中的一些心得和体会。
项目是我和彭同学一起做的,两个人,他负责用SVM识别,我用MLP和CNN,下面的心得体会是我和他的共同体会,SVM部分的体会来自于他,神经网络部分来自我。
方法和结果
- MNIST数据集的导入可以自行google或百度。
- SVM部分采用的是OvR,原因是参数调整和训练时长。调参,通过五折交叉检验确定搜索区间,然后用网格搜索对惩罚系数C和RBF函数的gamma参数进行搜索。训练时长12分钟,测试集准确率97%.
- MLP是四层,参数601610个。CNN三层卷积一层池化,参数2845个。调参是通过先调层数,再调学习率,最后调权重衰减。训练时间MLP10s一个epoch,10轮左右接近98%,损失函数接近0。CNN20s一个epoch,15轮左右接近97%。损失函数30个epoch到不了0。MLP无论是准确率还是收敛速度,训练时间都比CNN好。
总结
- 可通过learning curve找肘点选取适当的参数,样本量太大时可选择部分样本进行参数调整——因为若参数得当,在少样本上的最优参数在大样本上也极有可能是最优;
- SVM多分类常用OvO,因其样本不平衡问题没有OvR那么突出。但SVM用于分类问题在于训练和检测代价过高,而且难以应用到流式数据中(特别是OvR的SVM,在输入新数据时需要重新训练所有模型!)。所以SVM在工业界或许难以有效应用;
- 深度学习算法调参比较困难,算法理论基础不及SVM的完善。但参数调整好后,训练和检测代价都会与样本量接近线性关系,也能较好地适应流式数据。同时神经网络用Hierarchical Softmax、Subsampling、对稀疏的样本数据可以分布式学习等技巧来优化训练速度和质量,具有较强的拓展性。
- 先了解数据,包括数据的构成,大小,缺失,特征等。若有可能,对数据进行简单可视化。
- 可先抽取少部分数据集,检验代码是否正常运行,和调整模型参数。
- 模型的选取可先从简单模型开始,作为一个baseline,模型简单并不意味着效果不好。
- 神经网络的设计优先设计结构,模型的复杂度体现在网络结构中。
- 本文作者: SFARL
- 本文链接: sfarl.github.io/2020/06/27/dataming_project/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!