🎯 学习目标

  • 掌握常见数据质量问题
  • 学会数据标准化与归一化
  • 掌握特征编码技术
  • 了解数据分割策略
💡
数据预处理的重要性

数据科学家80%的时间花在数据清洗上。高质量数据是模型成功的基础:"Garbage in, garbage out"

📊 数据标准化与归一化

标准化 (Z-Score)

转换为均值为0、标准差为1的分布

from sklearn.preprocessing import StandardScaler import numpy as np data = np.array([[1, 100], [2, 200], [3, 300], [4, 400]]) scaler = StandardScaler() scaled = scaler.fit_transform(data) # 均值≈0,标准差≈1 print(f"均值: {scaled.mean(axis=0)}") print(f"标准差: {scaled.std(axis=0)}") # 反向转换 original = scaler.inverse_transform(scaled)

归一化 (Min-Max)

缩放到[0, 1]区间

from sklearn.preprocessing import MinMaxScaler data = np.array([[1, 100], [2, 200], [3, 300], [4, 400]]) scaler = MinMaxScaler() normalized = scaler.fit_transform(data) # 范围[0, 1] print(f"最小值: {normalized.min(axis=0)}") print(f"最大值: {normalized.max(axis=0)}") # 自定义范围 scaler = MinMaxScaler(feature_range=(-1, 1))

🏷️ 特征编码

from sklearn.preprocessing import LabelEncoder, OneHotEncoder import pandas as pd df = pd.DataFrame({ 'color': ['red', 'blue', 'green', 'blue', 'red'], 'size': ['S', 'M', 'L', 'M', 'S'] }) # 标签编码(有序类别) le = LabelEncoder() df['size_encoded'] = le.fit_transform(df['size']) # S→2, M→1, L→0 # 独热编码(无序类别) df_encoded = pd.get_dummies(df, columns=['color']) # color_red, color_blue, color_green # 使用sklearn ohe = OneHotEncoder(sparse_output=False) color_encoded = ohe.fit_transform(df[['color']])

✂️ 数据分割

训练集/验证集/测试集划分

from sklearn.model_selection import train_test_split import numpy as np X = np.random.randn(1000, 10) y = np.random.randint(0, 2, 1000) # 先分出测试集 X_temp, X_test, y_temp, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 再从剩余数据中分出验证集 X_train, X_val, y_train, y_val = train_test_split( X_temp, y_temp, test_size=0.25, random_state=42 ) # 最终比例: 60% train, 20% val, 20% test print(f"训练集: {len(X_train)}") print(f"验证集: {len(X_val)}") print(f"测试集: {len(X_test)}")
⚠️
分层采样

分类问题中使用stratify=y确保各类别比例一致。

🔧 特征工程技巧

缺失值填充策略

from sklearn.impute import SimpleImputer # 均值填充 imp_mean = SimpleImputer(strategy='mean') # 中位数填充 imp_median = SimpleImputer(strategy='median') # 众数填充 imp_mode = SimpleImputer(strategy='most_frequent') # 常数填充 imp_const = SimpleImputer(strategy='constant', fill_value=0)

异常值处理

import numpy as np def remove_outliers(df, column, n_std=3): mean = df[column].mean() std = df[column].std() return df[ (df[column] >= mean - n_std * std) & (df[column] <= mean + n_std * std) ] # IQR方法 def remove_outliers_iqr(df, column): Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 return df[ (df[column] >= Q1 - 1.5 * IQR) & (df[column] <= Q3 + 1.5 * IQR) ]

📝 本节小结

  • • 数据清洗是机器学习的重要步骤
  • • 标准化/归一化让特征在同一尺度
  • • 类别特征需要编码为数值
  • • 合理分割数据避免数据泄露