流量预测中的数据分布问题

我们知道机器学习领域中,投入模型的数据具有一个好的数学分布(主要是高斯分布)无论是对于数据的清洗预处理还是对于模型的学习都有着非常大的作用。

但是现实问题中的数据一般不是高斯分布的,所以怎样将偏态分布的数据转换为正态分布的数据就很值得研究了。

今天就结合我最近遇到的一个问题讲一下log1p函数及其变形。

问题

最近在做流量预测的时候,整理完训练集的数据发现长这样:
流量预测中的数据分布问题_第1张图片
也可以理解,毕竟不管是网页流量还是交通流量,小流量网页/路段的肯定是比真正的大流量数据点要多的;同理其实各种问题中,小点异常值也都是比大点异常值更常出现的(传感器没有记录到、分辨不清晰,白色背景等等。。。)

所以常出现的其实就是这种大致服从正态分布但往一边偏的偏态分布。

解决这种问题一般是用log1p函数,即:
y=log(1+x)(底数a>1)
看一下他的图像:
流量预测中的数据分布问题_第2张图片
其经过原点,且导数是不断衰减的。

所以像上述偏态分布一样后续拖尾,大值数据分布稀疏而少的,我们就可以利用这种导数递减的函数把他的大值区域进行压缩,使临近的分箱合并:
流量预测中的数据分布问题_第3张图片

但是我跑了一下,发现问题并没有解决:
流量预测中的数据分布问题_第4张图片
他的拖尾在处理之后跑到前面去了!

为什么呢?因为y=log(1+x)在小值区的数据变化率太大了。

所以我们要想办法在保证大值区数据变化率缩小的情况下缩小小值区数据变化率:
流量预测中的数据分布问题_第5张图片
这里提供两种思路:

直接进行数据拟合

就是把原始数据导出来,在构造一串等长的正态分布数据,然后直接用python或者matlab去拟合一个函数,直接借助该函数及其反函数实现数据变换。

这个方法适用于所有情况,但显然函数会很复杂,能用缺不够普适。

调整“1”

我们知道我们现在是利用对数函数导数递减的特性进行数据变换,
y=log(1+x)中的1原本是为了使数据过0点。不至于出现负无穷。

现在我们要缩小上图t前面的导数,或者增大t后面的导数,而对数函数的二阶导又是递减的。。。
所以我们修改那个“1”就行了!

即使用函数y=log(c+x),例如我底数取10,c取128,跑出了这种效果:
流量预测中的数据分布问题_第6张图片
正态很多了。。
就是这样移动图像:
流量预测中的数据分布问题_第7张图片

训练集和测试集

变换的是训练集的分布啊,那测试集的数据加入后不会又改变分布吗?
这就要分情况了,像我这个30000多条训练数据,300多条测试数据,大头在训练集上,测试集数据加入顶多在分布上起个包,不疼不痒。
但是你要是测试集数据远大于训练集就不能这么玩了,要另请高明。

你可能感兴趣的:(大数据,深度学习)