【機械学習アルゴリズム】 3. 統合アルゴリズム:RF、AdaBoost、GBDT、XGBoost、LightGBM、スタッキングモデル融合

3. 統合アルゴリズム: RF、AdaBoost、GBDT、XGBoost、LightGBM、スタッキング モデル フュージョン

1. 積分アルゴリズムの原理の紹介

統合アルゴリズムは、多数の弱い評価器 (ベース評価器とも呼ばれます) を確立し、特定の統合ルールに従ってこれらの弱い評価器の評価結果を統合し、単一の弱い評価器よりも良い結果を達成することです。核となる考え方は、靴屋3人は諸葛孔明に匹敵するというものだ。

ストゥージズとは誰ですか?決定木、線形回帰、ロジスティック回帰、単純ベイズ、SVM、KNN などが利用可能で、これらの単一の評価器も基本評価器として使用できます。

三人の靴屋が一人の諸葛孔明に立ち向かうことができるでしょうか? 弱い評価器が 3 つある場合、それぞれの弱い評価器の効果は 0.6 です。ここでは少数派と多数派の統合ルールに基づいて単純に統合します。統合後の精度は、0.6*0.6*0.6+3*0.6*0.6 *0.4=0.6479999999999999 となります。5 つの弱評価器を統合すると、統合精度は 0.6*0.6*0.6*0.6*0.6+5*0.6*0.6*0.6*0.6*0.4+10*0.6*0.6*0.6*0.4*0.4=0.68256 となります。7つ統合すれば。忘れたくないのですが、統合後の精度は確実に高くなります。
統合学習の代表的なアルゴリズムとしては、Random Forest、GBDT、Xgboost、LightGBMなどがあり、名前を聞くだけでも非常に強力です。

現在どのような統合ルールが適用されていますか? 主な統合方法は次の 3 つです。

方法1:袋詰め法。
この手法の代表的なものはアンサンブルアルゴリズムの入門アルゴリズムでもあるランダムフォレストです。名前が示すように、ランダム フォレストの基本評価は決定木であり、複数の決定木を構築することを意味し、分類タスクの場合は多数派に従う少数派のルールで統合され、回帰タスクの場合は、平均法により積分されます。しかし、それはそれほど単純ではありません。ここにはいくつかの詳細があります。

詳細 1. ランダム フォレスト内の各ツリーは、すべてのトレーニング サンプルを使用して構築されるのではなく、トレーニング サンプルの一部がランダムに選択され、置換によってツリーに適合されます。逆に考えると、各ツリーがすべてのサンプルを使用した場合、各ツリーは同じに見えませんか? すべてのツリーの予測結果は同じになるため、最終的な統合結果は次の結果になるのではないでしょうか?それぞれの木?したがって、各ツリーを生成するときは、一部のサンプルのみを使用して生成する必要があります。

詳細 2: トレーニング サンプルのサンプリングに加えて、トレーニング機能もサンプリングする必要があります。つまり、各ツリーの生成には、サンプリング サンプルだけでなく、サンプリング特徴も必要となります。この目的は、さまざまなツリーを生成することです。それぞれの木にはサンプルや特徴が異なるため、それぞれの木には異なる強みがあります。したがって、バギング手法を使用して統合する場合、統合効果が達成されるように、基本分類子が互いに独立しており、異なることを確認する必要があります。

詳細 3、この置換を伴うランダム サンプリング方法では、サンプル サイズが小さいデータや特徴がほとんどないデータの場合、すべてのサンプルとすべての特徴がサンプリングされて学習される可能性があります。ただし、トレーニング セットのサンプル サイズが大きいデータ セットの場合、一部のサンプルがまったくサンプリングされない可能性があります。サンプルが n 個ある場合、サンプルが抽出される確率は 1/n、抽出されない確率は 1-1/n です。m 回抽出された場合、抽出されない確率は (1-1 / n)**m、m と n の両方が非常に大きくなる傾向がある場合、この確率は 1/e になる傾向があります。つまり、サンプルの約 36.8% が抽出されません。これらのデータはアウト オブ バッグ データ (oob) と呼ばれるため、ランダム フォレストを使用する場合、テスト セットとトレーニング セットを分割する必要はなく、モデルをテストするためにアウト オブ バッグ データのみを使用する必要があります。もちろん、十分なデータがあり、バッグの外にあるデータを持っていることが前提となります。データが少ない場合は、バッグの外にデータがないため、当然役に立ちません。

