精华内容
下载资源
问答
  • 特征缩放
    千次阅读
    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)imin(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)imean(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

    又称之为: Zscore 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
    其中,minmaxfeature_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=1N1i=1N(XiX) S = 1 N − 1 ∑ i = 1 N ( X i − X ¯ )

    其中, X X ¯ 是样本 X1,...,Xi,...,XN X 1 , . . . , X i , . . . , X N 的样本均值。N为样本数量。
    总体标准差:
    σ=1Ni=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、数据集

    CountryAgeSalaryPurchased
    France4472000No
    Spain2748000Yes
    Germany3054000No
    Spain3861000No
    Germany40Yes
    France3558000Yes
    Spain52000No
    France4879000Yes
    Germany5083000No
    France3767000Yes

    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]]
    展开全文
  • 当我们的特征值的取值范围太大或者太小时,使用梯度下降来使得代价函数最小化会很慢,这时候我们一般都会进行特征缩放

    系列文章目录


    第七章 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
    特征缩放什么?为什么归一化、标准化容易混淆,如何区分呢。 本来为大家来分析一下。

    引言

    特征缩放是机器学习预处理数据中最重要的步骤之一,它有时能决定学习模型的好坏。

    特征缩放的作用如下:

    1. 加快梯度下降
    2. 提升模型精度(消除不同量纲)
    3. 防止梯度爆炸(消除过大值的影响)

    为什么要特征缩放

    在机器学习算法处理数据时通常是忽略数据的单位信息的,或者说不知道这些数据代表什么。比如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 (172160)2+(3000060000)2 =30000.002
    员工2和员工3的距离: ( 160 − 175 ) 2 + ( 60000 − 50000 ) 2 = 10000.011 \sqrt{(160-175)^2 + (60000 - 50000)^2} = 10000.011 (160175)2+(6000050000)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 (00.6)2+(0.451)2 =0.814
    员工2和员工3的距离: ( 160 − 175 ) 2 + ( 60000 − 50000 ) 2 = 0.773 \sqrt{(160-175)^2 + (60000 - 50000)^2} = 0.773 (160175)2+(6000050000)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)xmean(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=6000050003000036250=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)xmin(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=600005000300005000=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)xmean(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=1N(ximean(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=210283000036250=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这种不假设数据分布的算法就很合适。 最大最小值归一化容易受异常值影响,常用于归一化图像的灰度值。
    • 当数据是正态分布时进行标准化是很有帮助的,不像归一化,标准化的数据没有限定范围,对异常值不敏感。
    • 然后,具体的选择还是依赖于你的数据或算法,通常最好归一化和标准化都尝试一下,看哪种方法好。

    注意事项

    需要先把数据拆分成训练集与验证集,在训练集上计算出需要的数值(如均值和标准值),对训练集数据做标准化/归一化处理(不要在整个数据集上做标准化/归一化处理,因为这样会将验证集的信息带入到训练集中,这是一个非常容易犯的错误),然后再用之前计算出的数据(如均值和标准值)对验证集数据做相同的标准化/归一化处理。

    参考

    1. https://www.cnblogs.com/HuZihu/p/9761161.html
    2. https://www.analyticsvidhya.com/blog/2020/04/feature-scaling-machine-learning-normalization-standardization
    3. https://machinelearningknowledge.ai/feature-scaling-machine-learning/
    展开全文
  • 目录 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)–如何构建一个完整的机器...本篇文章会继续介绍特征工程的内容,这次会介绍特征缩放和特征编码,前者主要是归一化和正则化,用于消除量纲关系的影响,后者包括了序号编码、独热编码等,主要...
  • 作者:时晴说起"炼丹"最耗时的几件事,首先就能想到的就是数据清洗,特征工程,还有调参.特征工程真的是老生常谈了,但是特征工程又是最重要的一环,这一步做不好怎么调参也没用....
  • 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、特征缩放作用 面对特征数量较多的时候,保证这些特征具有相近的尺度(无量纲化),可以使梯度下降法更快的收敛。这两张图...
  • 点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”作者:Sudharsan Asaithambi编译:ronghuaiyang导读在使用某些算法时,特征缩放可能会...
  • 什么是特征缩放特征缩放(feature scaling): 改变特征的取值范围,缩放到统一的区间,例如[0,1][0, 1][0,1]. 为什么要进行特征缩放? 数据集包含众多特征,每个特征的尺度(scale)不同,有的特征的单位是小时,有的...
  • 文章目录数据特征缩放的概念一、数据特征缩放的意义二、数据特征缩放方法1.数据中心化2.数据标准化3.Min-Max缩放3.Max-ABS缩放4.Robust缩放 数据特征缩放的概念 变量的数据特征是指变量取值的分布特点,与数据所...
  • 探讨"特征缩放

    2020-04-17 22:43:25
    3 使用特征缩放、不使用特征缩放求出参数(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 ...
  • 演示内容:量纲的特征缩放 (两种方法:标准化缩放法和区间缩放法。每种方法举了两个例子:简单二维矩阵和iris数据集) """ #方法1:标准化缩放法 例1:对简单示例二维矩阵的列数据进行 from sklearn import ...
  • 数据科学领域从业者普遍认为:数据和特征决定了机器学习效果的上限,而模型和算法只是逼近这个上限。而特征工程就是逼近这个上限的极速器。特征工程处理后的特征越好,模型的可选择性和灵活性越强,同时也降低了模型...
  • 现在变量 x1 和 x2 的范围全部都在 -1 到 1 这个区间了,但是又出现一个问题,你发没发现,现在经过处理之后的数据全是正值,不分散,那么我们就要用稍微复杂一点的方法进行特征缩放。用均值归一化(Mean ...
  • 机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling)。进行缩放后,多维特征将具有相近的尺度,这将...
  • 机器学习(特征缩放、交叉验证)

    千次阅读 2021-11-12 21:40:38
    特征缩放 如果两个特征的量级相差非常大,一般会采取特征缩放,以缩短梯度下降训练模型改的时间,如下案例中的两个特征,最好采用特征缩放: 方式一:数据归一化 数据归一化就是把数据的取值范围处理为0~1或...
  • 前言 我在学李宏毅的机器学习课程,助教给的回归作业代码中有数据标准化的操作。 我听过数据标准化,还有归一化、批量归一化等等,但不是很懂,不知道他们具体是什么、有什么区别。 百度上找了挺多文章,讲得都...特征
  • 本文将为你介绍实现特征缩放和特征归一化的方法。1. 特征缩放在随机梯度下降(stochastic gradient descent)算法中,特征缩放有时能提高算法的收敛速度。1.1 什么是特征缩放特征缩放是用来标准化数据特征的范围。1.2 ...
  • 文章目录特征缩放学习率 特征缩放 思想:确保所有特征取值在同一个量级上 方法:用所有特征除以它的取值范围 例如:现在想预测房价与一些因素的关系,这里选用了房屋面积和卧室数量。其取值范围如下面式子 x1= ...
  • 为什么要进行特征缩放? "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 ...
  • 需要应用于数据的最重要的转换之一是特征缩放(feature scaling)。除了少数例外,当输入的数字属性有非常不同的尺度时,机器学习算法表现不佳。 有两种常见的方法可以使所有属性具有相同的缩放:最小-最大缩放和标准...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,166
精华内容 31,666
关键字:

特征缩放

友情链接: chatroom-master.zip