💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

被Scikit-learn Pipeline的特征缩放顺序坑到怀疑人生,记录个解法

目录

    今天跑模型,调到凌晨两点。训练集准确率80%,测试集50%。我反复检查数据、调参、换模型,以为是过拟合。结果发现,是Pipeline里特征缩放顺序写反了——血亏。

    报错现场
    代码跑完,测试集准确率崩得比我的黑眼圈还狠。模型在训练集上稳如老狗,一到测试集就掉链子。我盯着日志,懵了:
    Accuracy on test set: 0.5

    核心根源
    Pipeline顺序错了!我先做了特征选择(SelectKBest),再缩放(StandardScaler)。但StandardScaler必须在特征选择之前
    为什么?

    • StandardScaler训练时要算全特征的均值/方差。
    • 如果特征选择在缩放前,SelectKBest用的是原始数据,缩放却用过滤后的特征算统计量。
    • 结果:缩放时数据分布错乱,特征选择失效。

    错误示范 vs 正确姿势
    直接上代码,注释拉满:

    # ❌ 错误示范:特征选择在缩放前(坑我一晚上)
    from sklearn.pipeline import Pipeline
    from sklearn.feature_selection import SelectKBest
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LogisticRegression
    
    pipeline_wrong = Pipeline([
        ('feature_selection', SelectKBest(k=5)),  # 先选特征(用原始数据)
        ('scaler', StandardScaler()),  # 再缩放(但缩放的是选后的5个特征!)
        ('model', LogisticRegression())
    ])
    
    # ✅ 正确姿势:缩放在特征选择前(这才是对的)
    pipeline_correct = Pipeline([
        ('scaler', StandardScaler()),  # 先缩放所有特征(用原始数据统计量)
        ('feature_selection', SelectKBest(k=5)),  # 再选特征(基于缩放后的数据)
        ('model', LogisticRegression())
    ])
    

    实测验证
    我跑了一组对比:

    • 错误顺序:测试准确率 50%
    • 正确顺序:测试准确率 85%
      (数据集:UCI Heart Disease,1000条样本)

    Pipeline顺序错误导致缩放统计量错乱示意图
    (图里红框标出:特征选择后缩放,用错了数据维度)

    避坑总结

    1. 顺序是命:数据预处理(缩放、编码)必须在特征工程(选择、组合)之前
    2. 别信直觉:Pipeline是线性执行的,步骤顺序就是执行顺序。
    3. 我的教训:别像我一样,以为是模型问题,其实连Pipeline顺序都搞反了。
    4. 检查技巧:写Pipeline时,先列步骤顺序,再问自己:“这步操作需要基于上一步的输出吗?”

    下次再写Pipeline,先问自己:缩放该在特征选择前还是后?别等测试集崩了才哭。
    (现在去睡了,明天再调代码。)

    Logo

    AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

    更多推荐