赞
踩
机器学习-增量训练方法
做过机器学习的同学都知道,有时候训练数据是很多的,几十万几百万也是常有的事。虽然几十万几百万只看记录数不算多,但是如果有几百个特征呢,那数据集是很恐怖的,如果存成numpy.float
类型,那绝对是把内存吃爆。我就是在这种情况下,开始考虑增量模型的增量训练。现在的机器都很便宜了,为什么不能放在服务器上面执行呢?我也有想过这个问题,但是在shell下操作和Windows下操作的开发测试速度差别很大啊,而且就经验来看,只要把数据准备好了,训练并不会占用太多的时间,就算内存装不下的数据,训练起来也就几分钟。没必要动用大数据集群吧。
在超大数据集上,一般有这么几种方法:1. 对数据进行降维,2. 增量训练,使用流式或类似流式处理,3. 上大机器,高内存的,或者用spark集群。
这里我要说的是增量学习。说到增量训练,其实和在线学习是一个意思,在线学习的典型代表是用SGD优化的logistics regress
,先用数据初始化参数,线上来一个数据更新一次参数,虽然时间的推移,效果越来越好。这样就避免了离线更新模型的问题。
好了,说到这里你应该已经明白增量训练的主要用途了吧,主要有两个作用,一个是想办法利用全部的数据,另一个是想办法及时利用新的数据。
特征的机器学习模型的粮食,对特征的处理同样的增量训练需要面对的问题。如果数据量很大,我们一般倾向于抽样训练,也就是在100万条数据里面抽取10万或者5万条数据做训练模型,多次抽样训练多个模型,然后对多模型的预测结果做加权。这是一个好方法,但是不是最佳的方法。
因为抽样后,数据的分布其实是被破坏了,举个例子,数据的分布是偏态,而且存在异常值,结果抽样后异常值丢失,此时数据不需要做异常值处理,而在下一次抽样因为存在异常值导致需要异常值处理,整个数据流程就会乱糟糟的。因此,需要对整个数据做数据分布分析,对特征的计算和变换应该是基于整个数据分布来,而不是抽样后的10万个样本的数据分布。
我们做特征变换,用到的主要是特征的最小值最大值,均值,方差,变异系数,k阶原点矩,k阶中心距,偏度,峰度等几个基本统计量,因此,我们需要算出每一个特征的这些统计量,在新的数据到来的时候,更新这个统计量,在训练模型之前,用全局统计量更新局部数据(抽样数据),以保证数据整体分布信息能够充分利用。
计算全量数据的基本统计量最大的问题是什么?
前面说了,内存不够啊。有什么解决办法呢?有啊,上大数据集群,spark一跑,全部出来了。
这不是我们这里要说的重点,我们要说的是,在有限的内存上,通过增量训练的方法实现特征的增量训练。核心方法是,如何只遍历一遍数据就能算出这些统计量。
这就要参考阿里巴巴杨旭的著作《重构大数据统计》,在第二章中杨旭老师推导了如何只遍历一次数据就能计算大部分基本统计量的方法。下面是基本的基本统计量的计算方法:
n: 数据量
sum: 数据加和
sum2: 平方和
sum3: 立方和
sum4: 四次方和
简单求和:
平方和:
立方和:
四次方和:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。