Feature Scaling

特征缩放

数据集: Size; Number of Bedrooms; Number of floors; Age of Home; 和Price

#set alpha to 9.9e-7
_, _, hist = run_gradient_descent(X_train, y_train, 10, alpha = 9.9e-7)
Iteration Cost          w0       w1       w2       w3       b       djdw0    djdw1    djdw2    djdw3    djdb  
---------------------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|
        0 9.55884e+04  5.5e-01  1.0e-03  5.1e-04  1.2e-02  3.6e-04 -5.5e+05 -1.0e+03 -5.2e+02 -1.2e+04 -3.6e+02
        1 1.28213e+05 -8.8e-02 -1.7e-04 -1.0e-04 -3.4e-03 -4.8e-05  6.4e+05  1.2e+03  6.2e+02  1.6e+04  4.1e+02
        2 1.72159e+05  6.5e-01  1.2e-03  5.9e-04  1.3e-02  4.3e-04 -7.4e+05 -1.4e+03 -7.0e+02 -1.7e+04 -4.9e+02
        3 2.31358e+05 -2.1e-01 -4.0e-04 -2.3e-04 -7.5e-03 -1.2e-04  8.6e+05  1.6e+03  8.3e+02  2.1e+04  5.6e+02
        4 3.11100e+05  7.9e-01  1.4e-03  7.1e-04  1.5e-02  5.3e-04 -1.0e+06 -1.8e+03 -9.5e+02 -2.3e+04 -6.6e+02
        5 4.18517e+05 -3.7e-01 -7.1e-04 -4.0e-04 -1.3e-02 -2.1e-04  1.2e+06  2.1e+03  1.1e+03  2.8e+04  7.5e+02
        6 5.63212e+05  9.7e-01  1.7e-03  8.7e-04  1.8e-02  6.6e-04 -1.3e+06 -2.5e+03 -1.3e+03 -3.1e+04 -8.8e+02
        7 7.58122e+05 -5.8e-01 -1.1e-03 -6.2e-04 -1.9e-02 -3.4e-04  1.6e+06  2.9e+03  1.5e+03  3.8e+04  1.0e+03
        8 1.02068e+06  1.2e+00  2.2e-03  1.1e-03  2.3e-02  8.3e-04 -1.8e+06 -3.3e+03 -1.7e+03 -4.2e+04 -1.2e+03
        9 1.37435e+06 -8.7e-01 -1.7e-03 -9.1e-04 -2.7e-02 -5.2e-04  2.1e+06  3.9e+03  2.0e+03  5.1e+04  1.4e+03
w,b found by gradient descent: w: [-0.87 -0.   -0.   -0.03], b: -0.00

成本反升

#set alpha to 9e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 9e-7)
Iteration Cost          w0       w1       w2       w3       b       djdw0    djdw1    djdw2    djdw3    djdb  
---------------------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|
        0 6.64616e+04  5.0e-01  9.1e-04  4.7e-04  1.1e-02  3.3e-04 -5.5e+05 -1.0e+03 -5.2e+02 -1.2e+04 -3.6e+02
        1 6.18990e+04  1.8e-02  2.1e-05  2.0e-06 -7.9e-04  1.9e-05  5.3e+05  9.8e+02  5.2e+02  1.3e+04  3.4e+02
        2 5.76572e+04  4.8e-01  8.6e-04  4.4e-04  9.5e-03  3.2e-04 -5.1e+05 -9.3e+02 -4.8e+02 -1.1e+04 -3.4e+02
        3 5.37137e+04  3.4e-02  3.9e-05  2.8e-06 -1.6e-03  3.8e-05  4.9e+05  9.1e+02  4.8e+02  1.2e+04  3.2e+02
        4 5.00474e+04  4.6e-01  8.2e-04  4.1e-04  8.0e-03  3.2e-04 -4.8e+05 -8.7e+02 -4.5e+02 -1.1e+04 -3.1e+02
        5 4.66388e+04  5.0e-02  5.6e-05  2.5e-06 -2.4e-03  5.6e-05  4.6e+05  8.5e+02  4.5e+02  1.2e+04  2.9e+02
        6 4.34700e+04  4.5e-01  7.8e-04  3.8e-04  6.4e-03  3.2e-04 -4.4e+05 -8.1e+02 -4.2e+02 -9.8e+03 -2.9e+02
        7 4.05239e+04  6.4e-02  7.0e-05  1.2e-06 -3.3e-03  7.3e-05  4.3e+05  7.9e+02  4.2e+02  1.1e+04  2.7e+02
        8 3.77849e+04  4.4e-01  7.5e-04  3.5e-04  4.9e-03  3.2e-04 -4.1e+05 -7.5e+02 -3.9e+02 -9.1e+03 -2.7e+02
        9 3.52385e+04  7.7e-02  8.3e-05 -1.1e-06 -4.2e-03  8.9e-05  4.0e+05  7.4e+02  3.9e+02  1.0e+04  2.5e+02
w,b found by gradient descent: w: [ 7.74e-02  8.27e-05 -1.06e-06 -4.20e-03], b: 0.00

成本都在下降,alpha 值不大

#set alpha to 1e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 1e-7)
Iteration Cost          w0       w1       w2       w3       b       djdw0    djdw1    djdw2    djdw3    djdb  
---------------------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|
        0 4.42313e+04  5.5e-02  1.0e-04  5.2e-05  1.2e-03  3.6e-05 -5.5e+05 -1.0e+03 -5.2e+02 -1.2e+04 -3.6e+02
        1 2.76461e+04  9.8e-02  1.8e-04  9.2e-05  2.2e-03  6.5e-05 -4.3e+05 -7.9e+02 -4.0e+02 -9.5e+03 -2.8e+02
        2 1.75102e+04  1.3e-01  2.4e-04  1.2e-04  2.9e-03  8.7e-05 -3.4e+05 -6.1e+02 -3.1e+02 -7.3e+03 -2.2e+02
        3 1.13157e+04  1.6e-01  2.9e-04  1.5e-04  3.5e-03  1.0e-04 -2.6e+05 -4.8e+02 -2.4e+02 -5.6e+03 -1.8e+02
        4 7.53002e+03  1.8e-01  3.3e-04  1.7e-04  3.9e-03  1.2e-04 -2.1e+05 -3.7e+02 -1.9e+02 -4.2e+03 -1.4e+02
        5 5.21639e+03  2.0e-01  3.5e-04  1.8e-04  4.2e-03  1.3e-04 -1.6e+05 -2.9e+02 -1.5e+02 -3.1e+03 -1.1e+02
        6 3.80242e+03  2.1e-01  3.8e-04  1.9e-04  4.5e-03  1.4e-04 -1.3e+05 -2.2e+02 -1.1e+02 -2.3e+03 -8.6e+01
        7 2.93826e+03  2.2e-01  3.9e-04  2.0e-04  4.6e-03  1.4e-04 -9.8e+04 -1.7e+02 -8.6e+01 -1.7e+03 -6.8e+01
        8 2.41013e+03  2.3e-01  4.1e-04  2.1e-04  4.7e-03  1.5e-04 -7.7e+04 -1.3e+02 -6.5e+01 -1.2e+03 -5.4e+01
        9 2.08734e+03  2.3e-01  4.2e-04  2.1e-04  4.8e-03  1.5e-04 -6.0e+04 -1.0e+02 -4.9e+01 -7.5e+02 -4.3e+01
w,b found by gradient descent: w: [2.31e-01 4.18e-04 2.12e-04 4.81e-03], b: 0.00

成本在正常下降, 𝑤0𝑤0 正在接近最小值,没有波动。在整个运行过程中,dj_w0都是负值。这种解法也会收敛。

Details

再来看看 𝛼𝛼 = 9e-7 的情况。这非常接近在不发散的情况下可以设置的最大值 𝛼𝛼 。这是一个简短的运行结果,显示了最初的几次迭代

从上图可以看出,成本在最初降低后缓慢下降。请注意w0w1、w2、w3以及dj_dw0dj_dw1-3 之间的差异。w0很快就达到了接近最终值的水平,而dj_dw0也迅速下降到一个很小的值,这表明w0已接近最终值。其他参数的下降速度要慢得多

改进:

  • 𝛼𝛼 被所有( 𝑤𝑤's 和 𝑏𝑏 )参数更新共享。

  • 共同误差项乘以 𝑤𝑤's 的特征值(不是 𝑏𝑏

  • 这些特征的大小差异很大,使得某些特征的更新速度比其他特征快得多。在这种情况下, 𝑤0𝑤0 乘以 "Size",一般为 > 1000,而 𝑤1𝑤1乘以 "bedrooms",一般为 2-4。

解决方案就是特征缩放。

特征缩放

特征缩放,主要是将每个正特征除以最大值,或者使用 (x-min)/(max-min) 对每个特征的最小值和最大值进行缩放。这两种方法都能将特征归一化到 -1 和 1 的范围,前一种方法适用于正特征,比较简单,而后一种方法适用于任何特征。

  • Mean normalization: xi:=xiμimaxminx_i := \dfrac{x_i - \mu_i}{max - min}

z-score normalization Z值归一化

z-score normalization 后所有特征的平均值为 0,标准差为 1

要实现 z 值归一化,请按照以下公式调整输入值:

xj(i)=xj(i)μjσjx^{(i)}_j = \dfrac{x^{(i)}_j - \mu_j}{\sigma_j}

其中, 𝑗𝑗 选择 𝐗𝐗 矩阵中的一个特征或一列。 µ𝑗µ𝑗 是特征 (j) 所有值的平均值, 𝜎𝑗𝜎𝑗 是特征 (j) 的标准偏差

实施说明:在对特征进行归一化处理时,必须存储用于归一化处理的值--计算所用的平均 值和标准偏差。从模型中学习参数后,我们通常希望预测以前未见过的 House 价格。如果给定一个新的 x 值(Size和bedrooms),我们必须首先使用之前从训练集中计算出的平均值和标准差对 x 进行归一化处理。

def zscore_normalize_features(X):
    """
    computes  X, zcore normalized by column
    
    Args:
      X (ndarray (m,n))     : 输入数据、m 个示例、n 个特征
      
    Returns:
      X_norm (ndarray (m,n)): 按列归一化的输入
      mu (ndarray (n,))     : 每个特征的平均值
      sigma (ndarray (n,))  : 每个特征的标准偏差
    """
    # find the mean of each column/feature
    mu     = np.mean(X, axis=0)                 # mu will have shape (n,)
    # find the standard deviation of each column/feature
    sigma  = np.std(X, axis=0)                  # sigma will have shape (n,)
    # element-wise, subtract mu for that column from each example, divide by std for that column
    X_norm = (X - mu) / sigma      

    return (X_norm, mu, sigma)
  • 左:未归一化:Size特征的数值范围或方差比 Age 大得多

  • 中:第一步去除每个特征的平均值。这样就留下了以零为中心的特征。很难看到 'age' 特征的差异,但 'Size' 显然是在零附近。

  • 右:第二步除以标准偏差。这样,两个特征都以零为中心,比例相似。

对数据进行归一化处理,并与原始数据进行比较

上面的归一化数据范围(X 轴)以零为中心,大致为 +/- 2

用归一化数据重新运行梯度下降算法。这将加快梯度下降的速度

缩放特征能更快更准确地得到结果请注意,在这个相当短的运行结束时,每个参数的梯度都很小。0.1 的学习率是使用归一化特征进行回归的良好开端

我们不能再用一张图来显示结果与特征的关系

在生成曲线图时,使用了归一化特征。任何使用从归一化训练集学习到的参数进行的预测也必须归一化

Last updated

Was this helpful?