要約: バギング法は、単一モデルの不適切な選択のリスクを大幅に軽減し、単一の基本モデルよりも分散が小さい強力なモデルを取得できます。したがって、バギング法を使用する場合、ベース モデルはバイアスが低く、分散が高いベース モデルを使用するのが最適ですが、このとき、統合モデルの分散は小さくなり、モデルはより安定します。

方法2:ブースト法。
ブースティング方法はバギングと同じであり、基本モデルはすべて同じ種類の弱モデルですが、バギングとは異なり、各弱モデルは独立して並列接続されており、ブースティングの基本モデルは厳密に順序付けされ、直列に接続されています。
バギングとは異なり、ブースティングは、単一のベース モデルよりも偏差が低い強力なモデルを生成することに重点を置いています。これは、各ベース モデルを前から後ろまでスクリーニングおよび研磨して、各ベース モデルを非常に強力にすることを意味します。また、各ベース モデルに異なる重みを与えることも意味します。それらを統合します。平たく言えば、さまざまな手段を使ってシリーズ内の各モデルの効果を向上させ、弱い各モデルを非常に強力にし、これらのベースモデルを重み付けされた形式で統合することで、当然最終的な結果はさらに優れたものになります。この目標と方向に基づいて、ブースティング手法には、サンプルの選択、トレーニング プロセス、ベース モデルの統合ルールの点で独自の特徴があります。

ブースティング方式には、アダプティブブースティング(adaboost)とグラディエントブースティング(gradient boosting)の 2 つの方式があります。

(1) adaboost は適応型ブースティングです。適応的改善とは何ですか? つまり、一連のベース モデル (ベース モデルの順序は変更できません) において、各ベース モデルのトレーニング セットは元のトレーニング セットですが、トレーニング セット内の各サンプルの重みは変更されており、この重みは分類器の分類結果は自動的に調整されます。前の分類器で分類されたサンプルを数値で割り、誤って分類されたサンプルにその数値を掛けることで、データセットのサンプルの重みが変化するため適応的です。次に、重みが変更されたトレーニング セットが次の基本モデルに供給されます。サンプルの重みが大きいほど、損失関数の対応する損失の前の係数も大きくなることは誰もが知っています。損失関数の指導の下、このサンプルは学習に焦点を当てます。分類子 サンプルが間違っている場合、次の分類子はこのサンプルに焦点を当てます。基本モデルのさまざまなトレーニング サンプルの重みに加えて、adaboost は統合に重み付けルールも使用します。統合に重みを付けるにはどうすればよいですか? たとえば、最初のベース モデルのトレーニング結果が最初に保存され、2 番目のベース モデルのトレーニングを開始するときに、サンプルの重みを調整するだけでなく、そのトレーニング結果も保存され、次に線形回帰を使用します。 2 つを組み合わせる 予測結果と実際のラベルをまとめて線形回帰を実行し、2 つの基本モデルの統合された重みを取得します。3 番目のベース モデルのトレーニングを開始するときは、サンプルの重みを調整することに加えて、結果を最初の 2 つのベース モデルの結果と組み合わせて、実際のラベルに対して回帰する必要があります。実ラベルである場合、その回帰係数は当然 0、つまり 3 番目の基本モデルの重みは 0 となり、統合された予測結果は無関係になります。引き続き 4 番目の基本モデルを生成し、以下同様に、追加されたすべての基本モデルがすべてフィッティング ラベルに寄与することを確認します。これもブーストの理由です。アダプティブブースティングの代表的なアルゴリズムとしては、AdaBoostがある。タスクごとに異なる統合ルールが使用されるため、AdaBoost には LogitBoost (分類) や L2Boost (回帰) などのバリエーションがあります。

