机器学习—数据平滑
问题:为什么进行平滑?
数据平滑是数据预处理中比较重要的一块,但是往往会忽略它。数据平滑通常对噪声这一块进行处理,平滑的本质就是用来解决零概率问题,尽量使概率分布趋于均匀,使数据变得更可用。
下面介绍几种自己总结的数据平滑的方法:
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平滑方法
参考博客:
https://blog.csdn.net/qq_36523839/article/details/82422865
https://blog.csdn.net/zhangyonggang886/article/details/80901290
推荐阅读
-
Pinterest凭什么拥有那么多用户:机器学习是答案
-
Centos7.6 自带mariadb5.5 平滑升级到 mariadb 10.2 使用国内源,数据无损迁移
-
机器学习—数据平滑
-
智能菌带你一文看懂AI、机器学习、深度学习
-
【机器学习入门二】集成学习及AdaBoost算法的python实现
-
【含课程pdf & 测验答案】吴恩达-机器学习公开课 学习笔记 Week8-2 Dimensionality Reduction
-
机器学习基础(1)
-
机器学习笔记9-Logistic回归实战
-
【含课程pdf & 测验答案】吴恩达-机器学习公开课 学习笔记 Week2-2 Octave/Matlab Tutorial
-
【含课程pdf & 测验答案】吴恩达-机器学习公开课 学习笔记 Week8-1 Unsupervised Learning