財務リスク管理のデフォルト予測-タスク5

0.概要

モデルフュージョンとは、異なるモデルの結果を統合することです。個人的には、モデルフュージョンはフィーチャ構築とは異なる必要があると感じています。モデルの結果を学習用のフィーチャとして使用する場合、実際には新しいフィーチャ構築、つまりフィーチャエンジニアリングのコンテンツと見なす必要があります。したがって、モデル融合の方法は、平均化方法、投票方法、エラー修正コード方法、ブーストおよびバギングでなければなりません。モデルフュージョンの考え方は、同時に聞くと、複数のモデルの結果がマージされ、単一のモデルが真の値から大幅に逸脱する可能性を減らすことです。モデル融合の結果は、精度を向上させるか、分散を減らすことができます。優れたモデル融合は、分散を減らしながら精度を向上させる必要があります。

1.平均的な方法

  • 単純な加重平均。結果は直接マージされ
    、複数の予測結果の平均が求められます。pre1-prenは、重み付けされてマージされたnグループのモデルによって予測された結果です。
pre = (pre1 + pre2 + pre3 +...+pren )/n
  • 加重平均法は、
    通常、前の予測モデルの精度に基づいて加重融合を実行し、より高い加重のモデルにより高い精度を割り当てます。
pre = 0.3pre1 + 0.3pre2 + 0.4pre3 

2.投票

  • 簡単な投票
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
 
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))
- 加权投票
在VotingClassifier中加入参数 voting='soft', weights=[2, 1, 1],weights用于调节基模型的权重
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
 
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)], voting='soft', weights=[2, 1, 1])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))

3.ブースティング/バギング

統合モデル統合方式(アンサンブル方式)
統合モデルは、データ使用とモデルの組み合わせのルールに従ってブーストとバギングに分割し、すべてのデータの使用を改善し、エラー率の高いデータの重みを継続的に増やすことができます。主な機能は偏差を減らすことです。バギングはデータサンプリング方式を使用し、最後に各モデルが投票されます。その主な機能は分散を減らすことです。

学習課題は、複数の学習者を組み合わせることで完了します。アンサンブル方式では、複数の弱い学習者を組み合わせて強い分類器にすることができるため、一般的に、アンサンブル学習の一般化能力は、単一の分類器よりも優れています。

統合方法には、主にバギングとブースティングが含まれます。バギングとブースティングはどちらも、既存の分類または回帰アルゴリズムを特定の方法で組み合わせて、より強力な分類を形成します。どちらの方法も、複数の分類子を1つの分類子に統合する方法ですが、統合の方法が異なり、最終的な結果も異なります。Bagginのアイデアに基づく一般的なアンサンブルモデルには、ランダムフォレスト、Boostingのアイデアに基づくアンサンブルモデル:Adaboost、GBDT、XgBoost、LightGBMなどがあります。

BagginとBoostingの違いは次のように要約されます。

サンプルの選択:バギング方式のトレーニングセットは、元のセットから置き換えて選択されるため、元のセットから選択された各ラウンドのトレーニングセットは独立しています。一方、ブースティング方式では、各ラウンドのトレーニングセットを変更する必要がありますが、分類器のトレーニングセットの各サンプルの重量が変化します。重みは、前の分類の結果に基づいて調整され
ます。バギング方式は均一なサンプリングを使用するため、各サンプルの重量は等しくなります。ブースティング方式は、エラー率に応じてサンプルの重量を継続的に調整しますが、エラー率は大きくなります。重みが大きいほど、
予測関数:Baggingメソッドのすべての予測関数の重みは等しくなります。Boostingメソッドでは、弱い分類子ごとに対応する重みがあり、分類エラーが小さい分類子の重みが大きくなります。
並列計算:Baggingメソッドの予測関数は並列に生成できますが、ブースティングメソッドの予測関数は順次生成することしかできません。後者のモデルパラメータは前のラウンドのモデルの結果を必要とするためです。

4.スタッキング&ブレンディング

  • スタッキング
    は、複数の基本学習者によって取得された予測結果を使用し、学習者をトレーニングするための新しいトレーニングセットとして予測結果を使用します。次の図に示すように、5人の基本学習者がいて、データを5人の基本学習者に取り込んで予測結果を取得し、モデル6に入れてトレーニング予測を行うとします。ただし、5人の基本学習者が得た結果は、モデル6に直接取り込まれるため、過適合が発生しやすくなります。したがって、5つの合計モデルを使用して予測を行う場合は、Kフォールド検証を使用して過適合を防ぐことを検討できます。

stacking.png

  • ブレンディング
    はスタッキングとは異なり、新しい機能としての予測値と元の機能を組み合わせて、予測用の新しい機能値を形成します。オーバーフィットを防ぐために、データをd1とd2の2つの部分に分割し、d1のデータをトレーニングセットとして使用し、d2のデータをテストセットとして使用します。予測されたデータは新しい機能として使用され、d2データはトレーニングセットとして使用され、新しい機能と組み合わされてテストセットの結果を予測します。

Blending.png

  • ブレンディングとスタッキングの違い

    • スタッキング
      • スタッキングでは、2つのレイヤーが異なるデータを使用するため、情報漏えいの問題を回避できます。
      • チームの競争中に、ランダムなシードをチームメートと共有する必要はありません。
    • ブレンディング
      • ブレンディングペアはデータを2つの部分に分割するため、一部のデータ情報は最終的な予測では無視されます。
      • 同時に、第2層のデータを使用する場合、第2層のデータによるオーバーフィットが少なくなる可能性があります。
  • スタッキング:

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()
Accuracy: 0.91 (+/- 0.07) [KNN]
Accuracy: 0.94 (+/- 0.04) [Random Forest]
Accuracy: 0.91 (+/- 0.04) [Naive Bayes]
Accuracy: 0.94 (+/- 0.04) [Stacking Classifier]

png

  • ブレンディング
# 以python自带的鸢尾花数据集为例
data_0 = iris.data
data = data_0[:100,:]


target_0 = iris.target
target = target_0[:100]
 
#模型融合中基学习器
clfs = [LogisticRegression(),
        RandomForestClassifier(),
        ExtraTreesClassifier(),
        GradientBoostingClassifier()]
 
#切分一部分数据作为测试集
X, X_predict, y, y_predict = train_test_split(data, target, test_size=0.3, random_state=914)


#切分训练数据集为d1,d2两部分
X_d1, X_d2, y_d1, y_d2 = train_test_split(X, y, test_size=0.5, random_state=914)
dataset_d1 = np.zeros((X_d2.shape[0], len(clfs)))
dataset_d2 = np.zeros((X_predict.shape[0], len(clfs)))
 
for j, clf in enumerate(clfs):
    #依次训练各个单模型
    clf.fit(X_d1, y_d1)
    y_submission = clf.predict_proba(X_d2)[:, 1]
    dataset_d1[:, j] = y_submission
    #对于测试集,直接用这k个模型的预测值作为新的特征。
    dataset_d2[:, j] = clf.predict_proba(X_predict)[:, 1]
    print("val auc Score: %f" % roc_auc_score(y_predict, dataset_d2[:, j]))


#融合使用的模型
clf = GradientBoostingClassifier()
clf.fit(dataset_d1, y_d2)
y_submission = clf.predict_proba(dataset_d2)[:, 1]
print("Val auc Score of Blending: %f" % (roc_auc_score(y_predict, y_submission)))

おすすめ

転載: blog.csdn.net/hu_hao/article/details/108838349