You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对训练测试集缩放后SVC模型得分达1.0,该异常结果如何处理?

模型缩放后得分1.0异常问题解答

问题复现

缩放前特征

缩放前特征
对应代码:

scaler.fit(x_train)
scaler.fit(x_test)
xts= scaler.transform(x_train)
xts=pd.DataFrame(xts, columns=x_train.columns)
xtest= scaler.transform(x_test)
xtest=pd.DataFrame(xtest, columns=x_test.columns)

from sklearn.svm import SVC
model = SVC()
model.fit(x_train,y_train)
model.score(x_test,y_test)

# 得分结果:0.71-0.76

缩放后特征

缩放后特征
对应代码:

scaler = MinMaxScaler()
scaler.fit(x_train)
scaler.fit(x_test)
xts= scaler.transform(x_train)
xts=pd.DataFrame(xts, columns=x_train.columns)
xtest= scaler.transform(x_test)
xtest=pd.DataFrame(xtest, columns=x_test.columns)

from sklearn.svm import SVC
model = SVC()
model.fit(xts,y_train)
model.score(xtest,y_test)

# 得分结果:1.0

问题根因

该1.0得分属于异常结果,并非多虑,核心原因是预处理阶段的数据泄露,具体错误点如下:

  1. 缩放器调用逻辑错误:先后两次调用scaler.fit()方法,用训练集拟合后又用测试集做二次拟合,直接覆盖了缩放器保存的训练集分布参数,最终缩放器的最大、最小值均基于测试集计算,相当于提前将测试集的分布信息泄露到了预处理环节。
  2. 未缩放版本的代码中缩放逻辑未生效:虽然写了特征缩放的相关代码,但实际训练、评估模型时用的是未做缩放的原始x_train、x_test,因此得到的0.71-0.76是符合预期的正常得分;而缩放版本的代码使用了被污染的缩放器处理后的特征训练评估,SVC本身对特征尺度高度敏感,很容易拟合到泄露的测试集信息上,最终出现满分的异常结果。

修复方案

严格遵循缩放器仅允许用训练集拟合,禁止接触任何测试集信息的预处理原则,调整缩放器调用逻辑即可,修正后的代码如下:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC

# 初始化缩放器,仅用训练集拟合
scaler = MinMaxScaler()
scaler.fit(x_train)

# 用同一个缩放器分别转换训练集、测试集
xts = scaler.transform(x_train)
xts = pd.DataFrame(xts, columns=x_train.columns)
xtest = scaler.transform(x_test)
xtest = pd.DataFrame(xtest, columns=x_test.columns)

# 模型训练与评估
model = SVC()
model.fit(xts, y_train)
print(model.score(xtest, y_test))

修正后重新运行,模型得分会回落至合理区间,通常会比未缩放的0.71-0.76有小幅提升,不会再出现1.0的异常情况。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:42:00