数值特征有离群点怎么缩放?用 RobustScaler 核对中位数与四分位距

用七条数值手算 RobustScaler 的中位数与四分位距,比较两种缩放结果,并检查极端值、零IQR和稀疏输入边界。

当一列大多数数值集中在10到15,只有一条达到1000时,均值和标准差会受到这一极端值影响。RobustScaler 改用中位数和四分位距确定尺度,让你能检查主体数据的间隔;它不能自动把极端值判为错误。

了解它到底改变什么

默认 RobustScaler 先减去每列中位数,再除以第75百分位与第25百分位之差,即四分位距IQR。

数值特征有离群点怎么缩放?用 RobustScaler 核对中位数与四分位距

本文采用默认quantile_range=(25,75)、with_centering=True、with_scaling=True、unit_variance=False,所以可以直接用(x−中位数)/IQR手算。修改这些参数后,不能沿用下面的数值解释。

本文示例已在 Python 3.11、scikit-learn 1.7.2、NumPy 2.4.6、pandas 2.3.3、SciPy 1.17.1 的本地 CPU 环境运行;输入是人为生成的教学数据,不是客户案例。

python -m venv .venv
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
python -m pip install scikit-learn==1.7.2 pandas==2.3.3 numpy==2.4.6 scipy==1.17.1

用七条数值核对缩放公式

把代码保存为 robust_scale.py 并运行 python robust_scale.py,先核对center_和scale_,再逐行比对手算与缩放输出。

示例把七条数值视作训练特征。这里仅比较变换,不训练分类器、不评估模型准确率。代码同时打印StandardScaler结果,便于看清两种尺度怎样分配主体数据和极端值。

import numpy as np
from sklearn.preprocessing import RobustScaler, StandardScaler

X_train = np.array([10, 11, 12, 13, 14, 15, 1000], dtype=float).reshape(-1, 1)
median = np.median(X_train, axis=0)
q25, q75 = np.percentile(X_train, [25, 75], axis=0)
iqr = q75 - q25
if np.any(iqr == 0):
    raise ValueError("四分位距为零,检查常量或离散分布")
robust = RobustScaler().fit(X_train)
standard = StandardScaler().fit(X_train)
r = robust.transform(X_train)
s = standard.transform(X_train)
manual = (X_train - median) / iqr
assert np.allclose(r, manual)
assert np.allclose(robust.inverse_transform(r), X_train)
print("median/Q25/Q75/IQR:", median, q25, q75, iqr)
print("center_/scale_:", robust.center_, robust.scale_)
print("原值 Robust Standard")
for original, a, b in zip(X_train[:, 0], r[:, 0], s[:, 0]):
    print(f"{original:.0f} {a:.4f} {b:.4f}")
new = np.array([[16.0], [2000.0]])
print("新值缩放:", robust.transform(new).ravel().round(4))
assert len(r) == len(X_train)

逐行读结果,不把数值小当作异常已消失

这组数据的中位数是13,Q25是11.5,Q75是14.5,IQR是3;因此10变成−1,13变成0,1000变成329。

原值 RobustScaler StandardScaler(约)
10 -1.0 -0.4155
13 0.0 -0.4068
15 0.6667 -0.401
1000 329.0 2.4495

StandardScaler以所有七条数值的均值和标准差为尺度,使10到15的输出挤在大约−0.4155到−0.4010之间。RobustScaler中,这几条记录仍相差约1/3。两者各自的输出数值不能拿来互相判断记录好坏;尺度不同,数值大小也会不同。

RobustScaler 不删除、截断或修复离群点,1000缩放后仍然是329;如果目标是判断哪些记录错误,需要另外定义异常检查与人工复核规则。

inverse_transform的断言把缩放值还原后与输入逐项比较,说明本例没有删行或改写原始事实。新输入16与2000分别得到1和662.3333,仍使用原先保存的中位数与IQR;新值不会重新改变训练尺度。

决定是否适合你的特征

适合先考虑的情况是:单位差异需要处理、主体分布有意义、少量极端值让均值与标准差很不稳定。树模型往往不依赖相同的数值尺度;改用RobustScaler后是否提高下游模型效果,需要在同样的数据划分和指标下比较,本文没有给出效果提升结论。

IQR为零说明中间一半数据几乎没有变化,可能是常量列、稀疏计数或非常集中的离散值。示例先主动报错让你检查,避免把手算除零继续用于建模;真实项目需按字段含义决定是否保留、改用别的变换或删除无信息特征。

默认居中会把稀疏矩阵变成密集表示,官方接口因此不允许对稀疏输入这样操作。稀疏数据需要考虑with_centering=False;这时不再是本文展示的减中位数公式。

把它接入训练时再核对两件事

只用训练集拟合缩放器,并把同一个变换应用到验证和预测输入;不能每次预测都重新计算尺度。保留字段名、列顺序和单位,避免将金额与次数错列输入。此处七条数据只是缩放演示,不能用来判断模型泛化能力。

官方资料与适用版本

本文于2026年10月1日核对下列官方资料,接口说明对应 scikit-learn 1.7;运行示例使用1.7.2。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30719.html

赞 (0)
AI小管家的头像AI小管家
预测结果怎样给出范围?用 QuantileRegressor 训练分位数并核对覆盖率
上一篇 1天前
训练数据有缺失值怎么办?用 SimpleImputer 填补特征并检查空列
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部