(2) 勾配ブースティング、勾配ブースティング、勾配ブースティングとは何ですか? 勾配ブースティングは adaboost のようにサンプルの重みを変換しませんが、後続のベース モデルは前のモデルの残差を学習し、残差が特定のしきい値に達すると新しいベース モデルの生成を停止するため、勾配ブースティングと呼ばれます。この手法には統合ルールは含まれず、統合モデルの予測値はすべてのベース モデルの予測値の合計になります。この方法の効果は非常に優れており、残差を直接フィッティングする深層学習の残差ネットワークの考え方と同じであり、効果は非常に優れています。対応する代表的なアルゴリズムは、GBDT とその改良され最適化されたエンジニアリング バリアント XGBoost、および現在人気のある Microsoft オープン ソースの LightGBM です。これもデシジョン ツリー アルゴリズムに基づく勾配ブースティング フレームワークです。LightGBM は、その驚くべき速度、分散サポート、メモリ使用量の小ささにより、現在の機械学習アルゴリズムの中で急速に新たなお気に入りになりました。

概要: ブースティング手法を使用する場合、基本モデルは弱いモデル、つまりデータにアンダーフィットするモデルである必要があります。このときブースティング積分を使用すると効果が大幅に向上します。逆に、ベース モデルが過学習モデルの場合は、ブーストする必要はなく、ブーストする余地もありません。第 2 に、ブースティング手法はノイズ サンプルや異常サンプルに敏感です。データ セットがあまり良くない場合は、まず特徴量エンジニアリングに重点を置く必要があります。最初に特徴量エンジニアリングでいくつかのトリックを実行してから、ブースティング手法を使用します。

方法3:スタッキング方法。
スタッキングでは異なるベース エバリュエーターを使用し、統合する場合は、adaboost の統合方法に従い、すべてのベース エバリュエーターの結果に対して線形回帰またはロジスティック回帰を実行します。

概要: バギング メソッドの基本評価器はすべて同じであり、そのステータスも同じであり、すべて独立しているため、並列実行できます。ブースティング方式のベース評価器も同様ですが、直列に接続されており並列実行できません。スタッキングの基本評価器も並行してトレーニングできますが、最終的には回帰する必要があります。

2. データの準備:HiggsBoson データセット
(1) kaggle からデータをダウンロード

(2) データを読み取り、単純にデータを探索し、トレーニング セットとテスト セットに分割します。

import time
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

data = pd.read_csv(r'training.csv')
features = data.iloc[:, 1:-2]    #250000 rows × 31 columns
label = data.iloc[:, -1]
xtrain, xtest, ytrain, ytest = train_test_split(features, label, test_size=0.3, random_state=123)

3. 最初にすべてのモデルを実行して、データの最終結果を確認します。

(1) 決定木

start = time.time()
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(xtrain, ytrain)

ypred = tree.predict(xtest)
score_train = tree.score(xtrain, ytrain)
score_test = tree.score(xtest, ytest)
print('训练集:', score_train, '    ', '测试集:', score_test)
print(accuracy_score(ypred, ytest))
print(time.time()-start)
トレーニング セット: 1.0 テスト セット: 0.76444 
0.76444 
21.315803289413452

デシジョン ツリーはアンサンブル アルゴリズムではありませんが、後続のアンサンブル モデルの基本モデルがすべてデシジョン ツリーであるため、ここにリストされています。そのため、比較のために、単一のツリー モデルの効果を見てみましょう。
スコアから判断すると、単一のツリーはトレーニング セットのすべての予測を正確に予測しますが、テストの精度はわずか 0.76444 であり、このモデルは典型的な過学習モデルであることがわかります。もちろん、パラメータをまったく調整せず、すべてデフォルトのパラメータであることが主な理由ですが、ハイパーパラメータをうまく調整して過剰適合を減らすと、モデルはより良くなる可能性がありますが、モデルの限界はほぼ同じです。

