• 模型融合——stacking原理与实现


    一般提升模型效果从两个大的方面入手

    数据层面:数据增强、特征工程等

    模型层面:调参,模型融合

    模型融合:通过融合多个不同的模型,可能提升机器学习的性能。这一方法在各种机器学习比赛中广泛应用, 也是在比赛的攻坚时刻冲刺Top的关键。而融合模型往往又可以从模型结果,模型自身,样本集等不同的角度进行融合。

    模型融合是后期一个重要的环节,大体来说有如下的类型方式:

    • 加权融合(投票、平均)

      硬投票

      image-20220214103407094

      软投票

      image-20220214103422542

    • boosting/bagging(集成学习)

    • stacking/blending

    本文主要介绍stacking/blending方法的原理,及其实际应用

    Stacking模型本质上是一种分层的结构,这里简单起见,只分析二级Stacking.假设我们有3个基模型M1、M2、M3。[1]

    1. 基模型M1,对训练集train训练,然后在训练集和测试集预测,分别得到P1,T1。同理,得到P2,T2;P3,T3

      \[\begin{pmatrix} \vdots\\ P1\\ \vdots\\ \end{pmatrix} \begin{pmatrix} \vdots\\ T1\\ \vdots\\ \end{pmatrix}, \begin{pmatrix} \vdots\\ P2\\ \vdots\\ \end{pmatrix} \begin{pmatrix} \vdots\\ T2\\ \vdots\\ \end{pmatrix}, \begin{pmatrix} \vdots\\ P3\\ \vdots\\ \end{pmatrix} \begin{pmatrix} \vdots\\ T3\\ \vdots\\ \end{pmatrix} \]

    2. 分别把P1,P2,P3以及T1,T2,T3合并,得到一个新的训练集和测试集train2,test2.

      image-20220214114151806

    3. 再用第二层的模型M4训练train2,预测test2,得到最终的标签列。

      image-20220214114243425

    注意:

    用整个训练集训练的模型反过来去预测训练集的标签,毫无疑问过拟合是非常非常严重的,因此现在的问题变成了如何在解决过拟合的前提下得到P1、P2、P3,这就变成了熟悉的节奏——K折交叉验证。

    image-20220214111331739

    上图的模型1-5其实是一个模型在不同折下训练。

    最终的代码是两层循环,第一层循环控制基模型的数目,每一个基模型要这样去得到P1,T1,第二层循环控制的是交叉验证的次数K,对每一个基模型,会训练K次最后拼接得到P1,取平均得到T1。

    python实现[2]

    X_train_stack  = np.zeros((X_train.shape[0], len(clfs)))
    X_test_stack = np.zeros((X_test.shape[0], len(clfs)))
    
    ### 6折stacking
    n_folds = 6
    skf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=1)
    for i,clf in enumerate(clfs):
    #     print("分类器:{}".format(clf))
        X_stack_test_n = np.zeros((X_test.shape[0], n_folds))
        for j,(train_index,test_index) in enumerate(skf.split(X_train,y_train)):
                    tr_x = X_train[train_index]
                    tr_y = y_train[train_index]
                    clf.fit(tr_x, tr_y)
                    #生成stacking训练数据集
                    X_train_stack [test_index, i] = clf.predict_proba(X_train[test_index])[:,1]
                    X_stack_test_n[:,j] = clf.predict_proba(X_test)[:,1]
        #生成stacking测试数据集
        X_test_stack[:,i] = X_stack_test_n.mean(axis=1)
        
    ###第二层模型LR
    clf_second = LogisticRegression(solver="lbfgs")
    clf_second.fit(X_train_stack,y_train)
    pred = clf_second.predict_proba(X_test_stack)[:,1]
    roc_auc_score(y_test,pred)
    

    理论介绍推荐阅读[1],实现部分可以阅读[2]

    references

    【1】【机器学习】模型融合方法概述. https://zhuanlan.zhihu.com/p/25836678

    【2】Kaggle提升模型性能的超强杀招Stacking——机器学习模型融合. https://zhuanlan.zhihu.com/p/107655409

  • 相关阅读:
    vuex中store分文件时候index.js进行文件整合
    vuex使用 实现点击按钮进行加减
    页面跳转时候拼接在url后面的多个 参数获取
    vue知识点2018.6.3
    vue项目中,main.js,App.vue,index.html如何调用
    locatin
    Json
    Python3基础 list 访问列表中的列表的元素
    Python3基础 list 索引查看元素
    Python3基础 list 查看filter()返回的对象
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/15891945.html
Copyright © 2020-2023  润新知