Pythonデータサイエンス競争モデルの融合

モデル融合

モデルフュージョンの考え方は、複数のモデルを組み合わせることで全体的なパフォーマンスを向上させることができるということです。アンサンブルモデルは、さまざまな機械学習タスクの精度を向上させることができる強力な手法です。モデルフュージョンは、キャグルコンペティションの後期の重要な部分です。一般的に、次のタイプがあります。

1.単純加重融合:
回帰(分類確率):算術平均、幾何平均
分類:投票
合成:ランク平均、対数融合

2.スタッキング/ブレンディング:
マルチレイヤーモデルを構築し、予測結果を使用して予測に適合させます

3.ブースト/バギング:
xgboost、Adaboost、GBDTなどで使用されているマルチツリーブースト方法。

平均化

基本的な考え方:回帰問題の場合、単純でわかりやすい考え方は平均化することです。少し改善された方法は、加重平均を実行することです。重みは、並べ替え方法で決定できます。たとえば、A、B、Cの3つの基本モデルの場合、モデルの効果がランク付けされます。ランク付けが1、2、3であるとすると、3つのモデルに割り当てられた重みはそれぞれです。 3 / 6、2 / 6、1 / 6です。

平均法または加重平均法は単純に見えますが、実際、後の高度なアルゴリズムもこれに基づいていると言えます。バギングまたはブースティングは、多くの弱い分類子を強い分類子に融合するというアイデアです。

  1. 単純な算術平均法:平均化法は、複数のモデルによって予測された結果を平均します。この方法は、回帰問題と分類問題の確率の平均化の両方に使用できます。
  2. 加重算術平均法:この方法は平均法の拡張です。異なるモデルの能力が異なり、最終結果への寄与も異なることを考慮すると、異なるモデルの重要性を表すために重みが必要です。

投票

基本的な考え方:2つの分類の問題に対して3つの基本的なモデルがあるとします。これで、これらの基本的な学習者に基づいて投票分類子を取得し、最も投票数の多いクラスを予測するカテゴリとして取得できます。

  1. 絶対多数決方式:最終結果は、投票の半分以上を占める必要があります。
  2. 相対多数決法:最終結果は、投票で最も多くの票を獲得します。
  3. 加重投票
  4. ハード投票:モデル結果の相対的な重要性を区別せずに、複数のモデルに直接投票します。投票数が最も多いクラスが、最終的に予測されるクラスです。
  5. ソフト投票:重みを設定する機能が追加されました。モデルごとに異なる重みを設定して、モデルごとの重要性を区別することができます。