(2) ランダムフォレスト

start = time.time()
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100)
clf.fit(xtrain, ytrain)

ypred = clf.predict(xtest)
score_train = clf.score(xtrain, ytrain)
score_test = clf.score(xtest, ytest)
print('训练集:', score_train, '    ', '测试集:', score_test)
print(accuracy_score(ypred, ytest))
print(time.time()-start)
トレーニング セット: 0.9999885714285714 テスト セット: 0.8369866666666667 
0.8369866666666667 
215.39269065856934

ランダム フォレストはスコアを 0.76 から 0.83 に直接増加させますが、このモデルも典型的な過学習モデルであり、トレーニング セットはほぼ 100% 適合しています。しかし、このモデルの最大の特徴は速度が遅すぎることであり、3 分以上かかりました。

(3)アダブースト

start = time.time()
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(n_estimators=100)
ada.fit(xtrain, ytrain)

ypred = ada.predict(xtest)
score_train = ada.score(xtrain, ytrain)
score_test = ada.score(xtest, ytest)
print('训练集:', score_train, '    ', '测试集:', score_test)
print(accuracy_score(ypred, ytest))
print(time.time()-start)
トレーニング セット: 0.8186114285714285 テスト セット: 0.8164266666666666 
0.8164266666666666 
158.35273146629333

ランダム フォレストと比較すると、adaboost はフィッティングが悪く、トレーニング セットとテスト セットのスコアはほぼ同じですが、テスト セットがトレーニング セットよりわずかに悪いだけで、これはごく普通のことです。ランダムフォレストに比べれば速度は向上していますが、それでも遅すぎます。

(4)GBDT

start = time.time()
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier(n_estimators=100)
gbdt.fit(xtrain, ytrain)

ypred = gbdt.predict(xtest)
score_train = gbdt.score(xtrain, ytrain)
score_test = gbdt.score(xtest, ytest)
print('训练集:', score_train, '    ', '测试集:', score_test)
print(accuracy_score(ypred, ytest))
print(time.time()-start)
トレーニング セット: 0.8342742857142857 テスト セット: 0.82964 
0.82964 
283.10672426223755

GBDT の効果は、ADA の効果よりもわずかに優れており、わずかに改善されており、過剰適合ではなく、非常に正常です。しかし、速度が遅すぎます。遅い理由はたくさんありますが、効果は良好なので、後の xgboost と lightGBM は、それをベースにして原理レベルとエンジニアリング レベルで大幅に最適化されました。

(5) XGBoost
XGBoost は GBDT のエンジニアリングされたバージョンと言えますが、自分でインストールする必要があります: pip install xgboost==1.0.1 このバージョンの方が安定しているため、このバージョンをお勧めします。

from xgboost import XGBClassifier
from sklearn.preprocessing import LabelBinarizer      #处理标签列

#读取源数据
data = pd.read_csv(r'training.csv')
features = data.iloc[:, 1:-2]    #250000 rows × 31 columns
label = data.iloc[:, -1]
xtrain, xtest, ytrain, ytest = train_test_split(features, label, test_size=0.3, random_state=123)  

#给标签列编码
binarized = LabelBinarizer()   
ytrain = binarized.fit_transform(ytrain).ravel()
ytest = binarized.fit_transform(ytest).ravel()

start = time.time()
#建模-训练-查看准确率
xgb = XGBClassifier(objective='binary:logistic')
xgb.fit(xtrain, ytrain)
ypred = xgb.predict(xtest)
score_train = xgb.score(xtrain, ytrain)
score_test = xgb.score(xtest, ytest)
print('训练集:', score_train, '    ', '测试集:', score_test)
print(accuracy_score(ypred, ytest))
print(time.time()-start)
トレーニング セット: 0.8675142857142857 テスト セット: 0.8398933333333334 
0.8398933333333334 
3.4247934818267822

