使用StandardScaler和PCA后泰坦尼克数据集SVM交叉验证得分下降原因
性能下降的原因分析
1. 预处理流程存在数据泄露问题
你当前的实现是先对全量数据集拟合StandardScaler和PCA,再用处理后的全量特征跑交叉验证,这会让交叉验证每一折的验证集数据信息提前泄露到预处理阶段,得到的评估结果本身是失真的。正确做法是将预处理步骤放入交叉验证的Pipeline中,每一轮仅用当前折的训练集拟合预处理组件,再变换训练集和验证集,示例代码如下:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn import svm from sklearn.model_selection import cross_val_score import numpy as np # 把预处理和模型打包进Pipeline eval_pipe = Pipeline([ ('scaler', StandardScaler()), ('pca', PCA(n_components=0.95)), # 可调整保留的方差比例或维度数 ('svm', svm.SVC(gamma='auto', C=20, kernel='linear')) ]) # 直接传入原始特征做交叉验证,预处理会在每折内部自动完成 c_val_processed = cross_val_score(eval_pipe, x, y, cv=3) print(c_val_processed,'\n------\nAverage cross value score is :', np.mean(c_val_processed))
如果修正流程后得分仍然低于原始特征的结果,可参考以下几点原因:
- PCA无监督降维丢失有效预测信息:PCA仅根据特征的方差大小筛选保留信息,不会考虑特征和目标变量(是否存活)的相关性。泰坦尼克数据集中部分方差贡献低的特征(比如是否携带亲属、登船港口等)可能恰好和预测目标的相关性很高,降维时会被直接丢弃,导致模型可学习的有效信息减少,性能下降。你可以尝试调高PCA的
n_components参数,保留更多维度甚至取消PCA步骤,再对比得分。 - 标准化对离散特征无收益甚至负收益:泰坦尼克数据集的输入特征绝大多数是离散类别特征(如舱位等级、性别、亲属数量、登船港口编码),这类特征本身取值范围小、尺度差异不大,标准化原本用于对齐不同尺度连续特征的作用完全无法体现,反而会破坏离散取值的固有区分度:比如性别特征原始取值为0/1,两类边界非常清晰,标准化后会被映射为正负小数,反而弱化了类别差异,不利于线性SVM学习最优分类面。
- SVM参数和预处理后特征分布不匹配:你当前使用的
C=20属于正则化强度较低的配置,对原始特征的噪声容忍度更高,但标准化+PCA后的特征分布发生了明显变化,原有参数不再适配新的特征空间,你可以尝试通过网格搜索调整SVM的C、核函数等参数,匹配预处理后的特征分布。
内容的提问来源于stack exchange,提问作者jesjoshua243
相关产品推荐
相关产品推荐

