如何用sklearn的MinMaxScaler规范化训练、测试及新数据?
如何在预测新数据时保持与训练数据一致的MinMaxScaler预处理基准?
你抓的这个点太关键了——机器学习里,预处理的规则必须从训练数据里学,然后完完整整套用到新数据上,绝对不能给新数据重新“定制”一套预处理规则,不然模型根本认不出这些特征!
你说的问题核心就在这里:如果对新数据执行min_max_scaler.fit_transform(),scaler会重新计算新数据里A、B的最大值和最小值来做归一化,这和训练时用的基准完全不一样,相当于把特征的“刻度”改了,模型训练时学的是旧刻度下的规律,自然没法给出正确预测。
正确的做法分两步:
1. 训练阶段:用训练数据拟合scaler并转换
这部分你原来的代码是对的,重点是fit_transform()只在训练数据上做:
from sklearn import preprocessing import pandas as pd min_max_scaler = preprocessing.MinMaxScaler() df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']}) # 用训练数据“教会”scaler该怎么归一化,同时转换训练数据 df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']]) df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1) # 接下来正常训练你的模型,比如: # from sklearn.linear_model import LogisticRegression # model = LogisticRegression() # model.fit(df[['A','B']], df['C'])
这里fit()的作用是让scaler记住训练数据里A、B的最大值、最小值这些关键统计量(你可以打印min_max_scaler.data_min_、min_max_scaler.data_max_看看这些存储的值)。
2. 预测阶段:直接用训练好的scaler转换新数据
绝对不能再调用fit(),只用transform()就好:
# 你的新数据 new_df = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]}) # 用训练阶段学过的规则转换新数据,完全复用训练时的max/min new_df[['A','B']] = min_max_scaler.transform(new_df[['A','B']]) # 然后用训练好的模型预测: # predictions = model.predict(new_df[['A','B']])
为什么这样才对?
模型是基于训练数据归一化后的特征训练的,比如训练时A的范围是1-16,归一化后是0-1;如果新数据的A是25,按照训练的规则,它会被转换成(25-1)/(16-1)=1.6,这个值虽然超过了训练时的0-1范围,但模型依然能基于学习到的规律判断——而如果重新fit新数据,25会被当成新的最大值转换成1,这就完全打乱了特征的意义。
简单说:训练时怎么处理数据,预测时就必须原封不动地照搬这个处理逻辑,这是保证预测有效的核心原则之一。
内容的提问来源于stack exchange,提问作者Tia