XGBoost は GBDT よりわずかに優れており、過学習ではないことがわかります。速度が大幅に向上しているのがポイントで、GBDTの10分の1近くの速度になっています。

(6) LightGBM
の現在の新しいお気に入り LGB は、アルゴリズムではなくフレームワークと呼ばれます。これはフレームワークであるため、より複雑で大規模であることを意味するため、個別にダウンロードしてインストールする必要があります: pip install lightgbm.
ライト LGB のパラメーターの説明は、長いブログに書くことができます。オンラインにはたくさんの友達がいます。詳細については、Baidu の他のブログ投稿を参照してください。ここでの私の焦点は、完全なプロセスを経て、大きなフレームワークを理解することであるため、ここでは詳細については説明しません。もちろん、決定木の生成や枝刈りの詳細、ブースト積分などの演算の考え方を理解していれば、アルゴリズムレベルでLGBを理解することはそれほど難しいことではないと思います。最大の障害はエンジニアリングの最適化です。

import time
import lightgbm
from sklearn.preprocessing import LabelBinarizer      #处理标签列
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#读取源数据
data = pd.read_csv(r'training.csv')
features = data.iloc[:, 1:-2]    #250000 rows × 31 columns
label = data.iloc[:, -1]
xtrain, xtest, ytrain, ytest = train_test_split(features, label, test_size=0.3, random_state=123)  

#给标签列编码
binarized = LabelBinarizer()   
ytrain = binarized.fit_transform(ytrain).ravel()
ytest = binarized.fit_transform(ytest).ravel()

start = time.time()
# 将训练集和测试集整理成lgb要求的形式
lgb_train = lightgbm.Dataset(xtrain, ytrain) # 创建训练集,将数据保存到LightGBM二进制文件将使加载更快
lgb_test = lightgbm.Dataset(xtest, ytest, reference=lgb_train)  # 创建测试集

# 将参数写成字典下形式
params = {'task': 'train', 'boosting_type': 'gbdt', 'objective': 'binary', 'metric':'auc', 'is_unbalance':True, 'force_col_wise':True}

# 训练模型
gbm = lightgbm.train(params,lgb_train,valid_sets=[lgb_train, lgb_test])

#查看训练结果
score = gbm.best_score
print('训练集:', score['training'])
print('测试集:', score['valid_1'])

# 训练后保存模型到文件
gbm.save_model('model_gbm.txt') 
print(time.time()-start)
[LightGBM] [情報] 正の数: 59977、負の数: 115023 
[LightGBM] [情報] 合計ビン 7388 
[LightGBM] [情報] トレイン セット内のデータ ポイントの数: 175000、使用された特徴の数: 30 
[ LightGBM] [情報] [binary:BoostFromScore]: pavg=0.342726 -> initscore=-0.651171 
[LightGBM] [情報] スコア -0.651171 からトレーニングを開始します
训练集: OrderedDict([('auc', 0.9174424819661972)])
测试集: OrderedDict([('auc', 0.9077815342580077)]) 
5.596917152404785

強力なアルゴリズムが強力であることがわかります。必要な共通パラメータをいくつか設定するだけで、詳細はまったく調整されず、スコアが直接 0.9 以上に引き上げられます。速度も許容範囲内です。

(7) スタッキング モデルの融合
以前の統合アルゴリズムは、バギングであろうとブースティングであろうと、同じ基本モデルを持っています。つまり、それらはすべてツリー モデルです。ただし、スタッキングは異なります。複数の異種モデルを融合するため、スタッキング手法はより強力な手法であり、データ コンペティションで一般的に使用されるモデル融合手法です。ここでは、簡単にプロセスを実行して説明します。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