投票方法の実装コード: `

from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import VotingClassifier

model1 = LogisticRegression(random_state=2020)
model2 = DecisionTreeClassifier(random_state=2020)
model = VotingClassifier(estimators=[('lr', model1), ('dt', model2)], voting='hard')
model.fit(x_train, y_train)
model.score(x_test, y_test)

スタッキング

基本的な考え方:スタッキングは、初期トレーニングデータを使用して複数の基本的な学習者を学習し、これらの学習者の予測結果を新しい学習者を学習するための新しいトレーニングセットとして使用することです。さまざまなモデルによって予測された結果をモデル化します。
ここに写真の説明を挿入
スタッキング方式では、個人学習者を一次学習者、組み合わせに使用する学習者を二次学習者またはメタ学習者、二次学習者がトレーニングに使用するデータを二次トレーニングセットと呼びます。二次トレーニングセットは、トレーニングセットの一次学習者を使用して取得されます。

スタッキングは基本的には簡単なアイデアですが、トレーニングセットとテストセットの分布がそれほど一貫していないと問題になることがあります。問題は、初期モデルでトレーニングされたタグを使用してから、実際のタグを使用して再トレーニングすることです。間違いなく、特定のモデルがトレーニングセットに適合しすぎる原因になるため、モデルの一般化能力またはテストセットへの影響がある程度低下する可能性があるため、問題は、再トレーニングの過剰適合をどのように減らすかということになります。 、ここでは一般的に2つの方法があります。

  1. 二次モデルには単純な線形モデルを選択してみてください。ただし、練習後は線形モデルがうまく機能しません。LightGBMをお勧めします。
  2. Kフォールド相互検証を使用する

APiを呼び出して、スタッキングを実装します。

from heamy.dataset import Dataset
from heamy.estimator import Regressor, Classifier
from heamy.pipeline import ModelsPipeline
from sklearn import cross_validation
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
#加载数据集
from sklearn.datasets import load_boston
data = load_boston()
X, y = data['data'], data['target']
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.1, random_state=111)
#创建数据集
dataset = Dataset(X_train,y_train,X_test)
#创建RF模型和LR模型
model_rf = Regressor(dataset=dataset, estimator=RandomForestRegressor, parameters={
    
    'n_estimators': 50},name='rf')
model_lr = Regressor(dataset=dataset, estimator=LinearRegression, parameters={
    
    'normalize': True},name='lr')
# Stack两个模型
# Returns new dataset with out-of-fold predictions
pipeline = ModelsPipeline(model_rf,model_lr)
stack_ds = pipeline.stack(k=10,seed=111)
#第二层使用lr模型stack
stacker = Regressor(dataset=stack_ds, estimator=LinearRegression)
results = stacker.predict()
# 使用5折交叉验证结果
results10 = stacker.validate(k=5,scorer=mean_absolute_error)

手動実装:例として基本学習者を作成するだけです。

from sklearn.model_selection import StratifiedKFold,KFold,RepeatedKFold
import xgboost.sklearn import XGBClassifier
import numpy as np

skf = StratifiedKFold(n_splits = 5, shuffle = True ,random_state=16)
oof_xgb = np.zeros(len(train))  #创建数组
pre_xgb = np.zeros(len(test))

for k,(train_in,test_in) in enumerate(skf.split(train,train_y)):
    X_train,X_test,y_train,y_test = X[train_in],X[test_in],y[train_in],y[test_in]
    params = {
    
    'learning_rate': 0.008, 
              'n_estimators': 1000
              'max_depth': 5,
              'subsample': 0.8, 
              'colsample_bytree': 0.8, 
              'objective':'binary:logistic',
              'eval_metric':'auc',
              'silent': True, 
              'nthread': 4,
              }
    # train
    clf = XGBClassifier(params)
    clf.fit(trn_x, trn_y,eval_set=[(val_x, val_y)],eval_metric='auc',early_stopping_rounds=100,verbose=100)
    print('Start predicting...')
    oof_xgb[test_in] = clf.predict(X_test)
    pre_xgb += clf.predict(test) / skf.n_splits
    
print('XGB predict over')

ブレンディング

基本的な考え方:ブレンディングはスタッキングと同じ方法を使用しますが、トレーニングセットからフォールド結果のみを選択し、メタラーナーメタラーナーの機能として元の機能と連結し、テストセットで同じ操作を実行します。
元のトレーニングセットを2つの部分に分割します。たとえば、データの70%を新しいトレーニングセットとして、残りの30%をテストセットとして使用します。

  1. 最初のレイヤーでは、データの70%で複数のモデルをトレーニングしてから、30%のデータのラベルを予測し、テストセットのラベルも予測します。
  2. 第2層では、第1層で予測された30%のデータを新しい機能として直接使用してトレーニングを続行し、テストセットの第1層で予測されたラベルを機能として使用し、第2層でトレーニングされたモデルを使用してさらに予測を行います。

ブレンディングとスタッキングの比較:
利点:

  1. スタッカー機能を取得するためにk回の相互検証を実行する必要がないため、ブレンディングはスタッキングよりも簡単です。
  2. ブレンディングは情報漏えいの問題を回避します:ジェネレーターとスタッカーは異なるデータセットを使用します

短所:

  1. ブレンディングはほとんどデータを使用せず(ブレンダーの第2段階はトレーニングセットの10%しか使用しません)、ブレンダーはオーバーフィットする可能性があります
  2. 複数の相互検証を使用したスタッキングは、より堅牢になります
    ここに写真の説明を挿入
    ここに写真の説明を挿入
    ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43240913/article/details/110822100