-
2018-06-21 14:15:54
特征缩放
参考资料
维基百科
知乎
数据标准化/归一化normalization
sklearn
pandas & numpy
numpy中标准差std的神坑目的
1.提高梯度下降的收敛速度。
- 原始数据的代价函数收敛:
- 特征缩放后:
2. 如果原始数据的特征之间差别很大,不进行特征缩放的话,会导致某些机器学习算法无法正常完成工作。比如很多分类器是通过计算欧氏距离来计算数据与数据之间的距离,如果某个特征的范围比其他特征大的多,可能距离就受到了该特征的支配。
3. batch normalization,批规范化,BN,可以防止梯度爆炸\梯度消失\振荡。方法
1. rescaling
将数据的特征按比例缩放到[0,1]的区间,公式如下:
x̂ (j)i=x(j)i−min(xi)max(xi)−min(xi) x ^ i ( j ) = x i ( j ) − m i n ( x i ) m a x ( x i ) − m i n ( x i )2. mean normalization
缩放到[-1, 1]的区间,公式如下:
x̂ (j)i=x(j)i−mean(xi)max(xi)−min(xi) x ^ i ( j ) = x i ( j ) − m e a n ( x i ) m a x ( x i ) − m i n ( x i )3. standardization
又称之为: Z−score normalization Z − s c o r e n o r m a l i z a t i o n ,将所有数据缩放到平均值为0,方差为1, 如果数据服从正态分布,则现在为标准正态分布,如果数据不服从正态分布,那么缩放后不是标准正态分布,只是服从均值为0,方差为1。数据缩放后在0左右分布,但不一定就在[0,1]范围内,有可能超出:
z=xi−μσ z = x i − μ σ
其中, μ μ 为对应特征 xi x i 的均值, σ σ 为对应特征 xi x i 的标准差。
原始数据最好近似为正态分布,否则缩放的结果不理想。4.scaling to unit length
x′=x||x|| x ′ = x | | x | |
都变成了单位向量直观感受:
# -*- coding: utf-8 -*- import numpy as np from functools import reduce from math import sqrt data_set = np.array([0.0, 1, 2, 3, 4, 5]) min_data = data_set.min() max_data = data_set.max() mu = data_set.mean() sigma = sqrt(reduce(lambda x, y: x + y, map(lambda z: (z - mu) ** 2, data_set)) / len(data_set)) data_set_rescaling = list(map(lambda x: (x - min_data) / (max_data - min_data), data_set)) data_set_mean_normalization = list(map(lambda x: (x - mu) / (max_data - min_data), data_set)) data_set_standardization = list(map(lambda x: (x - mu) / sigma, data_set)) data_set_scaling_to_unit_length = list(map(lambda x: x/x if x != 0 else 0.0, data_set)) print(data_set) print(data_set_rescaling) print(data_set_mean_normalization) data_set_standardization = [float('%.2f' % data) for data in data_set_standardization] print(data_set_standardization) print(data_set_scaling_to_unit_length)
[0. 1. 2. 3. 4. 5.] [0.0, 0.2, 0.4, 0.6, 0.8, 1.0] [-0.5, -0.3, -0.1, 0.1, 0.3, 0.5] [-1.46, -0.88, -0.29, 0.29, 0.88, 1.46] [0.0, 1.0, 1.0, 1.0, 1.0, 1.0]
scikit learn的API
1. rescaling
使用
MinMaxScaler
或者MaxAbsScaler
MinMaxScaler
将数据按照比例缩放到
[0,1]
区间。
保留比例关系。
如果给出参数feature_range=(min, max)
的值,可以缩放到任意区间。
运算公式是:
x_std = (x - x.min(axis=0)) / (x.max(axis=0) - x.min(axis=0))
x_scaled = x_std * (max - min) + min
其中,min
、max
为feature_range=(min, max)
传入的参数,默认为(0,1)
# coding:utf-8 from sklearn import preprocessing import numpy as np x_train = np.array([[1., 3, 5], [2, 3, 3], [4, 5, 3], ]) x_test = [[-1., 1., 0.]] min_max_scaler = preprocessing.MinMaxScaler() # 按照列 x_train_min_max = min_max_scaler.fit_transform(x_train) # 也可以fit(x_train).transform(x_train) x_test_min_max = min_max_scaler.transform(x_test) print('最小最大值缩放:\n训练集:\n{}'.format(x_train_min_max)) print('测试集:\n{}'.format(x_test_min_max)) # 即:x * (1\(max-min))- min,也就是,x * scale_ - min_ print(min_max_scaler.scale_) # 数据的缩放比例,即1/(max - min) print(min_max_scaler.min_) # -min的min
输出:
最小最大值缩放: 训练集: [[0. 0. 1. ] [0.33333333 0. 0. ] [1. 1. 0. ]] [0.33333333 0.5 0.5 ] [-0.33333333 -1.5 -1.5 ]
MaxAbsScale
将数据缩放到
[-1, 1]
区间。
通过除以最大值的绝对值实现,能够保留原矩阵中的0元素的位置。
可以使用到已经分布在0左右的数据集中。
也可以使用到稀疏矩阵中。# coding:utf-8 from sklearn import preprocessing import numpy as np x_train = np.array([[1., 3, 5], [2, 3, 3], [4, 5, 3], ]) x_test = [[-1., 1., 0.]] max_abs_scaler = preprocessing.MaxAbsScaler().fit(x_train) x_train_max_abs = max_abs_scaler.transform(x_train) x_test_max_abs = max_abs_scaler.transform(x_test) print('最大值绝对值缩放:\n训练集:\n{}\n测试集:\n{}'.format(x_train_max_abs, x_test_max_abs))
输出:
最大值绝对值缩放: 训练集: [[0.25 0.6 1. ] [0.5 0.6 0.6 ] [1. 1. 0.6 ]] 测试集: [[-0.25 0.2 0. ]]
3. standardization
使用
scale
或者兼顾测试集的StandardScaler
(测试集数据用训练集的 μ μ 、 σ σ 缩放)
如果数据需要预处理为均值为0,标准差为1的数据,使用该方法。# coding:utf-8 from sklearn import preprocessing import numpy as np x_train = np.array([[1., 3, 5], [2, 3, 3], [4, 5, 3], ]) x_test = [[-1., 1., 0.]] print('训练集均值:{}'.format(x_train.mean(axis=0))) # axis=0, columns, axis=1, row print('训练集标准差:{}'.format(x_train.std(axis=0))) # 特征缩放,矩阵的每一个列向量的均值缩放为0,标准差为1 # 即,每一个列向量看成是是一个特征。 # (x - mu) / sigma print('\n特征缩放:\n缩放为均值为0,标准差为1:') x_scaled = preprocessing.scale(x_train) print(x_scaled) print('\n缩放后的均值:{}'.format(x_scaled.mean(axis=0))) # 均值为0 print('缩放后的标准差:{}'.format(x_scaled.std(axis=0))) # 标准差为1 # 标准缩放类 # 可以让测试集有和训练集一样的特征缩放 print('\n特征缩放:\n缩放为均值为0,标准差为1,且测试集和训练集同缩放变换:') scaler = preprocessing.StandardScaler(with_mean=False,).fit(x_train) print('训练集均值:{}'.format(scaler.mean_)) print('训练集标准差:{}'.format(scaler.scale_)) print('\n缩放后的训练集:\n{}'.format(scaler.transform(x_train))) print('\n缩放后的测试集:\n{}'.format(scaler.transform(x_test)))
输出:
训练集均值:[2.33333333 3.66666667 3.66666667] 训练集标准差:[1.24721913 0.94280904 0.94280904] 特征缩放: 缩放为均值为0,标准差为1: [[-1.06904497 -0.70710678 1.41421356] [-0.26726124 -0.70710678 -0.70710678] [ 1.33630621 1.41421356 -0.70710678]] 缩放后的均值:[-1.48029737e-16 1.48029737e-16 1.48029737e-16] 缩放后的标准差:[1. 1. 1.] 特征缩放: 缩放为均值为0,标准差为1,且测试集和训练集同缩放变换: 训练集均值:[2.33333333 3.66666667 3.66666667] 训练集标准差:[1.24721913 0.94280904 0.94280904] 缩放后的训练集: [[-1.06904497 -0.70710678 1.41421356] [-0.26726124 -0.70710678 -0.70710678] [ 1.33630621 1.41421356 -0.70710678]] 缩放后的测试集: [[-2.67261242 -2.82842712 -3.8890873 ]] Process finished with exit code 0
pandas & numpy
原始数据:
# coding:utf-8 import numpy as np import pandas as pd data = pd.DataFrame(np.arange(16).reshape(4, 4)) print(data) ''' 0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 '''
min max normalization:
# min max normalization # method one data_min_max = (data - data.min()) / (data.max() - data.min()) print(data_min_max) ''' 0 1 2 3 0 0.000000 0.000000 0.000000 0.000000 1 0.333333 0.333333 0.333333 0.333333 2 0.666667 0.666667 0.666667 0.666667 3 1.000000 1.000000 1.000000 1.000000 ''' # method two data_min_max_02 = data.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x))) print(data_min_max_02) ''' 结果同上 '''
mean normalization:
# mean normalization # (x - mean)/(max - min) # method one data_mean_normalization = (data - data.mean()) / (data.max() - data.min()) print(data_mean_normalization) ''' 0 1 2 3 0 -0.500000 -0.500000 -0.500000 -0.500000 1 -0.166667 -0.166667 -0.166667 -0.166667 2 0.166667 0.166667 0.166667 0.166667 3 0.500000 0.500000 0.500000 0.500000 ''' # method two data_mean_normalization_02 = data.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x))) print(data_mean_normalization_02) ''' 结果同上 '''
standardization:
# z score normalization, standardization # method one data_standardization = (data - data.mean()) / data.std() print(data_standardization) ''' 0 1 2 3 0 -1.161895 -1.161895 -1.161895 -1.161895 1 -0.387298 -0.387298 -0.387298 -0.387298 2 0.387298 0.387298 0.387298 0.387298 3 1.161895 1.161895 1.161895 1.161895 ''' # method two data_standardization_02 = data.apply(lambda x: (x - np.mean(x)) / np.std(x)) print(data_standardization_02) ''' 0 1 2 3 0 -1.341641 -1.341641 -1.341641 -1.341641 1 -0.447214 -0.447214 -0.447214 -0.447214 2 0.447214 0.447214 0.447214 0.447214 3 1.341641 1.341641 1.341641 1.341641 ''' # fixme 结果不一样
pandas 的mean()和numpy的mean()结果是一样的。
pandas的std()和numpy的std()结果不同。
可能是涉及到了对数据的标准差的计算公式不同。
样本标准差:S=1N−1∑i=1N(Xi−X⎯⎯⎯⎯)‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾⎷ S = 1 N − 1 ∑ i = 1 N ( X i − X ¯ )
其中, X⎯⎯⎯⎯ X ¯ 是样本 X1,...,Xi,...,XN X 1 , . . . , X i , . . . , X N 的样本均值。N为样本数量。
总体标准差:σ=1N∑i=1N(Xi−μ)‾‾‾‾‾‾‾‾‾‾‾‾‾‾⎷ σ = 1 N ∑ i = 1 N ( X i − μ )
其中, μ μ 为总体数据的均值。N为总体数量。data_pd = pd.DataFrame([1, 2, 3]) # 样本标准差:1, 总体标准差:0.81 std_pd = data_pd.std() std_np = data_pd.apply(lambda x: np.std(x)) print(std_pd) print(std_np) ''' 0 1.0 dtype: float64 0 0.816497 dtype: float64 '''
也就是,pandas的
std()
默认将数据当做样本数据计算,采用无偏估计。(N-1)
numpy的std()
默认将数据视为整体数据,而不是抽样的样本,计算的是总体标准差。(N)ddof=0
总体标准差,ddof=1
样本标准差。- numpy的
std()
的ddof
默认为0。计算无偏估计标准差的参数是np.std(x, ddof=1)
。 - pandas的
std()
的ddof
默认为1。若x.std(ddof=0)
,计算的就是总体标准差。
更多相关内容 -
机器学习笔记 - 何时进行特征缩放
2022-03-21 09:31:54特征缩放是一种用于标准化自变量或数据特征范围的方法。在数据处理中,也称为数据归一化,通常在数据预处理步骤中执行。 举个例子——如果你有多个独立变量,比如年龄、薪水和身高;它们的范围分别为(18-100 年)、...一、什么是特征缩放
特征缩放是一种用于标准化自变量或数据特征范围的方法。在数据处理中,也称为数据归一化,通常在数据预处理步骤中执行。
举个例子——如果你有多个独立变量,比如年龄、薪水和身高;它们的范围分别为(18-100 年)、(25,000-75,000 欧元)和(1-2 米),特征缩放将帮助它们都处于同一范围内,例如以 0 为中心或在范围内(0,1) 取决于缩放技术。
为了将上述内容可视化,让我们以 存放在 UCI 机器学习存储库中的“葡萄酒数据集”中的葡萄酒数据集中的酒精和苹果酸含量的自变量为例 。您可以在下面看到两种最常见的缩放技术(标准化和标准化)对数据集的影响。
标准化和规范化对 Wine 数据集的影响 二、缩放方法
1、Min-Max Normalization
称为最小-最大缩放或最小-最大归一化,它是最简单的方法,这种技术重新缩放特征或观察值,分布值在 0 和 1 之间。
归一化的一般公式如下:
其中max(x) 和 min(x) 分别是特征的最大值和最小值。
我们还可以对不同的区间进行归一化,例如选择将变量放置在任何 [a, b] 区间中,a 和 b 是实数。要重新调整任意一组值 [a, b] 之间的范围,公式变为:
2、Standardization
特征标准化使数据中每个特征的值具有零均值和单位方差。一般的计算方法是确定每个特征的分布均值和标准差,并通过以下公式计算新的数据点。
σ是特征向量的标准差,x̄是特征向量的平均值。
3、Scaling to unit length
该方法的目的是缩放特征向量的分量,使得完整向量的长度为 1。这通常意味着将每个分量除以向量的欧几里得长度。
除了上述 3 种广泛使用的方法外,还有一些其他方法可以缩放特征,即。Power Transformer、Quantile Transformer、Robust Scaler 等。
三、归一化还是标准化?
这个问题并没有标准答案。但有一些通用的经验可以参考。
1、当数据的分布不遵循高斯分布时,归一化很适合。它在不假设任何数据分布(如 K-最近邻)的算法中很有用。
2、在需要 0-1 尺度数据的神经网络算法中,归一化是必不可少的预处理步骤。数据归一化的另一个流行示例是图像处理,其中必须对像素强度进行归一化以适应特定范围(即 RGB 颜色范围为 0 到 255)。
3、在数据遵循高斯分布的情况下,标准化 可能会有所帮助。虽然这不一定是真的。由于标准化没有边界范围,因此,即使数据中存在异常值,它们也不会受到标准化的影响。
4、在聚类分析中,标准化可以方便地根据某些距离度量比较特征之间的相似性。另一个突出的例子是主成分分析,我们通常更喜欢标准化而不是 Min-Max 缩放,因为我们对最大化方差的组件感兴趣。
在决定是否需要标准化或标准化时,可以考虑一些要点
- 当数据表示高斯分布时可以使用标准化,而标准化对于非高斯分布非常有用
- 异常值的影响在标准化中非常高
总而言之, 您始终可以从将模型拟合到原始、标准化和标准化数据开始,然后比较性能以获得最佳结果。
四、数据缩放的影响
1、基于梯度下降的算法
如果算法使用梯度下降,那么特征范围的差异将导致每个特征的步长不同。为了确保梯度下降平稳地向最小值移动,并且梯度下降的步骤以相同的速率更新所有特征,我们在将数据输入模型之前对其进行缩放。具有相似规模的特征将有助于梯度下降更快地收敛到最小值。
具体来说,在神经网络算法的情况下,特征缩放有利于优化:
- 它使训练更快
- 它可以防止优化陷入局部最优
- 它提供了更好的误差表面形状
- 可以更方便地进行权重衰减和贝叶斯优化
2、基于距离的算法
KNN、K-means 和 SVM 等基于距离的算法受特征范围的影响最大。这是因为他们在幕后使用数据点之间的距离来确定它们的相似性,从而执行手头的任务。因此,我们在采用基于距离的算法之前对数据进行缩放,以便所有特征对结果的贡献相同。
3、使用 PCA 进行特征工程
在 PCA 中,我们对使方差最大化的组件感兴趣。如果一个组成部分(例如年龄)由于它们各自的比例而变化小于另一个组成部分(例如薪水),如果这些特征没有按比例缩放,PCA 可能会确定最大方差的方向更接近于“薪水”轴。由于一岁的变化可以被认为比一欧元的工资变化重要得多,这显然是不正确的。
数据标准化对 PCA 的影响 4、回归
在回归中,通常建议对特征进行缩放,使预测变量的平均值为 0。当预测变量值设置为其平均值时,这使得截距项更容易解释为 Y 的预期值。
5、基于树的算法
不需要进行特征缩放。
基于树的算法对特征的规模相当不敏感。决策树仅基于单个特征拆分节点。决策树在增加节点同质性的特征上分割节点。一个特征上的这种分割不受其他特征的影响。因此,其余特征对拆分几乎没有影响。这就是使它们不受特征规模影响的原因。
五、特征缩放示例
1、数据集
Country Age Salary Purchased France 44 72000 No Spain 27 48000 Yes Germany 30 54000 No Spain 38 61000 No Germany 40 Yes France 35 58000 Yes Spain 52000 No France 48 79000 Yes Germany 50 83000 No France 37 67000 Yes 2、参考代码
# Python code explaining How to # perform Feature Scaling """ PART 1 Importing Libraries """ import numpy as np import matplotlib.pyplot as plt import pandas as pd # Sklearn library from sklearn import preprocessing """ PART 2 Importing Data """ data_set = pd.read_csv('C:\\Users\\dell\\Desktop\\Data_for_Feature_Scaling.csv') data_set.head() # here Features - Age and Salary columns # are taken using slicing # to handle values with varying magnitude x = data_set.iloc[:, 1:3].values print ("\nOriginal data values : \n", x) """ PART 4 Handling the missing values """ from sklearn import preprocessing """ MIN MAX SCALER """ min_max_scaler = preprocessing.MinMaxScaler(feature_range =(0, 1)) # Scaled feature x_after_min_max_scaler = min_max_scaler.fit_transform(x) print ("\nAfter min max Scaling : \n", x_after_min_max_scaler) """ Standardisation """ Standardisation = preprocessing.StandardScaler() # Scaled feature x_after_Standardisation = Standardisation.fit_transform(x) print ("\nAfter Standardisation : \n", x_after_Standardisation)
3、归一化结果
[[ 0.33333333 0.86585366] [ 0. 0.57317073] [ 0.05882353 0.64634146] [ 0.21568627 0.73170732] [ 0.25490196 0. ] [ 0.15686275 0.69512195] [ 1. 0.62195122] [ 0.41176471 0.95121951] [ 0.45098039 1. ] [ 0.19607843 0.80487805]]
4、标准化结果
[[ 0.09536935 0.66527061] [-1.15176827 -0.43586695] [-0.93168516 -0.16058256] [-0.34479687 0.16058256] [-0.1980748 -2.59226136] [-0.56487998 0.02294037] [ 2.58964459 -0.25234403] [ 0.38881349 0.98643574] [ 0.53553557 1.16995867] [-0.41815791 0.43586695]]
-
【机器学习】什么是特征缩放?如何去实现特征缩放?
2022-07-02 23:24:51当我们的特征值的取值范围太大或者太小时,使用梯度下降来使得代价函数最小化会很慢,这时候我们一般都会进行特征缩放。系列文章目录
第七章 Python 机器学习入门之特征缩放与多项式回归
前言
特征缩放可以使得梯度下降 gradient descent 的幅度更大,程序运行的更快,因为有些时候如果一个特征值太大,那么它对应的参数就会很小,一个很小的改变,都会对输出结果产生很大的影响,在进行梯度下降时,也会花费很大的时间,解决这个问题的方法就是特征缩放。
一、特征缩放是什么?
我们先来看看特征的大小,也就是特征的数值大小与相关参数的大小之间的关系
举个例子,我们使用两个特征值X来预测房子的价格,
假设这两个特征值分别是:x1房子的大小, x2卧室的数量
很明显x1 要比 x2 大的多如果已知一个房子的大小为2000,有5个卧室,价格为500k,我们来求其它两个参数w1,w2
不难发现当一个特征x1较大时,与之对应的参数w1应该较小,反之也是一样
下面来看看特征的散点图,左边,
横轴 房子的大小 这个特征值 比 纵轴 卧室的规模 这个特征值 要大得多,或者说取值的范围要大得多来看看代价函数的等高线图,右边,横轴 参数的取值范围很小,纵轴很大,这说明w1一个很小的变化都会对 估计价格 产生很大的影响,对代价函数也会有很大的影响,因为w1要乘以一个很大的数 房子的大小,而w2 与之相反。
如果我们直接使用训练数据,当使用梯度下降来使得代价函数最小化时,它可能会来回跳很长时间才能找到,原因就是w1一个很小的变化都会对代价函数产生很大的影响,为了解决这个问题,一个有用的做法就是特征缩放,就是对训练数据做一些转换,
如果我们可以将两个特征的取值范围都缩放到0到1之间,
那么使用梯度下降来找到代价函数最小值是不是更加简单了。二、如何去实现特征缩放
1.将特征值除以最大值
如果一个特征x1 的取值范围是300 到 2000,那么一种特征缩放的方法就是除以最大值,将x1/2000,缩放后x1的取值范围在0.15到1之间。
2.均值归一化
另一种方法是均值归一化,重新计算训练数据,使它们都在0 附近,取值范围在(-1,1)间,
如果要对x1 数据进行均值归一化,我们首先要在数据集上找到平均值u1,计算公式如图3.z-score 归一化
第三种方法是z-score 归一化,我们需要计算每个特征的标准差和平均值
标准差的求法:
1. 计算数据的平均值 u1
2. 计算方差,将每个数据减去平均值,取平方,再除以数据的个数
3. 将方差开平方,得到的结果就是标准差
总结一下,当我们的特征值的取值范围太大或者太小时,使用梯度下降来使得代价函数最小化会很慢,这时候我们一般都会进行特征缩放。
总结
总结一下,当我们的特征值的取值范围太大或者太小时,使用梯度下降来使得代价函数最小化会很慢,这时候我们一般都会进行特征缩放。
-
一文弄懂特征缩放(归一化/正则化)
2020-05-21 11:32:34特征缩放什么?为什么归一化、标准化容易混淆,如何区分呢。 本来为大家来分析一下。引言
特征缩放是机器学习预处理数据中最重要的步骤之一,它有时能决定学习模型的好坏。
特征缩放的作用如下:
- 加快梯度下降
- 提升模型精度(消除不同量纲)
- 防止梯度爆炸(消除过大值的影响)
为什么要特征缩放
在机器学习算法处理数据时通常是忽略数据的单位信息的,或者说不知道这些数据代表什么。比如50kg和50公里代表着两个不同的度量,人类是很容易区分它们的。但是对于机器来说,这两个数据是一样的。
import pandas as pd import numpy as np data = np.array([[1,172,30000],[2,160,60000],[3,175,50000],[4,180,5000]]) df = pd.DataFrame(data,columns=['staff','height','salary']) df
我们来看下上面的表格,上面是员工身高与薪水的表格。我们人类看到数字172(cm)知道就是身高,看到5000知道肯定是薪水。但是机器就不知道。
假设用神经网络来学习这份数据,那么就会导致取值范围更大的薪水会主导模型的训练,也就是模型会偏向于薪水,但通常我们不希望我们的算法一开始就偏向于某个特征。
假设我们尝试计算两个员工的欧氏距离,在特征缩放之前的结果是:
员工1和员工2的距离: ( 172 − 160 ) 2 + ( 30000 − 60000 ) 2 = 30000.002 \sqrt{(172-160)^2 + (30000 - 60000)^2} = 30000.002 (172−160)2+(30000−60000)2=30000.002
员工2和员工3的距离: ( 160 − 175 ) 2 + ( 60000 − 50000 ) 2 = 10000.011 \sqrt{(160-175)^2 + (60000 - 50000)^2} = 10000.011 (160−175)2+(60000−50000)2=10000.011从上面的结果可以看到它们的距离基本上就是薪水的差值。
而在经过最大最小值归一化后(下文会讲到)的结果是:
员工1和员工2的距离: ( 0 − 0.6 ) 2 + ( 0.45 − 1 ) 2 = 0.814 \sqrt{(0-0.6)^2 + (0.45 - 1)^2} = 0.814 (0−0.6)2+(0.45−1)2=0.814
员工2和员工3的距离: ( 160 − 175 ) 2 + ( 60000 − 50000 ) 2 = 0.773 \sqrt{(160-175)^2 + (60000 - 50000)^2} = 0.773 (160−175)2+(60000−50000)2=0.773显然经过特征缩放后的结果更具有可比性。
这个问题不仅会出现在神经网络里面,还会出现在任何基于距离计算的算法中。特征缩放就可以解决这个问题。
特征缩放有哪些方法
有很多种特征缩放的方法,我们一一来分析。
均值归一化(Mean Normalization)
将数值范围缩放到 [ − 1 , 1 ] [-1,1] [−1,1]区间里,数据的均值变为 0 0 0
x ′ = x − m e a n ( x ) m a x ( x ) − m i n ( x ) x^\prime = \frac{x - mean(x)}{max(x) - min(x)} x′=max(x)−min(x)x−mean(x)
以上面的例子说明,假设我们要均值归一化员工1的薪水。那么 m e a n ( x ) = 36250 , m a x ( x ) = 60000 , m i n ( x ) = 5000 mean(x) = 36250,max(x) = 60000,min(x) = 5000 mean(x)=36250,max(x)=60000,min(x)=5000
x ′ = 30000 − 36250 60000 − 5000 = − 0.1136 x^\prime = \frac{30000 - 36250}{60000 - 5000} = -0.1136 x′=60000−500030000−36250=−0.1136
下面是对薪水和身高进行均值归一化的结果:
data_mean = data[:,1:] data_mean = (data_mean - data_mean.mean(axis=0)) / (data_mean.max(axis=0) - data_mean.min(axis=0)) pd.DataFrame(np.c_[np.arange(1,5),data_mean],columns=['staff','height','salary'])
最大最小值归一化(Min-Max Normalization)
最大最小值归一化简称为归一化,将数值范围缩放到 [ 0 , 1 ] [0,1] [0,1]区间里
x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^\prime = \frac{x - min(x)}{max(x) - min(x)} x′=max(x)−min(x)x−min(x)
以上面的例子说明,假设我们要最大最小值归一化员工1的薪水。那么 m e a n ( x ) = 36250 , m a x ( x ) = 60000 , m i n ( x ) = 5000 mean(x) = 36250,max(x) = 60000,min(x) = 5000 mean(x)=36250,max(x)=60000,min(x)=5000
x ′ = 30000 − 5000 60000 − 5000 = 0.455 x^\prime = \frac{30000 - 5000}{60000 - 5000} = 0.455 x′=60000−500030000−5000=0.455
下面是对薪水和身高进行均最大最小值归一化的结果:
data_min_max = data[:,1:] data_min_max = (data_min_max - data_min_max.min(axis=0)) / (data_min_max.max(axis=0) - data_min_max.min(axis=0)) pd.DataFrame(np.c_[np.arange(1,5),data_min_max],columns=['staff','height','salary'])
标准化/z值归一化(Standardization/Z-Score Normalization)
标准化又叫z值归一化,将数值缩放到0附近,且数据的分布变为均值为0,标准差为1的标准正态分布。
x ′ = x − m e a n ( x ) σ ( x ) x^\prime = \frac{x - mean(x)}{\sigma(x)} x′=σ(x)x−mean(x)
σ ( x ) \sigma(x) σ(x)是 x x x的标准差,计算公式为:
σ ( x ) = 1 N ∑ i = 1 N ( x i − m e a n ( x ) ) 2 \sigma(x) = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - mean(x))^2} σ(x)=N1i=1∑N(xi−mean(x))2以上面的例子说明,假设我们要标准化员工1的薪水。那么 m e a n ( x ) = 36250 , σ ( x ) = 21028 mean(x) = 36250,\sigma(x)=21028 mean(x)=36250,σ(x)=21028
x ′ = 30000 − 36250 21028 = − 0.2972 x^\prime = \frac{30000 - 36250}{21028} = -0.2972 x′=2102830000−36250=−0.2972
下面是对薪水和身高进行标准化的结果:
data_std = data[:,1:] data_std = (data_std - data_std.mean(axis=0)) / (data_std.std(axis=0)) pd.DataFrame(np.c_[np.arange(1,5),data_std],columns=['staff','height','salary'])
常见问题&注意事项
哪些算法需要特征缩放
特征缩放对基于距离的算法特别重要。因此像KNN、线性回归、逻辑回归、SVM等都需要特征缩放。
不基于距离的算法像朴素贝叶斯以及基于树结构的算法(决策树、随机森林)等不需要特征缩放。另外,0/1取值的特征不需要归一化。
归一化还是标准化
- 如果你知道数据分布不是正态分布,那么使用归一化。像用在KNN和NN这种不假设数据分布的算法就很合适。 最大最小值归一化容易受异常值影响,常用于归一化图像的灰度值。
- 当数据是正态分布时进行标准化是很有帮助的,不像归一化,标准化的数据没有限定范围,对异常值不敏感。
- 然后,具体的选择还是依赖于你的数据或算法,通常最好归一化和标准化都尝试一下,看哪种方法好。
注意事项
需要先把数据拆分成训练集与验证集,在训练集上计算出需要的数值(如均值和标准值),对训练集数据做标准化/归一化处理(不要在整个数据集上做标准化/归一化处理,因为这样会将验证集的信息带入到训练集中,这是一个非常容易犯的错误),然后再用之前计算出的数据(如均值和标准值)对验证集数据做相同的标准化/归一化处理。
参考
- https://www.cnblogs.com/HuZihu/p/9761161.html
- https://www.analyticsvidhya.com/blog/2020/04/feature-scaling-machine-learning-normalization-standardization
- https://machinelearningknowledge.ai/feature-scaling-machine-learning/
-
数据处理之特征缩放与编码
2022-02-28 11:41:28目录 0、前言 1、特征缩放 1.1 归一化 1.1.1 Min-Max Scaling 1.1.2 Z-Score Normalization 1.1.3 归一化总结 1.2 正则化 1.3 归一化与正则化比较 ...数据处理之特征缩放和特征编码,特征缩放主要是归一化 -
特征工程之特征缩放&特征编码
2019-02-18 21:14:24机器学习入门系列(2)–如何构建一个完整的机器...本篇文章会继续介绍特征工程的内容,这次会介绍特征缩放和特征编码,前者主要是归一化和正则化,用于消除量纲关系的影响,后者包括了序号编码、独热编码等,主要... -
【机器学习】漫谈特征缩放
2021-08-10 00:39:35作者:时晴说起"炼丹"最耗时的几件事,首先就能想到的就是数据清洗,特征工程,还有调参.特征工程真的是老生常谈了,但是特征工程又是最重要的一环,这一步做不好怎么调参也没用.... -
2. 特征缩放(归一化)
2021-12-07 15:55:25为了消除数据特征之间的量纲影响,我们需要对特征进行`归一化处理`,使得不同指标之间具有可比性。...同时,`特征归一化`可提高模型精度和模型收敛速度,是预处理的重要环节之一,特征归一化又叫`特征缩放`。 -
特征缩放概念及方法
2021-07-17 21:46:18公式:newValue = (oldValue-u)/ s 总结: 1、 特征缩放法:就是将数值相差较大的特征缩放的过程。 2、 特征缩放法常用方法之一:数据归一化处理。 3、 特征缩放法常用方法之二:均值标准化。 3、不同的应用背景... -
特征缩放,归一化
2021-11-17 10:20:49使用特征缩放的作用是: 使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确。 加快学习算法的收敛速度。 缩放过程可以分为以下几种: 缩放到均值为0,方差为1(Standardization——... -
机器学习——特征缩放
2019-11-15 16:15:00文章目录特征缩放1、特征缩放作用2、特征缩放的四种方式3、sklearn实现特征缩放 特征缩放 1、特征缩放作用 面对特征数量较多的时候,保证这些特征具有相近的尺度(无量纲化),可以使梯度下降法更快的收敛。这两张图... -
为什么要做特征缩放,怎么做特征缩放,什么时候做特征缩放?特征缩放三连了解一下!...
2019-05-09 07:30:00点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”作者:Sudharsan Asaithambi编译:ronghuaiyang导读在使用某些算法时,特征缩放可能会... -
Python机器学习实战:特征缩放的3个方法
2020-09-17 17:17:40什么是特征缩放? 特征缩放(feature scaling): 改变特征的取值范围,缩放到统一的区间,例如[0,1][0, 1][0,1]. 为什么要进行特征缩放? 数据集包含众多特征,每个特征的尺度(scale)不同,有的特征的单位是小时,有的... -
大数据预处理——数据特征缩放
2021-06-28 16:40:53文章目录数据特征缩放的概念一、数据特征缩放的意义二、数据特征缩放方法1.数据中心化2.数据标准化3.Min-Max缩放3.Max-ABS缩放4.Robust缩放 数据特征缩放的概念 变量的数据特征是指变量取值的分布特点,与数据所... -
探讨"特征缩放
2020-04-17 22:43:253 使用特征缩放、不使用特征缩放求出参数(theta)之间的对应关系,以及如何从代数变化、python编程角度说明如何将前者求解出的参数转化成后者求解出参数。 二、进而基于除线性回归的其他机器学习算法,回答下列三个... -
特征缩放(Feature Scaling)
2021-04-09 10:47:40特征缩放的几种方法: 转载:https://www.cnblogs.com/HuZihu/p/9761161.html感谢作者。 (1)最大最小值归一化(min-max normalization):将数值范围缩放到[0,1]区间里 (2)均值归一化(mean ... -
演示内容:量纲的特征缩放.py
2020-03-18 12:03:57演示内容:量纲的特征缩放 (两种方法:标准化缩放法和区间缩放法。每种方法举了两个例子:简单二维矩阵和iris数据集) """ #方法1:标准化缩放法 例1:对简单示例二维矩阵的列数据进行 from sklearn import ... -
特征工程一:特征缩放、选择
2019-02-22 19:15:00数据科学领域从业者普遍认为:数据和特征决定了机器学习效果的上限,而模型和算法只是逼近这个上限。而特征工程就是逼近这个上限的极速器。特征工程处理后的特征越好,模型的可选择性和灵活性越强,同时也降低了模型... -
机器学习系列 5:特征缩放
2019-05-22 08:39:12现在变量 x1 和 x2 的范围全部都在 -1 到 1 这个区间了,但是又出现一个问题,你发没发现,现在经过处理之后的数据全是正值,不分散,那么我们就要用稍微复杂一点的方法进行特征缩放。用均值归一化(Mean ... -
机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler)
2021-08-26 21:01:18机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling)。进行缩放后,多维特征将具有相近的尺度,这将... -
机器学习(特征缩放、交叉验证)
2021-11-12 21:40:38特征缩放 如果两个特征的量级相差非常大,一般会采取特征缩放,以缩短梯度下降训练模型改的时间,如下案例中的两个特征,最好采用特征缩放: 方式一:数据归一化 数据归一化就是把数据的取值范围处理为0~1或... -
关于特征缩放、标准化、归一化的定义和作用
2020-10-25 14:44:15前言 我在学李宏毅的机器学习课程,助教给的回归作业代码中有数据标准化的操作。 我听过数据标准化,还有归一化、批量归一化等等,但不是很懂,不知道他们具体是什么、有什么区别。 百度上找了挺多文章,讲得都...特征 -
实现特征缩放和特征归一化的方法有哪些?(附代码)
2021-04-20 03:45:56本文将为你介绍实现特征缩放和特征归一化的方法。1. 特征缩放在随机梯度下降(stochastic gradient descent)算法中,特征缩放有时能提高算法的收敛速度。1.1 什么是特征缩放特征缩放是用来标准化数据特征的范围。1.2 ... -
多元梯度下降中常用的方法(特征缩放以及学习率的选择)
2022-01-27 20:44:33文章目录特征缩放学习率 特征缩放 思想:确保所有特征取值在同一个量级上 方法:用所有特征除以它的取值范围 例如:现在想预测房价与一些因素的关系,这里选用了房屋面积和卧室数量。其取值范围如下面式子 x1= ... -
多变量线性回归中的特征缩放
2019-01-03 17:50:20为什么要进行特征缩放? "Most of the times, your dataset will contain features highly varying in magnitudes, units and range. But since, most of the machine learning algorithms use Eucledian ... -
sklearn 特征缩放(feature scaling)
2021-07-01 14:22:03需要应用于数据的最重要的转换之一是特征缩放(feature scaling)。除了少数例外,当输入的数字属性有非常不同的尺度时,机器学习算法表现不佳。 有两种常见的方法可以使所有属性具有相同的缩放:最小-最大缩放和标准...