from sklearn.ensemble import StackingRegressor
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeRegressor

data = load_breast_cancer() 
features = data.data
target = data.target
xtrain, xtest, ytrain, ytest=train_test_split(features,target,test_size=0.2)

model1 = DecisionTreeRegressor()
model2 = LinearRegression()
stacking = StackingRegressor(estimators=[('dt', model1), ('lr', model2)], final_estimator=LinearRegression())
stacking.fit(xtrain, ytrain)
# 预测
y_pred = stacking.predict(xtest)
 
# 模型评价
print(stacking)
rmse = mean_squared_error(ytest, y_pred) ** 0.5
rmse
StackingRegressor(estimators=[('dt', DecisionTreeRegressor()), 
                              ('lr', LinearRegression())], 
                  Final_estimator=LinearRegression()) 
0.2441514442707548

4. モデルのチューニング

 以前は、モデルは実行するだけで微調整が必​​要でした。チューニングとは、モデルの一連の可能なパラメーター値を組み合わせて、どのパラメーターのセットがデータに最も適しているかを確認することです。つまり、どのパラメーターのセットがデータをよりよく学習できるか、どのパラメーターのセットが達成できるかを確認します。このデータ セットのスコアが高いほど、この値はもちろん、このスコアはトレーニング セットのスコアとテスト セットのスコアを総合的に考慮する必要があります、つまり、過学習問題を考慮する必要があります。したがって、モデル調整の大前提は、まず各モデルの背後にある原理と数学的計算を明確に理解し、調整の方向性を定める必要があるということです。たとえば、前回のデシジョン ツリーの記事の最後で、学習曲線とグリッド検索という 2 つの調整方法を示しました。明らかに、この記事で取得する 7 つのモデルでは、学習曲線は単一のパラメーターに対して調整されており、組み合わせて調整できないため、スクール カーブは機能しません。この記事の最初の 6 つのモデルは、グリッド検索を使用することをお勧めします。グリッド検索ツールについては、データが大きくなく、コンピューターのメモリが十分であれば、sklearn の GridSearchCV を使用できます。データが大きければ、グリッド検索ツールはたくさんあります。 RandomizedSearchCV が効果的ではないと思われる場合は、HalvingGridSearchCV を試してみてください。

この記事の最初の 6 つのモデルのうち、デシジョン ツリーを除いて、次の 5 つは統合モデルです。これらは統合モデルではありますが、すべて単一のモデルですが、7 番目のモデルはモデル融合であり、そのチューニングはより複雑です。 HyperOPT 最適化を試すことができます。数文では説明できないため、Baidu の使用方法を続けてください。この方向性を理解したら、自分で探索できます。  

最後に、ランダム フォレストのパラメータについて簡単で一般的な紹介をします。チューニングの前提は、パラメータをよく理解していることです。他のモデルもツリー モデルの統合です。推測できると思います。八、あとはさらにデータを読んで確認するだけです。  

n_estimators 1. フォレスト内には複数のツリー モデル、つまり複数の基本分類子が必要です。  
基準は不純物インデックスの計算方法です。このインデックスはツリー モデルの分岐の基礎となります。スプリッターの
デフォルトは、以下に基づいて分岐します。このパラメータは、基準の計算結果をランダムに分割することもでき、その場合、各ツリーはより深く成長します。B
max_ Depth 2. ツリーの最大深さ C
min_samples_split 3. 再分岐の最小サンプル サイズ D
min_samples_leaf 4. リーフ ノードの最小サンプル サイズ E
min_weight_fraction_leaf リーフ ノードの最小重み合計 G
max_features 5. いくつかの特徴は次のようになります。各ブランチの計算とブランチから開始するように選択されます。 F
random_state ランダム モードは、乱数シードと同様に、任意の数値を入力できます。このパラメーターを設定すると、比較しやすいように、インスタンス化のたびに同じフォレストが成長します。K
max_leaf_nodes リーフ ノードの最大数、つまり、あまりにも多くのリーフ ノードに分割することはできません i
min_impurity_split 分岐の最小不純度、つまり、不純度がこのパラメータよりも小さい場合、分岐を続行する必要はありません. j
class_weight さまざまなラベルを持つサンプルの重み サンプルがそうでない場合 このパラメータはバランスをとる際に考慮する必要があり、少数のラベルの重みを増やしてモデルを少数クラスに偏らせる必要があります。H

