You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Scikit-learn中还原标准化后的原始值?StandardScaler逆转换预测结果报错求助

问题分析与解决方案

嘿,这个问题我之前调模型时也踩过坑,核心是你搞混了输入特征标准化器预测结果逆变换的对应关系!

错误根源

你用的sc是拟合在2维输入特征(X_train,形状(样本数,2))上的StandardScaler,它内部的scale_mean_都是长度为2的数组,对应salaryage两个特征的缩放参数。但你的sample_predict是模型输出的预测结果(形状(1,1))——这应该是目标变量(比如回归任务的预测值),用处理输入的scaler去逆变换1维的目标值,必然会触发维度不匹配的广播错误。

正确处理方式

分两种情况来解决:

情况1:你没有对目标变量做标准化

如果训练时你只标准化了输入X,没有处理目标y,那根本不需要对预测结果做逆变换,直接输出模型的预测值即可,删掉sample_predict = sc.inverse_transform(sample_predict)这行代码就行。

情况2:你训练时对目标变量y做了标准化

如果训练时为了提升模型效果,对y也做了标准化,那必须给y单独分配一个StandardScaler,不能复用X的scaler。完整的正确流程代码如下:

from sklearn.preprocessing import StandardScaler
import pandas as pd

# ---------------------- 训练阶段 ----------------------
# 处理输入特征X(用单独的scaler)
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

# 处理目标变量y(用另一个独立的scaler)
# 注意:y需要转成2维数组才能被StandardScaler处理
sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train.values.reshape(-1, 1))

# 训练你的模型(这里以线性回归为例,替换成你自己的模型)
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)

# ---------------------- 预测阶段 ----------------------
sample = pd.DataFrame({'salary': [1211], 'age': [30]})
# 用X的scaler标准化输入样本
sample_scaled = sc_X.transform(sample)
# 得到标准化后的预测结果
sample_predict_scaled = model.predict(sample_scaled)
# 用y的scaler逆变换回原始数据尺度
sample_predict = sc_y.inverse_transform(sample_predict_scaled)
print(sample_predict)

关键提醒

  • 输入特征和目标变量的标准化是两个独立的过程,必须用不同的StandardScaler实例处理,避免维度不匹配问题。
  • 如果是分类任务,目标变量是离散类别,完全不需要做标准化,也就不存在逆变换的需求。

内容的提问来源于stack exchange,提问作者NormA

火山引擎 最新活动