广东工业大学 金融风控 task5

本文介绍了模型融合技术,包括简单平均、加权平均、投票法以及Stacking和Blending。Stacking通过多层模型预测结果的再拟合提高性能,而Blending则通过部分数据的预测结果融合。文章强调了简单方法的实用性以及Stacking的复杂性和潜在效果,并指出模型融合层数并非越多越好,适当结合多种融合策略可能带来更好的比赛策略。
摘要由CSDN通过智能技术生成

一、学习概要

1、模型融合

2、stacking和blending

3、经验总结

 

 

二、学习内容

1、模型融合

有以下方法

  • 平均:
    • 简单平均法
    • 加权平均法
  • 投票:
    • 简单投票法
    • 加权投票法
  • 综合:
    • 排序融合
    • log融合

2、stacking和blending

  • stacking:
  • import warnings
    warnings.filterwarnings('ignore')
    import itertools
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    from sklearn import datasets
    from sklearn.linear_model import LogisticRegression
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.naive_bayes import GaussianNB 
    from sklearn.ensemble import RandomForestClassifier
    from mlxtend.classifier import StackingClassifier
    from sklearn.model_selection import cross_val_score, train_test_split
    from mlxtend.plotting import plot_learning_curves
    from mlxtend.plotting import plot_decision_regions


    # 以python自带的鸢尾花数据集为例
    iris = datasets.load_iris()
    X, y = iris.data[:, 1:3], iris.target


    clf1 = KNeighborsClassifier(n_neighbors=1)
    clf2 = RandomForestClassifier(random_state=1)
    clf3 = GaussianNB()
    lr = LogisticRegression()
    sclf = StackingClassifier(classifiers=[clf1, clf2, clf3], 
                              meta_classifier=lr)


    label = ['KNN', 'Random Forest', 'Naive Bayes', 'Stacking Classifier']
    clf_list = [clf1, clf2, clf3, sclf]
        
    fig = plt.figure(figsize=(10,8))
    gs = gridspec.GridSpec(2, 2)
    grid = itertools.product([0,1],repeat=2)


    clf_cv_mean = []
    clf_cv_std = []
    for clf, label, grd in zip(clf_list, label, grid):
            
        scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
        print("Accuracy: %.2f (+/- %.2f) [%s]" %(scores.mean(), scores.std(), label))
        clf_cv_mean.append(scores.mean())
        clf_cv_std.append(scores.std())
            
        clf.fit(X, y)
        ax = plt.subplot(gs[grd[0], grd[1]])
        fig = plot_decision_regions(X=X, y=y, clf=clf)
        plt.title(label)


    plt.show()

    • 构建多层模型,并利用预测结果再拟合预测。
  • blending:

 

5.4.2 blending

 

1# 以python自带的鸢尾花数据集为例

2data_0 = iris.data

3data = data_0[:100,:]

4

​5
6target_0 = iris.target

7target = target_0[:100]

8

9#模型融合中基学习器

10clfs = [LogisticRegression(),

11RandomForestClassifier(),

12  ExtraTreesClassifier(),

13  GradientBoostingClassifier()]
14

15#切分一部分数据作为测试集

16X, X_predict, y, y_predict = train_test_split(data, target, test_size=0.3, random_state=914)

17

​18
19#切分训练数据集为d1,d2两部分

20X_d1, X_d2, y_d1, y_d2 = train_test_split(X, y, test_size=0.5, random_state=914)

21dataset_d1 = np.zeros((X_d2.shape[0], len(clfs)))

22dataset_d2 = np.zeros((X_predict.shape[0], len(clfs)))

23

24for j, clf in enumerate(clfs):

25  #依次训练各个单模型

26  clf.fit(X_d1, y_d1)

27  y_submission = clf.predict_proba(X_d2)[:, 1]

28 dataset_d1[:, j] = y_submission

29  #对于测试集,直接用这k个模型的预测值作为新的特征。
30 dataset_d2[:, j] = clf.predict_proba(X_predict)[:, 1]

31 print("val auc Score: %f" % roc_auc_score(y_predict, dataset_d2[:, j]))
32
33
34#融合使用的模型
35clf = GradientBoostingClassifier()
36clf.fit(dataset_d1, y_d2)
37y_submission = clf.predict_proba(dataset_d2)[:, 1]
38print("Val auc Score of Blending: %f" % (roc_auc_score(y_predict, y_submission)))
39选取部分数据预测训练得到预测结果作为新特征,带入剩下的数据中预测。

  • boosting/bagging(在Task4中已经提及,就不再赘述)
  • Blending与stacking的不同
    stacking
    stacking中由于两层使用的数据不同,所以可以避免信息泄露的问题。
    在组队竞赛的过程中,不需要给队友分享自己的随机种子。
    Blending
    由于blending对将数据划分为两个部分,在最后预测时有部分数据信息将被忽略。
    同时在使用第二层数据时可能会因为第二层数据较少产生过拟合现象。

教程中在VotingClassifier中加入了参数 voting='soft', weights=[2, 1, 1],weights用于调节基模型的权重

3 、教程经验总结

简单平均和加权平均是常用的两种比赛中模型融合的方式。其优点是快速、简单
stacking在众多比赛中大杀四方,但是跑过代码的小伙伴想必能感受到速度之慢,同时stacking多层提升幅度并不能抵消其带来的时间和内存消耗,所以实际环境中应用还是有一定的难度,同时在有答辩环节的比赛中,主办方也会一定程度上考虑模型的复杂程度,所以说并不是模型融合的层数越多越好的。
当然在比赛中将加权平均、stacking、blending等混用也是一种策略,可能会收获意想不到的效果哦
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值