先ほどのテーブル12345の5つのパラメータは、調整頻度が最も高い5つのパラメータであり、通常はこの5つのパラメータを調整し、その他のパラメータは状況に応じて調整されます。  

ABFK: criterion、splitter、max_features、random_state。  
ツリーを使用して 2 次元テーブル データ (行はサンプル、列は特徴) を表す場合、ツリー モデルは 2 次元テーブルに適合するために使用されます。データが生成されるとき、これら 3 つのパラメータにより、生成するツリーの種類が決まります。
基準: ツリーを生成するとき、最も重要なことは、その特徴のどの値に基づいて分岐するか、つまりどの特徴がノードとして選択され、この特徴のどの値が分岐用に選択されるかに基づいて分岐することです。基礎となるのは不純物インデックスです。これは、各フィーチャの不純度を計算し、最も低い不純物インデックスに従ってフィーチャを分岐し、このインデックスを使用して、このフィーチャのどの値が分岐に使用されるかを計算します。
パラメータ基準は不純物の計算方法です。分類タスクの場合、不純度は情報エントロピーまたはジニ不純度 (ジニ、情報ゲインとも呼ばれます) の 2 つの方法で計算できます。回帰タスクの場合、不純物は平均二乗誤差 mse または平均絶対差friedman_mse を使用して計算できます。つまり、このパラメーターは、木の成長方法を制御するための数式となります。
パラメータ spitter: 値は 2 つあり、splitter='best' の場合、すべての特徴の不純度を計算した後、最も不純度の値が低いインジケーターを見つけ、そのインジケーターに従って分岐します。ただし、数万のフィーチャがある場合、この方法では多くの計算が必要となり、ツリー モデルの生成が非常に遅くなります。現時点では、このパラメータ spitter='random' を使用できます。これは、いくつかのフィーチャをランダムに選択することを意味します特徴量は毎回計算され、分岐されます。しかし、この状況はあまりにもランダムです。
したがって、splitter='best' の場合、パラメーター max_features を調整して計算量を減らすことで、毎回計算される特徴の数を制御することもできます。
デフォルトの max_features='None' はすべての特徴を計算することを意味し、max_features='auto' または "sqrt" は毎回ルート N 特徴の不純物のみを計算することを意味し、max_features='log2' は毎回 log2N 特徴だけを計算することを意味します。
スプリッターが最高の場合は、毎回同じツリーを成長させることになります。データは変更されず、すべての特徴が不純物の計算に使用され、すべての特徴が変更されないため、変更されない特徴に基づいて分岐が作成されるたびに、結果として得られるツリー構造も変更されません。ただし、splitter='random' または max_features が None でない場合、生成されるツリーは毎回異なります。モデルを再現するのは難しくありませんか? ランダム性があっても再現するために、random_state パラメーターを使用します。 . ランダム化するたびにランダムパターンを制御し、ランダム化するたびにパターンが同じになるように再現できるため、パラメータの比較やパラメータの調整に便利です。  

C: max_ Depth: ABFK を組み合わせて完全なツリーを生成できる場合、max_ Depth はツリーの激しい枝刈りのためのパラメータです。このパラメータはツリーの最大深さを制限します。深さを制限すると、オーバーフィッティングを効果的に抑制できます。たとえば、これは非常に極端です。私が生成した樹木モデルは 1 つのサンプルと 1 つの結果に細分化されています。トレーニング セット内のモデルの精度は 100% である必要がありますが、このような深い枝と細い枝を持つ樹木は過学習モデルです。テスト セットでは間違いなく機能しないため、モデルの過学習現象を抑制する必要があります。このパラメータは最も一般的に使用されるパラメータです。  

