Python案例如何实现数据标准化?

wen python案例 3

本文目录导读:

Python案例如何实现数据标准化?

  1. Z-score标准化 (StandardScaler)
  2. Min-Max标准化 (MinMaxScaler)
  3. 鲁棒标准化 (RobustScaler)
  4. 完整案例:数据归一化预处理流程
  5. 自定义标准化函数
  6. 关键要点

在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))

关键要点

  1. 为什么需要标准化

    • 消除特征量纲影响
    • 加速梯度下降收敛
    • 提高模型性能(特别是对距离敏感的算法)
  2. 选择标准化方法

    • StandardScaler:数据服从正态分布时使用
    • MinMaxScaler:有界问题时使用
    • RobustScaler:数据存在异常值时使用
  3. 注意事项

    • 只用训练集拟合scaler
    • 用训练集的scaler转换测试集
    • 对类别特征通常不需要标准化

这些方法和案例覆盖了Python中数据标准化的主要应用场景,可以根据具体需求选择合适的方法。

抱歉,评论功能暂时关闭!