公号:码农充电站pro
主页:https://codeshellme.github.iohtml
通常在机器学习的模型训练以前,有一个比较重要的步骤是数据变换。git
由于,通常状况下,原始数据的各个特征的值并不在一个统一的范围内,这样数据之间就没有可比性。github
数据变换的目的是将不一样渠道,不一样量级的数据转化到统一的范围以内,方便后续的分析处理。算法
数据变换的方法有不少,好比数据平滑,数据汇集,数据概化,数据规范化和属性构造等。shell
本篇文章主要介绍数据规范化,这是一种比较经常使用,也比较简单的方法。机器学习
数据规范化是使属性数据按比例缩放,这样就将原来的数值映射到一个新的特定区域中,包括归一化,标准化等。函数
归一化就是获取原始数据的最大值和最小值,而后把原始值线性变换到 [0,1] 范围以内,变换公式为:学习
其中:测试
x
是当前要变换的原始值。min
是当前特征中的最小值。max
是当前特征中的最大值。x'
是变换完以后的新值。注意:
min
和max
是指当前特征中的最小最大值。
因此同一特征以内,最小最大值是同样的。
而不一样特征之间,最小最大值是不同的。3d
从公式中能够看出,归一化与最大最小值有关,这也是归一化的缺点,由于最大值与最小值很是容易受噪音数据的影响。
好比,咱们有如下数据:
编号 | 特征1 | 特征2 | 特征3 |
---|---|---|---|
第1条 | 5 | 465 | 135 |
第2条 | 23 | 378 | 69 |
第3条 | 69 | 796 | 83 |
经过数据能够观察出:
Max(特征1) = 69,Min(特征1) = 5
Max(特征2) = 796,Min(特征2) = 378
Max(特征3) = 135,Min(特征3) = 69
这里咱们用第一条数据来举例,看看是如何变换的。
5
作变换:(5 - 5) / (69 - 5) = 0
465
作变换:(465 - 378) / (796 - 378) = 0.21
135
作变换:(135 - 69) / (135 - 69) = 1
sklearn 库的 preprocessing 模块中的 MinMaxScaler 类就是用来作归一化处理的。
首先引入 MinMaxScaler
类:
>>> from sklearn.preprocessing import MinMaxScaler
准备要变换的 data
数据,并初始化 MinMaxScaler
对象:
>>> data = [[5, 465, 135], [23, 378, 69], [69, 796, 83]] >>> scaler = MinMaxScaler() # 默认将数据拟合到 [0, 1] 范围内
拟合数据:
>>> scaler.fit(data)
输出每一个特征的最大最小值:
>>> scaler.data_max_ # 特征最大值 array([ 69., 796., 135.]) >>> scaler.data_min_ # 特征最小值 array([ 5., 378., 69.])
变换全部数据:
>>> scaler.transform(data) array([[0. , 0.20813397, 1. ], [0.28125 , 0. , 0. ], [1. , 1. , 0.21212121]])
能够对比咱们计算的第一行数据,结果是同样的。
能够用一个
fit_transform
方法,来替换两个方法fit
和transform
。
z-score 标准化是基于正态分布的,该方法假设数据呈现标准正态分布。
正态分布也叫高斯分布,是连续随机变量几率分布的一种,它的数学公式是:
其中,u 为均值(平均数),σ 为标准差。均值和标准差是正态分布的关键参数,它们会决定分布的具体形态。
正态分布有如下特色:
正态分布就是常态分布,正常状态的分布。在现实生活中,大量随机现象的数据分布都近似于正态分布。
正态分布的分布图为:
当 μ 为 0,σ 为 1时,正态分布为标准正态分布。
图中的百分数表示所在面积占总面积的百分比。
z-score 标准化利用正态分布的特色,计算一个给定分数距离平均数有多少个标准差。它的转换公式以下:
其中 x 为原始值,u 为均值,σ 为标准差,x’ 是变换后的值。
通过 z-score 标准化后,高于平均数的分数会获得一个正的标准分,而低于平均数的分数会获得一个负的标准分数。
和归一化相比,z-score 标准化不容易受到噪音数据的影响,而且保留了各维特征对目标函数的影响权重。
sklearn 库的 preprocessing 模块中的 StandardScaler 类就是用来作z-score 标准化处理的。
首先引入 StandardScaler
类:
>>> from sklearn.preprocessing import StandardScaler
准备要变换的 data
数据,并初始化 StandardScaler
对象:
>>> data = [ [5, 465, 135], [23, 378, 69], [69, 796, 83] ] >>> scaler = StandardScaler()
拟合数据:
>>> scaler.fit(data)
输出每一个特征的均值和标准差:
>>> scaler.mean_ # 均值 array([ 32.33333333, 546.33333333, 95.66666667]) >>> scaler.scale_ # 标准差 array([ 26.94851058, 180.078378 , 28.39405259])
变换全部数据:
>>> scaler.transform(data) array([[-1.01427993, -0.45165519, 1.38526662], [-0.34633949, -0.93477815, -0.93916381], [ 1.36061941, 1.38643334, -0.44610281]])
数据变换的目的是将不一样渠道,不一样量级的数据转化到统一的范围以内,方便后续的分析处理。
不一样的机器学习算法,对数据有不一样的要求,因此要针对不一样的算法,对原始数据进行不一样的转换。
数据规范化是经常使用的数据变化方法,包括归一化和标准化等:
数据变换不必定能提升模型的准确度,可是会提升数据的可解释性。
须要注意的是,对训练数据进行了数据变换以后,在测试模型准确度或者预测数据以前,也要对数据进行一样的数据变换。
(本节完。)
推荐阅读:
欢迎关注做者公众号,获取更多技术干货。