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

如何用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

火山引擎 最新活动