ij: max_leaf_nodes、min_impurity_split: これら 2 つのパラメーターは、さまざまな角度からツリー モデルの微暴力的な枝刈りも実行します。現状ではモデルの過学習を抑えるのは当然です。1 つはリーフ ノードの数からの激しい枝刈りであり、もう 1 つはノードの不純物の観点からの枝刈りです。ノードが分岐した後のサンプルの不純度がこのパラメータの値よりも小さい場合は、それ以上分岐しないでください。このノードを考慮します。それ自体は葉ノードです。通常、これら 2 つのプルーニング メソッドは使用しません。max_leaf_nodes のデフォルト値は None、min_impurity_split のデフォルト値は 0 です。これら 2 つのパラメータは使用しないでください。その理由は、最初のモデリングではこれら 2 つのパラメーターを把握するのが難しいためです。このデータ セットを長期間研究し、多くのツリー モデルを構築したことがない限り、リーフ ノードの最大数と最小数については十分に理解できます。一度それを理解すれば、これら 2 つのパラメータを調整する方法がわかるでしょう。  

DE: min_samples_split、min_samples_leaf。max_ Depth パラメータが激しい枝刈りであり、max_leaf_nodes と min_impurity_split が専門家による枝刈りである場合、これら 2 つのパラメータは、私たち一般人による集中的な枝刈り操作になります。
たとえば、min_samples_split =5 は、現在のノードのサンプル数が 5 未満の場合、これら 5 つのサンプルのターゲットが異なっていても、分岐を続行する必要がないことを意味します。分岐をやめる、それだけです。
たとえば、min_samples_leaf=3 は、現在のリーフ ノードのサンプル サイズが 3 未満の場合、リーフ ノードとその兄弟ノードが削除され、親ノードのみが残ることを意味します。
D と E はよくペアになります。たとえば、ノードに 6 つのサンプルがある場合、分岐を継続するための条件を満たします。ただし、6 つのサンプルのうち 2 つのターゲットが 1 で、サンプルのうち 4 つのサンプルのターゲットが 1 である場合は、分岐を継続するための条件を満たします。 of 2, 次に、左のブランチのサンプル サイズが 2 で 3 より小さいため、分割しないでください。この 6 つのサンプルのノードをリーフ ノードとして使用します。分割を続けないでください。
これら 2 つのパラメーターは、過学習も防止します。設定が大きすぎると、モデルの学習が続行できなくなります。パラメーターが小さすぎると、過学習が発生します。これら 2 つのパラメーターは C と組み合わせて使用​​され、過学習防止効果が優れています。

GH: これら 2 つのパラメーター、min_weight_fraction_leaf と class_weight は、主に分類問題におけるサンプルの不均衡を解消するために一緒に使用されます。class_weight のデフォルト値は None です。これは、サンプルのバランスの問題は考慮されず、サンプルは基本的にバランスが取れていることを意味します。class_weight="balance" の場合、アルゴリズムはさまざまなラベルのサンプルの重みを自動的に計算します。このとき、サンプルの種類によって重量値が異なります。パラメータ min_weight_fraction_leaf のデフォルト値は 0 です。これは、重みの問題が考慮されないこと、つまり、リーフ ノード内のサンプルの重み値が何であるかは問題ではないことを意味します。min_weight_fraction_leaf =0.01 が設定されている場合、リーフ ノード内のすべてのサンプルの重みの合計を意味します (各サンプルの重み値は class_weight によって提供されます)。0.01 未満の場合、リーフ ノードはそのノードとともに枝刈りされます。兄弟ノード。
 

おすすめ

転載: blog.csdn.net/friday1203/article/details/135167457