简要记录,技术细节请查看参考链接,里面附带了如何处理该问题的新链接.
数据层面:
- 得到更多的数据
- 变换加噪得到新数据
- 归一化数据,比如根据output层的激活函数为sigmoid,规整y-value到[0,1]范围,比如tanh,规整到[-1,1]; 建议尝试保留原值和规整[0,1]和[-1,1]三种进行对比.
- 转换数据:
Lean on your intuition. Try things.
Can you pre-process data with a projection method like PCA?
Can you aggregate multiple attributes into a single value?
Can you expose some interesting aspect of the problem with a new boolean flag?
Can you explore temporal or other structure in some other way?
5.特征工程
6.重新定义要解决的问题:
比如说我们可以将其分类问题转换为回归问题;
将二进制的输出转换成softmax的输出.
对其问题的子问题进行建模.
算法层面:
1.尝试多种算法:因为你有可能没有完全理解要解决的问题,所以可以试试不同的算法,比如:
- 试试一些线性的方法,如逻辑回归和线性判别分析
- 试试决策树的方法,如CART,随机森林和GBDT等
- 试试SVM和KNN等
- 试试神经网络,如MLP,CNN,LSTM等
2.多搜搜类似解决该问题的paper,这回给予我们一些新思路和想法.
3.评估算法性能:在算法跑得很慢的情况下,我们无法使用K折交叉验证,那么我们可以试试下面方法:
- 并行训练n个模型,算其平均值和标准方差,可以得到一个更加鲁棒的性能估计.
- 利用train/test划分.但我们得确保划分的合理性,使用可视化,单变量统计试试.
- 试试early stopping,提高验证集的性能
算法调优:
调优神经网络的一些策略:
- 诊断观察:看看模型是否过拟合和欠拟合,花出验证集和训练集在epoch为x轴,准确率为y轴的分析图.
- 权重的初始化:尝试固定网络模型,选择不同的初始化策略.
- 学习率的设置,初始默认一般0.01,如果loss误差降得缓慢,可以试试将其增大10倍,反之,如果loss误差一直在一个范围内浮动,没有降低,可以试试将其减小10倍.如果网络结构比较复杂,可以尝试较大的学习率.
- 激活函数的选择:常常是relu表现良好.在尝试其他激活函数时,要注意rescale数据.
- 网络的结构设置:可以试试单隐层加多个神经元(wide);更深的网络加每层少数的神经元(deep);组合上述两种;尝试解决该类似问题的神经网络结构;从paper上获取灵感;
- batches 和epochs:尝试和训练集等大的batch size;尝试bath size为1的情况;使用grid search(8,16,32,….);尝试少的epochs和大的epochs.
- 正则化:dropout并尝试不同比例 和L1 L2等;不同位置加入dropout,比如说输入层,隐藏层,输出层;对激活函数的惩罚和约束等.
- loss函数和优化算法的选择:可以试试adam和RMSprop(对LSTM的训练效果很好)
- Early Stopping
使用模型融合的方式提高性能
为了得到更高的准确度和更加鲁棒的模型,我们可以尝试模型融合的方式:
- Combine Models:比如我们有多个表现良好的神经网络模型,而且最好确保他们的相互独立,即使用不同的网络结构和技术等.这样才能更好的提高其性能和鲁棒性. 然后我们算其均值作为其最终结果.
- Combine Views:使用不同的scaling和transform技术来对数据进行变换,然后可以尝试上述的重新定义其问题的方法,得到不同的模型,越不同越效果好!
- 尝试stacked / bagging/ boosting进行模型的融合