如何直接对已归一化的DataFrame数据执行逆归一化还原原始值
逆归一化实现方法
要完成MinMax归一化后的逆变换,你必须提前知晓每一列原始数据的最大值和最小值,缺少这两个参数无法还原出真实的原始数值。MinMaxScaler的逆变换本质是对归一化公式的反向推导,不依赖原始数据,只依赖归一化时使用的各列最大/最小值参数。
核心公式
默认MinMaxScaler会将数据缩放到[0,1]区间,归一化公式为:x_norm = (x - x_min) / (x_max - x_min)
反向推导得到逆归一化公式:x = x_norm * (x_max - x_min) + x_min
其中x为原始值,x_norm为归一化后的值,x_min、x_max为对应列原始数据的最小值、最大值。
代码实现
方法1:手动按公式计算(最直接)
假设你已经提前记录了所有列的原始最大、最小值,存储为字典结构,可直接遍历列计算:
import pandas as pd # 示例:你需要提前补充所有列的原始min、max值 col_params = { "n_rgt_ps": {"min": 0, "max": 120}, "n_th_ps": {"min": 5, "max": 180}, "n_lft_ps": {"min": 2, "max": 95}, # 剩余列按实际情况补充完整 } df_original = df.copy() for col in df.columns: min_val = col_params[col]["min"] max_val = col_params[col]["max"] df_original[col] = df_original[col] * (max_val - min_val) + min_val
方法2:使用MinMaxScaler直接调用inverse_transform
可以手动给MinMaxScaler赋值参数,无需拟合原始数据:
from sklearn.preprocessing import MinMaxScaler import numpy as np import pandas as pd # 提取所有列的min、max为数组 col_mins = np.array([col_params[col]["min"] for col in df.columns]) col_maxs = np.array([col_params[col]["max"] for col in df.columns]) # 初始化scaler并手动赋值参数 scaler = MinMaxScaler() scaler.fit(df) # 仅初始化特征维度,不使用拟合结果 scaler.scale_ = 1/(col_maxs - col_mins) scaler.min_ = - col_mins / (col_maxs - col_mins) # 执行逆变换 df_original = pd.DataFrame(scaler.inverse_transform(df), columns=df.columns)
注意事项
- 如果你归一化时自定义了缩放区间(比如缩放到[-1,1]),需要对应调整逆变换公式,或者在初始化MinMaxScaler时传入对应的
feature_range参数再赋值scale_和min_ - 必须保证所有列的原始最大、最小值和归一化时使用的参数完全一致,否则逆变换结果会有偏差
内容的提问来源于stack exchange,提问作者Jewel_R
相关产品推荐
相关产品推荐

