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

《sklearn机器学习——数据预处理》非线性转换

sklearn 数据预处理中的非线性转换

核心思想

非线性转换(Non-linear Transformation)是指使用非线性函数对数据进行映射,以改变其分布形状,使其更接近正态分布(高斯分布)或减少偏态(skewness),从而提升模型性能(尤其是线性模型、基于距离的模型或假设数据正态分布的算法)。

与线性缩放(如标准化、归一化)不同,非线性转换会改变数据的分布形态,常用于:

  • 处理严重偏斜(skewed)的数据
  • 减少异常值影响
  • 使数据更符合模型假设(如线性回归的残差正态性)
  • 提升模型收敛速度和泛化能力

常用函数与类

1. sklearn.preprocessing.QuantileTransformer

将特征映射到服从均匀分布或正态分布的分位数空间。

参数说明:

参数名类型默认值说明
n_quantilesint1000分位数桶数量。建议 ≤ 样本数。
output_distributionstr'uniform'输出分布类型:'uniform''normal'
ignore_implicit_zerosboolFalse仅对稀疏矩阵有效,是否忽略隐式零值。
subsampleint10_000为计算分位数而采样的最大样本数(提升效率)。
random_stateint / RandomStateNone采样时使用,确保可重现。
copyboolTrue是否复制数据。

属性:

