欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习—数据平滑

程序员文章站 2024-01-19 08:14:22
...

问题:为什么进行平滑?

数据平滑是数据预处理中比较重要的一块,但是往往会忽略它。数据平滑通常对噪声这一块进行处理,平滑的本质就是用来解决零概率问题,尽量使概率分布趋于均匀,使数据变得更可用。

下面介绍几种自己总结的数据平滑的方法

1.分箱法平滑

首先进行数据排序,将他们分到等宽的箱中(既是分成几部分),然后按照箱中数据的平均值(中值等)进行平滑。

2.回归法平滑

通过数据找到一个回归函数进行数据的平滑,这种方法对连续型数据较好。

例:数据有中两个相关的变量,找到它们之间的关系,用一个函数表示(例:y=kx+b),即建立数学模型去预测下一个数值。

3.加法平滑方法(拉普拉斯平滑)

Ng大牛讲到过的一个差不多的例子:

例子勇士队与湖人队2050年某四场比分如下:

1场    勇士:湖人 = 50 : 52

2场    勇士:湖人 = 51 : 55

3场    勇士:湖人 = 51 : 55

4场    勇士:湖人 = 81 : 85

让你预测下一场比赛湖人胜利的概率,根据上述数据,可得:

                                                                             机器学习—数据平滑

胜率为0吗?显然是有问题的。所以,我们可以对数据进行平滑,比如可以对分子加上1,对分母加上类别总数k(k=2),所以,湖人队的胜率为:

                                                                          机器学习—数据平滑

通过如上的平滑,湖人胜率就由0变为 机器学习—数据平滑

4.用log1p进行平滑

今天做题的时候学到的,我们可以对偏度比较大的数据用log1p函数进行转化,使其更加服从高斯分布,此步处理可能会使我们后续的分类结果得到一个更好的结果;

机器学习—数据平滑

上述 log1p 保证了x数据的有效性。即当x很小时,计算结果可能为0。当换作log1p时,计算结果虽然很小,但是确是一个不为0的结果,这便是它的意义。

贴一段代码:

 #处理离散点
    for col in transform_value_feature + user_fea + log_features:
        #取出最高99.9%值
        ulimit = np.percentile(train_data[col].values,99.9)
        #取出最低0.1%值
        llimit = np.percentile(train_data[col].values,0.1)
        train_data.loc[train_data[col]>ulimit,col] = ulimit
        train_data.loc[train_data[col]<llimit,col] = llimit
        
    for col in user_fea+log_features:
        data[col] = data[col].map(lambda x:np.log1p(x)) #平滑
    return data
train_data = base_process(train_data)
test_data = base_process(test_data)

5.其他平滑
       古德-图灵估计法Katz平滑方法

感兴趣的同学可以看下:http://www.shuang0420.com/2017/03/24/NLP%20%E7%AC%94%E8%AE%B0%20-%20%E5%B9%B3%E6%BB%91%E6%96%B9%E6%B3%95(Smoothing)%E5%B0%8F%E7%BB%93/

 

参考博客:

https://blog.csdn.net/qq_36523839/article/details/82422865

https://blog.csdn.net/zhangyonggang886/article/details/80901290

 

相关标签: 平滑 机器学习