如何基于训练集DataFrame对测试集Pandas DataFrame做MinMax归一化
基于训练集的MinMaxScaler归一化测试集(不合并数据集)
需求说明
现有两个Pandas DataFrame,已使用MinMaxScaler完成训练集的归一化用于神经网络训练。需要完全基于训练集的最小值和最大值对测试集执行归一化,且不能合并两个数据集(避免测试数据污染训练集统计量),同时适配多列数据集的场景。
示例数据
训练集
| colA | |
|---|---|
| 1 | 3 |
| 2 | 10 |
| 3 | 4 |
| 4 | 0 |
测试集
| colA | |
|---|---|
| 1 | 2 |
| 2 | 5 |
预期归一化结果
| colA | |
|---|---|
| 1 | 0.2 |
| 2 | 0.5 |
解决方案
核心思路:复用拟合过训练集的MinMaxScaler对象直接转换测试集。MinMaxScaler在fit()阶段会自动记录每个特征的最小值和最大值,后续transform()时会直接使用这些训练集的统计量,无需手动计算,完美适配多列场景。
完整代码示例
import pandas as pd from sklearn.preprocessing import MinMaxScaler # 1. 构建示例数据集(实际场景替换为你的真实数据) train_df = pd.DataFrame({'colA': [3, 10, 4, 0]}, index=[1, 2, 3, 4]) test_df = pd.DataFrame({'colA': [2, 5]}, index=[1, 2]) # 2. 初始化并拟合训练集(这一步是你已完成的训练集归一化操作) scaler = MinMaxScaler() # fit_transform同时完成拟合和训练集转换 train_scaled_df = pd.DataFrame( scaler.fit_transform(train_df), columns=train_df.columns, index=train_df.index ) # 3. 用训练集拟合好的scaler转换测试集 test_scaled_df = pd.DataFrame( scaler.transform(test_df), columns=test_df.columns, index=test_df.index ) # 查看结果 print(test_scaled_df)
输出结果
colA 1 0.2 2 0.5
关键说明
- 绝对不要在测试集上调用
fit()或fit_transform(),否则会用测试集的统计量覆盖训练集的记录,导致数据泄露。 - 多列场景下,
scaler会自动为每个特征单独记录训练集的min和max,转换测试集时自动匹配对应列的统计量,无需额外处理。
内容的提问来源于stack exchange,提问作者abootorabi
相关产品推荐
相关产品推荐

