本文目录导读:

在Python中实现数据标准化,主要使用scikit-learn库,以下是几种常用的标准化方法及完整案例:
Z-score标准化 (StandardScaler)
将数据转换为均值为0,标准差为1的分布。
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 创建示例数据
data = {
'年龄': [25, 30, 35, 40, 45, 50],
'收入': [30000, 45000, 50000, 60000, 80000, 100000],
'支出': [15000, 20000, 25000, 30000, 35000, 40000]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 初始化StandardScaler
scaler = StandardScaler()
# 拟合并转换数据
df_scaled = scaler.fit_transform(df)
df_scaled = pd.DataFrame(df_scaled, columns=df.columns)
print("\n标准化后的数据(Z-score):")
print(df_scaled)
# 验证:计算均值和标准差
print("\n验证 - 标准化后的均值:")
print(df_scaled.mean())
print("验证 - 标准化后的标准差:")
print(df_scaled.std())
Min-Max标准化 (MinMaxScaler)
将数据缩放到指定范围(默认为[0,1])。
from sklearn.preprocessing import MinMaxScaler
# 创建示例数据
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]])
print("原始数据:")
print(data)
# 初始化MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
# 拟合并转换数据
data_scaled = scaler.fit_transform(data)
print("\nMin-Max标准化后的数据:")
print(data_scaled)
# 验证:查看每列的最小值和最大值
print("\n每列最小值:", data_scaled.min(axis=0))
print("每列最大值:", data_scaled.max(axis=0))
鲁棒标准化 (RobustScaler)
使用中位数和四分位距,对异常值不敏感。
from sklearn.preprocessing import RobustScaler
# 创建包含异常值的数据
data = np.array([[1, 2, 100], # 第三个值很大,是异常值
[4, 5, 6],
[7, 8, 9],
[10, 11, 200], # 另一个异常值
[2, 3, 4]])
print("包含异常值的原始数据:")
print(data)
# 初始化RobustScaler
scaler = RobustScaler()
# 拟合并转换数据
data_scaled = scaler.fit_transform(data)
print("\n鲁棒标准化后的数据:")
print(data_scaled)
# 查看中位数和IQR
print("\n中位数:", scaler.center_)
print("四分位距:", scaler.scale_)
完整案例:数据归一化预处理流程
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 1. 创建模拟数据集
np.random.seed(42)
n_samples = 1000
X = pd.DataFrame({
'feature1': np.random.normal(0, 1, n_samples),
'feature2': np.random.exponential(2, n_samples),
'feature3': np.random.uniform(0, 100, n_samples),
'feature4': np.random.binomial(1, 0.5, n_samples) # 类别特征
})
y = (X['feature1'] + X['feature2'] * 0.1 + X['feature3'] * 0.01 > 1.5).astype(int)
print("原始数据描述:")
print(X.describe())
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 3. 选择标准化方法
# 使用StandardScaler(Z-score标准化)
scaler = StandardScaler()
# 4. 拟合并转换训练数据
X_train_scaled = scaler.fit_transform(X_train)
# 5. 使用相同的scaler转换测试数据
X_test_scaled = scaler.transform(X_test)
# 6. 训练模型(比较标准化前后的效果)
# 使用未标准化的数据
model_unscaled = LogisticRegression(max_iter=1000)
model_unscaled.fit(X_train, y_train)
y_pred_unscaled = model_unscaled.predict(X_test)
acc_unscaled = accuracy_score(y_test, y_pred_unscaled)
# 使用标准化后的数据
model_scaled = LogisticRegression(max_iter=1000)
model_scaled.fit(X_train_scaled, y_train)
y_pred_scaled = model_scaled.predict(X_test_scaled)
acc_scaled = accuracy_score(y_test, y_pred_scaled)
print(f"\n未标准化的模型准确率:{acc_unscaled:.4f}")
print(f"标准化后的模型准确率:{acc_scaled:.4f}")
# 7. 查看特征的重要性(标准化后更容易解释)
print(f"\n特征重要度(标准化后):")
feature_importance = pd.DataFrame({
'feature': X.columns,
'coefficient': model_scaled.coef_[0]
})
print(feature_importance)
自定义标准化函数
有时需要自己实现简单的标准化方法:
def z_score_normalize(data):
"""Z-score标准化"""
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
return (data - mean) / std
def min_max_normalize(data, feature_range=(0, 1)):
"""Min-Max标准化"""
min_val = data.min(axis=0)
max_val = data.max(axis=0)
# 归一化到0-1
normalized = (data - min_val) / (max_val - min_val)
# 缩放到指定范围
min_range, max_range = feature_range
return normalized * (max_range - min_range) + min_range
# 使用示例
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("原始数据:")
print(data)
print("\n自定义Z-score标准化:")
print(z_score_normalize(data))
print("\n自定义Min-Max标准化:")
print(min_max_normalize(data))
关键要点
-
为什么需要标准化:
- 消除特征量纲影响
- 加速梯度下降收敛
- 提高模型性能(特别是对距离敏感的算法)
-
选择标准化方法:
StandardScaler:数据服从正态分布时使用MinMaxScaler:有界问题时使用RobustScaler:数据存在异常值时使用
-
注意事项:
- 只用训练集拟合scaler
- 用训练集的scaler转换测试集
- 对类别特征通常不需要标准化
这些方法和案例覆盖了Python中数据标准化的主要应用场景,可以根据具体需求选择合适的方法。