训练数据少但特征过多的办法

    1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批”新”的数据.
    1. Regularization. 数据量比较小会导致模型过拟合, 使得训练误差很小而测试误差特别大. 通过在Loss Function 后面加上正则项可以抑制过拟合的产生. 缺点是引入了一个需要手动调整的hyper-parameter. 详见
    1. Dropout. 这也是一种正则化手段. 不过跟以上不同的是它通过随机将部分神经元的输出置零来实现. =
    1. Unsupervised Pre-training. 用Auto-Encoder或者RBM的卷积形式,一层一层地做无监督预训练,最后加上分类层做有监督的Fine-Tuning.

数据量少的时候应该选择怎样的模型,其实只能回答『That depends』,机器学习领域一大类papers都是关于如何在存在假设的数据中寻找一种合适的表示(『降维』或『升维』),以提高分类器、回归器的性能。
不如,题主举出几个具体问题,比如数据的形式(图像或者文本,是否有缺失),数据的规模(样本数和维度大小),数据中存在的结构信息(稀疏、低秩)。这样更容易回答。

一个case,如下:维度非常高1000多维度,并且每个维度都很重要,数据量很少,是调查结果,只有近万份,数据是很稀疏的,基本上是连续值。

在这种情况下,如何选择模型?为什么?

这其实还是一个比较一般的问题,我尽量从一个比较一般的角度回答,描述的也都是一些常用的简单的做法,假设要做的是一个分类问题,我描述一下我拿到这样一份数据的做法(流程),面对实际情况,我们总是一步一步来,先分析数据,尝试最简单的方案,再作调整。

已知:1000维的feature,近10000的sample,而且数据是稀疏的。首先,尝试一下常用的线性分类器,比如SVM、LR这些,看训练误差和测试误差的差异,这个时候可能出现多种情况。

(1) 如果训练误差远小于测试误差,说明分类器已经过拟合了,考虑如何避免过拟合。
(2) 如果训练误差与测试误差差不多,但是测试误差太大,说明模型复杂度很可能不够。
(3) 如果训练误差与测试误差差不多,而且测试误差已经足够小,结束。

针对(1),这个时候产生了严重的过拟合,这意味着样本数目不够,一般我们没法补充样本。那么就要考虑如何采用提高泛化能力,如果数据没有很特别的性质(稀疏、低秩等),我们可以考虑添加一些常用正则化项,比如L2-norm,还可以使用一些常用的降维方法(其实也就是常用的假设),比如PCA(假设方差小的数据分布方向是噪声产生的)、LDA。

如果数据中有一些性质,比如题主提到feature是稀疏的,由于数据来自『调查结果』,所以很多时候不是数据稀疏,而是数据不完整(被调查的对象没有提供这部分数据,而不是它没有这部分属性),那么可以通过补全这些feature来降低缺失带来的影响,比如假设样本构成矩阵,每一列有一个样本组成,那么我们可以对进行低秩分解,比如,这样的一个列就代表了的一个列,与的乘积又补全了,此时,用作为训练样本可能得到更好的结果。

再比如,数据中存在大量的污染,一些废的feature其实对label影响不大,那么我们可以考虑去除一些feature,降低参数空间,从而提高泛化性,简单的方法是给训练参数加稀疏正则项,比如常用的L1-norm(要是觉得不够系数还可以用capped L1-norm、Lp-norm、SCAD、MCP这些更加稀疏的正则化项),来过滤掉不重要的feature。总而言之,要依赖于数据的特点(除了上面提到的特性,也许还存在正负样本不平衡等性质),设计出减小过拟合程度的方案。

针对(2),可以采用更加复杂的模型,比如带隐变量的模型,比较典型的就是Neural Network,当然这不是唯一的选择,还有决策树以及ensemble类的方法GBDT、Random Forest等。针对不同情况选择合适的模型之后,观察现在的训练误差和测试误差。

回到第(1),(2),(3)步,继续考察新方案。针对具体的业务问题,关键在于迭代得更新方案(不断优化泛化性能),发现数据的新的特性,最终设计出合适于具体业务的模型。

训练数据少但特征过多的办法_第1张图片
Scikit-learn

摘自知乎

你可能感兴趣的:(训练数据少但特征过多的办法)