趋近智
不同的数值特征可能具有明显不同的范围、单位和分布。例如,一个特征可能表示年龄(范围从18到80),而另一个表示收入(范围从20,000到200,000)。许多机器学习算法,特别是那些基于距离计算(如K近邻、支持向量机)或梯度下降(如线性回归、神经网络)的算法,当数值输入特征处于相似的量级时,性能会更好或收敛更快。标准化和最小-最大缩放是两种常用的特征重缩放技术。
需要注意的是,这些转换改变了数据的量级和位置(均值),但通常不改变其分布的形状。如果一个特征具有偏态分布,缩放不会使其变为正态分布。处理偏态通常需要不同的转换(如对数或Box-Cox转换),这些通常被认为是更高级的特征工程步骤。
标准化将数据重缩放,使其均值(μ)为0,标准差(σ)为1。这种转换常被称为Z-分数归一化。标准化的公式是:
Xext标准化=σX−μ其中X是原始特征值,μ是该特征列的均值,σ是该特征列的标准差。
为什么要使用标准化?
让我们看看如何使用Scikit-learn的StandardScaler应用标准化。
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np
# 示例DataFrame
data = {'Age': [25, 30, 35, 40, 45, 50],
'Salary': [50000, 60000, 75000, 90000, 110000, 150000]}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 初始化缩放器
scaler = StandardScaler()
# 对数据进行拟合和转换
# 注意: fit_transform 期望一个二维数组,因此使用 df[['Age', 'Salary']]
scaled_data = scaler.fit_transform(df[['Age', 'Salary']])
# 转换回DataFrame以提高可读性
df_scaled = pd.DataFrame(scaled_data, columns=['Age_scaled', 'Salary_scaled'])
print("\n标准化数据:")
print(df_scaled)
print(f"\n缩放后的均值:\n{df_scaled.mean()}")
print(f"\n缩放后的标准差:\n{df_scaled.std()}")
请注意,缩放后均值非常接近0,标准差为1。
最小-最大缩放将数据重缩放到一个固定范围,通常是[0, 1],尽管也可以指定其他范围。最小-最大缩放至[0, 1]范围的公式是:
Xext缩放=Xextmax−XextminX−Xextmin其中X是原始特征值,Xmin是该特征列的最小值,Xmax是该特征列的最大值。
为什么要使用最小-最大缩放?
然而,最小-最大缩放对异常值相当敏感。一个非常大或非常小的值可能会将数据的其余部分显著压缩到一个狭窄的范围。
以下是如何使用Scikit-learn的MinMaxScaler应用最小-最大缩放。
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# 示例DataFrame(同前)
data = {'Age': [25, 30, 35, 40, 45, 50],
'Salary': [50000, 60000, 75000, 90000, 110000, 150000]}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 初始化缩放器(默认范围为 [0, 1])
min_max_scaler = MinMaxScaler()
# 拟合和转换
scaled_data_minmax = min_max_scaler.fit_transform(df[['Age', 'Salary']])
# 转换回DataFrame
df_scaled_minmax = pd.DataFrame(scaled_data_minmax, columns=['Age_scaled', 'Salary_scaled'])
print("\n最小-最大缩放数据:")
print(df_scaled_minmax)
print(f"\n缩放后的最小值:\n{df_scaled_minmax.min()}")
print(f"\n缩放后的最大值:\n{df_scaled_minmax.max()}")
如预期的那样,两个缩放列的最小值现在为0,最大值为1。
选择通常取决于您计划使用的特定算法和数据的特点:
请考虑您在单变量分析中观察到的分布情况。如果一个特征存在极端异常值,标准化可能是一个更稳妥的默认选择。如果特征的量级差异很大但没有极端异常值,最小-最大缩放会很有效。
让我们使用直方图来可视化缩放对示例数据中“薪资”特征的影响。
薪资分布在标准化和最小-最大缩放前后的比较。注意x轴发生显著变化,反映了新的量级(标准化后约为-1到2,最小-最大缩放后为0到1)。分布的整体形状保持不变,只有量级和位置发生了改变。
在为机器学习模型准备数据时,避免数据泄露是必要的。这意味着测试集的信息不应影响训练过程,包括用于缩放的参数(如均值、标准差、最小值或最大值)。
正确的步骤是:
StandardScaler或MinMaxScaler)。这将从训练数据中学习缩放参数(μ,σ,min,max)。# 假设 X_train, X_test 是您的特征集(Pandas DataFrame 或 NumPy 数组)
scaler = StandardScaler() # 或 MinMaxScaler()
# 仅在训练数据上拟合
scaler.fit(X_train)
# 转换训练和测试数据
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
应用缩放等转换是EDA期间获得认识的直接结果。通过检查特征范围、分布,并考虑后续建模步骤的要求,您可以就如何最佳地准备数据做出明智的决定。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造