当前位置: 首页 > news >正文

机器学习特征预处理之数据正态变换

函数功能分析

核心目的:对指定的数值列应用Power Transformation(幂变换),使数据更接近正态分布,常用于满足统计模型假设或提升模型性能。

技术实现分析

优点

  1. 方法灵活:支持'yeo-johnson'(支持零和负值)和'box-cox'(仅正值)两种方法

  2. 正确分离拟合与变换:训练集上fit_transform,测试集上仅transform,避免数据泄露

  3. 基于sklearn实现:使用成熟的PowerTransformer,稳定可靠

def transformation(X_train, X_test, num_cols, method='yeo-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(method=method) 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(scale=30, size=1000), # 偏态分布 'income': np.random.lognormal(mean=10, sigma=1, size=1000), # 对数正态 'score': np.random.normal(loc=70, scale=15, size=1000), # 正态 'category': np.random.choice(['A', 'B', 'C'], size=1000) # 分类变量 }) # 划分训练集和测试集 X_train, X_test = train_test_split(data, test_size=0.2, random_state=42) # 指定要变换的数值列 num_cols = ['age', 'income'] # score已经是正态,可不变换 # 调用函数 X_train_transformed, X_test_transformed = transformation( X_train, X_test, num_cols, method='yeo-johnson' ) print("变换前 - 训练集统计:") print(X_train[['age', 'income']].describe()) print("\n变换后 - 训练集统计:") print(X_train_transformed[['age', 'income']].describe())

适用场景

场景推荐度说明
线性回归/逻辑回归⭐⭐⭐⭐⭐提升模型对异常值的鲁棒性
SVM/神经网络⭐⭐⭐⭐加速收敛,但非必需
树模型(RF/XGB)⭐⭐对分布不敏感,可跳过
小样本数据集⭐⭐⭐注意过拟合风险

额外注意事项

  1. Yeo-Johnson vs Box-Cox

    • 数据包含零/负值 → 必须用Yeo-Johnson

    • 仅正值 → Box-Cox通常效果更好(更稳定)

  2. 后续处理

    • 保存pt对象,用于新数据的变换

    • 记录变换参数(如λ值),便于逆变换和解释

  3. PCA/特征工程前使用效果更佳

http://www.jsqmd.com/news/1216914/

相关文章:

  • Python日期特征分析与商业应用实战
  • Qt Quick开发实战:从零构建文本编辑器
  • 鸿蒙 ArkTS 实战:Split Screen Timer 从效率工具到状态管理完整解析
  • Java gRPC客户端类型详解:阻塞、异步与Future对比
  • RAGAS 评测分数不稳定?5 种方案抑制 LLM 裁判幻觉与波动
  • Android开发技术周报与实战热点解析
  • 开源AI模型技术解析:从Kimi K3部署到闭源对比实践
  • Spring Boot+Vue前后端分离项目实战:从环境搭建到用户管理模块开发
  • uniTerm v1.5.0 发布:AI 多终端协同、会话录制、SSH 私钥口令支持
  • 鸿蒙 ArkTS 实战:Memory Flip Cards 从记忆翻牌到记录管理完整解析
  • RAGAS 框架与实现原理
  • 多样性推荐系统:打破信息茧房的工业级实践
  • java shuzu Java数组玩抠图?省钱又暴力的图像处理骚操作,小白也能秒懂
  • 机器视觉检测技术选型与服务商评估指南
  • Android内存泄漏检测:LeakCanary原理与最佳实践
  • 多维聚合实战:用GROUPING SETS与窗口函数替代传统GROUP BY
  • 矩阵的秩:从课本定义到AI时代的“信息压缩器”
  • 基于YOLOv8的行人跌倒检测系统开发与优化
  • GHelper智能升级:华硕笔记本极致性能调优完整指南
  • KMS_VL_ALL_AIO:3分钟免费激活Windows系统的终极完整指南
  • 终极Obsidian PDF标注解决方案:PDF++插件完全指南
  • QtPdfium:轻量级PDF渲染库在Qt C++桌面应用中的集成与优化实践
  • C#中MD5哈希算法实现与优化指南
  • Wavecom短信猫AT命令详解与短信收发实战
  • 嵌入式开发中的bootloader与固件升级
  • Xamarin跨平台开发实战与迁移指南
  • 3步掌握GanttProject:免费开源的项目管理神器
  • 2026年一线品牌卫浴五金洁具工厂正规情况介绍
  • STM32 WiFi转CAN网关设计与实现
  • 医疗拒付对抗系统:FHIR+Redis+贝叶斯的工程化实战