本文目录导读:

在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中数据标准化的主要应用场景,可以根据具体需求选择合适的方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播