0.样本稀疏
样本稀疏,指训练样本少。 此外,可能伴随特征过多的情形(维度灾难)。
方案总结:
1.数据层面
- 数据增广
数据增广,就是尽可能产生更多的样本,比如,一张图像,通过裁剪、变换、翻转、加噪声,获得更多样本;
- 合成数据
比如,通过 GAN 生成数据等。
2.模型层面
数据量比较小会导致模型过拟合, 使得训练误差很小而测试误差特别大.
- 模型正则化
通过在Loss Function 后面加上正则项可以抑制过拟合的产生. 缺点是引入了一个需要手动调整的hyper-parameter.
Dropout是一种神经网络正则化手段,通过随机将部分神经元的输出置零来实现.
-
k折交叉验证
使用k折交叉验证训练模型,可以提供模型的精度,防止划分数据的随机性。 -
集成弱学习器
SVM能在数据量不足,且特征维度高的情况下,进行学习。但是,与神经网络比较,像SVM,GBDT这些弱学习群可能并不能达到理想的效果。对这些模型使用集成学习,提高模型精度。 -
选择合适的模型
机器学习领域一大类papers都是关于如何在存在假设的数据中寻找一种合适的表示(『降维』或『升维』),以提高分类器、回归器的性能。
不同数据的形式(图像或者文本,是否有缺失),数据的规模(样本数和维度大小),数据中存在的结构信息(稀疏、低秩),选择的模型都应该不一样。
3.方法层面
3.1迁移学习
迁移其他数据进行模型学习,并根据任务微调模型。
4.示例
如何选择合适的模型:
维度非常高1000多维度,并且每个维度都很重要,数据量很少,是调查结果,只有近万份,数据是很稀疏的,基本上是连续值。在这种情况下,如何选择模型?为什么?
面对实际情况,一步一步来,先分析数据,尝试最简单的方案,再作调整。
首先,尝试一下常用的线性分类器,比如SVM、LR这些,看训练误差和测试误差的差异,这个时候可能出现多种情况。
(1) 如果训练误差远小于测试误差,说明分类器已经过拟合了,考虑如何避免过拟合。
(2) 如果训练误差与测试误差差不多,但是测试误差太大,说明模型复杂度很可能不够。
(3) 如果训练误差与测试误差差不多,而且测试误差已经足够小,结束。
针对(1),这个时候产生了严重的过拟合,这意味着样本数目不够,一般我们没法补充样本。那么就要考虑如何采用提高泛化能力,如果数据没有很特别的性质(稀疏、低秩等),可以考虑添加一些常用正则化项,比如 L2-norm,还可以使用一些常用的降维方法(其实也就是常用的假设),比如PCA(假设方差小的数据分布方向是噪声产生的)、LDA。
如果数据中有一些性质,比如提到feature是稀疏的,由于数据来自『调查结果』,所以很多时候不是数据稀疏,而是数据不完整(被调查的对象没有提供这部分数据,而不是它没有这部分属性),那么可以通过补全这些feature来降低缺失带来的影响,比如假设样本构成矩阵 X,每一列由一个样本组成,那么对X进行低秩分解,比如 X = D S X = DS X=DS, 这样的 S S S一个列就代表了X的一个列, D D D与 S S S的乘积又补全了 X X X,此时,用 S S S作为训练样本可能得到更好的结果。
再比如,数据中存在大量的污染,一些废的feature其实对label影响不大,那么我们可以考虑去除一些feature,降低参数空间,从而提高泛化性,简单的方法是给训练参数加稀疏正则项,比如常用的L1-norm(要是觉得不够系数还可以用capped L1-norm、Lp-norm、SCAD、MCP这些更加稀疏的正则化项),来过滤掉不重要的feature。总而言之,要依赖于数据的特点(除了上面提到的特性,也许还存在正负样本不平衡等性质),设计出减小过拟合程度的方案。
针对(2),可以采用更加复杂的模型,比如带隐变量的模型,比较典型的就是Neural Network,当然这不是唯一的选择,还有决策树以及ensemble类的方法GBDT、Random Forest等。针对不同情况选择合适的模型之后,观察现在的训练误差和测试误差。
回到第(1),(2),(3)步,继续考察新方案。针对具体的业务问题,关键在于迭代得更新方案(不断优化泛化性能),发现数据的新的特性,最终设计出合适于具体业务的模型。
最近开通了个公众号,主要分享python原理与应用,推荐系统,风控等算法相关的内容,感兴趣的伙伴可以关注下。
公众号相关的学习资料会上传到QQ群596506387,欢迎关注。
参考: