当特征处于相对相似的尺度时,许多机器学习算法表现更好或收敛更快。计算数据点间距离的算法(如K近邻)或依赖梯度下降优化(如线性回归、逻辑回归、神经网络)的算法,对输入特征的尺度尤其敏感。如果一个特征的范围是0到1,而另一个是0到1,000,000,算法可能会仅仅因为其尺度而非预测价值,错误地赋予范围更大的特征更高的权重。标准化,常被称为Z-score缩放,是一种处理此问题的常见且有效的方法。它将数据转换,使其均值($\mu$)为0,标准差($\sigma$)为1。标准化公式特征中每个值 $x$ 的转换使用以下公式计算:$$ Z = \frac{x - \mu}{\sigma} $$$x$ 是原始特征值。$\mu$ 是特征列的均值。$\sigma$ 是特征列的标准差。$Z$ 是标准化后的特征值。每个转换后的值表示原始值偏离均值的标准差数量。大于均值的值将为正,小于均值的值将为负,而等于均值的值将为零。使用Scikit-learn进行标准化Scikit-learn在其preprocessing模块中提供了一个方便的转换器类StandardScaler。与其他Scikit-learn转换器一样,它遵循fit和transform模式。Fit(拟合): fit方法计算训练数据中每个特征的均值($\mu$)和标准差($\sigma$)。这些计算出的参数存储在缩放器对象中。仅在训练数据上拟合缩放器非常重要,以防止测试集的数据泄露。Transform(转换): transform方法使用学到的 $\mu$ 和 $\sigma$ (来自fit步骤)将标准化公式应用于数据,从而生成缩放后的特征。在将数据输入模型之前,你将此方法应用于训练数据,以及稍后的任何新数据(如验证集或测试集)。让我们看看实际操作。假设我们有一个包含“年龄”和“收入”特征的简单数据集:import pandas as pd from sklearn.preprocessing import StandardScaler # 示例数据 data = {'Age': [25, 30, 35, 40, 45, 50, 55, 60], 'Income': [50000, 55000, 60000, 65000, 70000, 75000, 80000, 85000]} df = pd.DataFrame(data) print("原始数据:") print(df) # 1. 初始化缩放器 scaler = StandardScaler() # 2. 在数据上拟合缩放器(计算均值和标准差) # 在实际场景中,仅在训练数据上拟合 scaler.fit(df) # 3. 转换数据(应用缩放) scaled_data = scaler.transform(df) # 转换回DataFrame以提高可读性 scaled_df = pd.DataFrame(scaled_data, columns=df.columns) print("\n缩放后的数据(标准化):") print(scaled_df) # 你可以查看学到的参数 print(f"\n学到的均值: {scaler.mean_}") print(f"学到的尺度(标准差): {scaler.scale_}") # scale_ 是标准差Output:Original Data: Age Income 0 25 50000 1 30 55000 2 35 60000 3 40 65000 4 45 70000 5 50 75000 6 55 80000 7 60 85000 Scaled Data (Standardization): Age Income 0 -1.527525 -1.527525 1 -1.091089 -1.091089 2 -0.654654 -0.654654 3 -0.218218 -0.218218 4 0.218218 0.218218 5 0.654654 0.654654 6 1.091089 1.091089 7 1.527525 1.527525 Learned Mean: [ 42.5 67500. ] Learned Scale (Std Dev): [ 11.45643924 11456.4392401 ]请注意,缩放后的特征现在以零为中心。具体数值反映了它们相对于均值的原始位置,以标准差为单位衡量。标准化效果的可视化标准化改变了数据的尺度,但保留了其分布的形状。如果一个特征在标准化之前是偏斜的,标准化之后它仍然会偏斜,只是尺度不同。{"data":[{"type":"histogram","x":[25,30,35,40,45,50,55,60],"name":"原始年龄","marker":{"color":"#339af0"}},{"type":"histogram","x":[-1.527525,-1.091089,-0.654654,-0.218218,0.218218,0.654654,1.091089,1.527525],"name":"标准化年龄","xaxis":"x2","yaxis":"y2","marker":{"color":"#ff922b"}}],"layout":{"title":{"text":"标准化前后年龄分布"},"grid":{"rows":1,"columns":2,"pattern":"independent"},"xaxis":{"title":{"text":"原始年龄"}},"yaxis":{"title":{"text":"频率"}},"xaxis2":{"title":{"text":"标准化年龄 (Z-score)"},"anchor":"y2"},"yaxis2":{"title":{"text":"频率"},"anchor":"x2"},"showlegend":false,"bargap":0.1}}'Age'特征在标准化之前(左,蓝色)和之后(右,橙色)的分布。请注意,直方图的形状相同,但X轴的尺度已改变以反映以0为中心的Z分数。何时使用标准化假设高斯分布的算法: 虽然标准化不会使数据变为高斯分布,但某些模型在特征具有与标准正态分布相似的属性(均值=0,标准差=1)时表现最佳。基于距离的算法: KNN、SVM(使用RBF核)和聚类算法(如K-Means)使用距离度量。标准化确保所有特征对距离计算的贡献相等。基于梯度下降的算法: 线性回归、逻辑回归、神经网络等算法在特征标准化后通常收敛更快。它有助于防止由不同特征范围影响梯度更新而导致的振荡或收敛缓慢。主成分分析(PCA): PCA对特征的尺度敏感,因为它尝试寻找最大方差的方向。通常建议在应用PCA之前进行标准化。注意事项与潜在缺点对异常值的敏感性: 标准化中使用的均值($\mu$)和标准差($\sigma$)对异常值敏感。少数极端值可以显著改变均值并增大标准差,从而在缩放后压缩“正常”数据点的范围。如果你的数据存在显著异常值,另一种缩放方法可能更好。可解释性: 标准化后的值(Z-score)是无单位的,表示与均值的标准差,这可能不如原始单位或像[0, 1]这样的最小-最大缩放范围那样直观易懂。标准化是准备数值特征的核心技术。通过将数据以零为中心并根据其标准差进行缩放,使其更适合多种机器学习算法,尤其是对特征尺度敏感的算法。请记住,仅在训练数据上拟合StandardScaler,然后用它来转换训练集和测试/验证集。