对训练测试集缩放后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得分属于异常结果,并非多虑,核心原因是预处理阶段的数据泄露,具体错误点如下:
- 缩放器调用逻辑错误:先后两次调用
scaler.fit()方法,用训练集拟合后又用测试集做二次拟合,直接覆盖了缩放器保存的训练集分布参数,最终缩放器的最大、最小值均基于测试集计算,相当于提前将测试集的分布信息泄露到了预处理环节。 - 未缩放版本的代码中缩放逻辑未生效:虽然写了特征缩放的相关代码,但实际训练、评估模型时用的是未做缩放的原始
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
相关产品推荐
相关产品推荐

