函数功能分析核心目的对指定的数值列应用Power Transformation幂变换使数据更接近正态分布常用于满足统计模型假设或提升模型性能。技术实现分析优点方法灵活支持yeo-johnson支持零和负值和box-cox仅正值两种方法正确分离拟合与变换训练集上fit_transform测试集上仅transform避免数据泄露基于sklearn实现使用成熟的PowerTransformer稳定可靠def transformation(X_train, X_test, num_cols, methodyeo-johnson): 数据正态变换改进版 # 1. 输入验证 if not all(col in X_train.columns for col in num_cols): raise ValueError(部分列不在X_train中) # 2. 检查空值 if X_train[num_cols].isnull().any().any(): raise ValueError(训练数据包含空值请先处理) # 3. 复制数据避免原地修改可选 X_train X_train.copy() X_test X_test.copy() # 4. 确保数值类型 X_train[num_cols] X_train[num_cols].astype(float) X_test[num_cols] X_test[num_cols].astype(float) # 5. 变换 pt PowerTransformer(methodmethod) X_train[num_cols] pt.fit_transform(X_train[num_cols]) X_test[num_cols] pt.transform(X_test[num_cols]) return X_train, X_test调用示例import pandas as pd import numpy as np from sklearn.preprocessing import PowerTransformer from sklearn.model_selection import train_test_split # 准备示例数据 np.random.seed(42) data pd.DataFrame({ age: np.random.exponential(scale30, size1000), # 偏态分布 income: np.random.lognormal(mean10, sigma1, size1000), # 对数正态 score: np.random.normal(loc70, scale15, size1000), # 正态 category: np.random.choice([A, B, C], size1000) # 分类变量 }) # 划分训练集和测试集 X_train, X_test train_test_split(data, test_size0.2, random_state42) # 指定要变换的数值列 num_cols [age, income] # score已经是正态可不变换 # 调用函数 X_train_transformed, X_test_transformed transformation( X_train, X_test, num_cols, methodyeo-johnson ) print(变换前 - 训练集统计:) print(X_train[[age, income]].describe()) print(\n变换后 - 训练集统计:) print(X_train_transformed[[age, income]].describe())适用场景场景推荐度说明线性回归/逻辑回归⭐⭐⭐⭐⭐提升模型对异常值的鲁棒性SVM/神经网络⭐⭐⭐⭐加速收敛但非必需树模型RF/XGB⭐⭐对分布不敏感可跳过小样本数据集⭐⭐⭐注意过拟合风险额外注意事项Yeo-Johnson vs Box-Cox数据包含零/负值 → 必须用Yeo-Johnson仅正值 → Box-Cox通常效果更好更稳定后续处理保存pt对象用于新数据的变换记录变换参数如λ值便于逆变换和解释PCA/特征工程前使用效果更佳