属性名说明
n_quantiles_实际使用的分位数数量
quantiles_每个特征的分位数边界(形状 (n_quantiles, n_features)
references_目标分布的参考分位数(如正态分布的理论分位数)

方法:

  • .fit(X[, y]):学习分位数映射。
  • .transform(X):执行非线性变换。
  • .fit_transform(X[, y])
  • .inverse_transform(X):还原原始尺度(近似,因分位数离散化有损)。

返回值:

  • .transform(X)numpy.ndarray,形状同输入,类型 float64

2. sklearn.preprocessing.PowerTransformer

使用幂变换(如 Box-Cox 或 Yeo-Johnson)使数据更接近正态分布。

参数说明:

参数名类型默认值说明
methodstr'yeo-johnson'变换方法:'yeo-johnson'(支持负值)或 'box-cox'(仅正数)
standardizeboolTrue是否在变换后进行标准化(均值0,方差1)
copyboolTrue是否复制数据

属性:

属性名说明
lambdas_每个特征学习到的最优 λ 参数(形状 (n_features,)
scaler_如果 standardize=True,存储内部 StandardScaler

方法:

  • .fit(X[, y])
  • .transform(X)
  • .fit_transform(X[, y])
  • .inverse_transform(X):可精确还原(因是参数化变换)

简单示例代码

示例 1:QuantileTransformer(映射到正态分布)

from sklearn.preprocessing import QuantileTransformer
import numpy as np
import matplotlib.pyplot as plt# 生成右偏数据
np.random.seed(42)
X = np.random.exponential(size=(1000, 1))  # 指数分布,右偏qt = QuantileTransformer(output_distribution='normal', random_state=42)
X_trans = qt.fit_transform(X)# 可视化对比
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].hist(X, bins=30, color='blue', alpha=0.7)
ax[0].set_title('Original Data (Exponential)')
ax[1].hist(X_trans, bins=30, color='green', alpha=0.7)
ax[1].set_title('Transformed Data (Normal-like)')
plt.show()print("变换前偏度:", np.mean((X - np.mean(X))**3) / np.std(X)**3)
print("变换后偏度:", np.mean((X_trans - np.mean(X_trans))**3) / np.std(X_trans)**3)

示例 2:PowerTransformer(Yeo-Johnson)

from sklearn.preprocessing import PowerTransformer# 含负值的数据
X = np.array([[1.5], [2.0], [3.0], [-1.0], [0.5]])pt = PowerTransformer(method='yeo-johnson', standardize=True)
X_trans = pt.fit_transform(X)print("原始数据:")
print(X.ravel())
print("\n变换后数据:")
print(X_trans.ravel())
print("\n学习到的 λ 参数:", pt.lambdas_)# 逆变换验证
X_inv = pt.inverse_transform(X_trans)
print("\n逆变换还原:")
print(X_inv.ravel())

输出示例:

原始数据:
[ 1.5  2.   3.  -1.   0.5]变换后数据:
[ 0.314  0.707  1.414 -1.414 -0.707]学习到的 λ 参数: [0.85]逆变换还原:
[ 1.5  2.   3.  -1.   0.5]

示例 3:Box-Cox 要求数据为正

from sklearn.preprocessing import PowerTransformerX = np.array([[1], [2], [3], [4], [5]], dtype=float)# Box-Cox 要求所有值 > 0
pt = PowerTransformer(method='box-cox', standardize=True)
X_trans = pt.fit_transform(X)print("Box-Cox 变换后:", X_trans.ravel())
print("λ 参数:", pt.lambdas_)

在管道中使用示例

from sklearn.pipeline import Pipeline
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_regression# 生成偏态特征数据
X, y = make_regression(n_samples=200, n_features=5, noise=10, random_state=42)
X[:, 0] = np.exp(X[:, 0])  # 人为制造偏态# 管道:非线性变换 + 线性回归
pipeline = Pipeline([('transformer', PowerTransformer(method='yeo-johnson')),('regressor', Ridge())
])scores = cross_val_score(pipeline, X, y, cv=5, scoring='r2')
print(f"交叉验证 R² 分数:{scores.mean():.4f} (+/- {scores.std() * 2:.4f})")

使用建议与注意事项

推荐使用场景:

  • 数据严重偏斜(如收入、房价、点击率)
  • 使用线性模型、SVM、逻辑回归等对分布敏感的算法前
  • 特征间分布差异大,且线性缩放效果不佳时

注意事项:

  • Box-Cox 要求所有值 > 0
  • QuantileTransformer 是有损变换,逆变换不精确
  • PowerTransformer 的逆变换是精确的
  • 非线性变换应在训练集上拟合,再应用于测试集
  • 变换后建议配合标准化(PowerTransformer 默认开启)

与其他预处理方法对比

方法是否非线性输出分布支持负值逆变换精确性是否标准化
QuantileTransformerUniform/Normal❌ (近似)
PowerTransformerNormal-like✅ (Y-J)✅ (默认)
StandardScaler无特定分布
MinMaxScaler[0,1]

总结

非线性转换是处理非正态分布、偏态数据的强大工具。在 sklearn 中:

  • 使用 PowerTransformer 进行参数化幂变换(推荐用于回归、线性模型)
  • 使用 QuantileTransformer 进行分位数映射(适用于分布未知或复杂情况)

合理使用非线性转换可显著提升模型性能,尤其在数据分布不理想时。始终记得在训练集上拟合变换器,并应用于测试集,避免数据泄露。


文章转载自:

http://MGe1t0YB.tnbsh.cn
http://AXV7utDg.tnbsh.cn
http://Ywox6gvW.tnbsh.cn
http://xJywao0c.tnbsh.cn
http://zWb5ZN8d.tnbsh.cn
http://TwpRtazt.tnbsh.cn
http://myIjHn9j.tnbsh.cn
http://XIg3PTBY.tnbsh.cn
http://S23V5B7q.tnbsh.cn
http://3wlJXxUT.tnbsh.cn
http://KcJSa7CV.tnbsh.cn
http://JWUrZATe.tnbsh.cn
http://96OyOPM5.tnbsh.cn
http://m4PScZvJ.tnbsh.cn
http://yGKRYT44.tnbsh.cn
http://eXjERthj.tnbsh.cn
http://3Tsj9yvS.tnbsh.cn
http://2WUCRSXE.tnbsh.cn
http://1FPtDNYq.tnbsh.cn
http://8TqICdll.tnbsh.cn
http://4UMWWXTo.tnbsh.cn
http://dhVUoRvX.tnbsh.cn
http://lYBQQvMl.tnbsh.cn
http://L35KFVAn.tnbsh.cn
http://pPZ0ZM0s.tnbsh.cn
http://RRNTDyEP.tnbsh.cn
http://kMsxLgG9.tnbsh.cn
http://eBaTqI51.tnbsh.cn
http://tOB4ogqu.tnbsh.cn
http://0e60DrYb.tnbsh.cn
http://www.dtcms.com/a/377054.html

相关文章:

  • 登顶 NAVSIM!博世最新IRL-VLA:逆强化学习重构自动驾驶VLA闭环训练
  • 速度与安全双突破:大视码垛机重构工业自动化新范式​
  • Java全栈开发面试实录:从基础到微服务的深度解析
  • 智慧养老:科技的温度,生命的尊严——构建银发时代的幸福图景
  • 【SpringBoot3】与myBatis-plus不兼容解决
  • 阿尔泰科技ARTS-3002U USB总线多功能数据采集卡 技术解析
  • Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
  • 行业学习【电商】:订阅制电商
  • 【Halcon】Halcon HObject 转 Bitmap 的几种实现方法
  • 单片机启动文件——数据段重定位,BSS段清零
  • [xboard]ARM汇编基础学习
  • rv1126bp之mipi sensor驱动
  • 手机上可以记录每日工作计划的待办提醒工具?
  • 今天开始我们学习安全管理模块Linux防火墙
  • 反爬API接口:技术实现与应用场景
  • 10.3 马尔可夫矩阵、人口和经济
  • OpenResty 中实现限流(Rate Limiting)的实战案例
  • 告别“人肉API”时代:AI智能体如何重构人机协同新范式
  • Centos7部署ceph存储
  • 【Pywinauto库】10.1 pywinauto.base_wrapper控件
  • 机器人/人形机器人无法商业化落地的原因
  • 十一旅游气象的关键影响与“用大模型拿到更好天气数据”的落地路线
  • 软考系统架构设计师之软件测试篇
  • 【竞赛系列】机器学习实操项目04——客户信用评估模型开发全流程(baseline)
  • 爆破mysql登录密码
  • PG-210-HI 山洪预警系统呼叫端:筑牢山区应急预警 “安全防线”
  • 工业 CT 检测服务公司转型:扫描图像 AI 重构系统与客户检测需求智能匹配中台
  • 【CVPR2021】《Unbiased mean teacher for cross-domain object detection》译读笔记
  • AI时代技术面试重构:谷歌如何用Vibe Coding与抗作弊革命重塑招聘
  • 【Python/Pytorch】-- 贝叶斯定理