GBDTバイナリ分類アルゴリズムの詳細な分析(コード実装あり)

ディレクトリ:

  1. GBDT分類アルゴリズムの概要

  2. GBDTバイナリ分類アルゴリズム

  • 2.1ロジスティック回帰ログ損失関数

  • 2.2 GBDTの2つの分類原理

  • GBDTバイナリ分類アルゴリズムの例

  • 手引きGBDTバイナリ分類アルゴリズム

  • 4.1 Python3でGBDTバイナリ分類アルゴリズムを実装する

  • 4.2 sklearnを使用してGBDTバイナリ分類アルゴリズムを実装する

  • GBDT分類タスクの一般的な損失関数

  • まとめ

  • 参照

この記事の主な内容の概要:

1 GBDT分類アルゴリズムの概要

GBDTが分類または回帰のどちらに使用されるかにかかわらず、CART回帰ツリーは常に使用されています。ここでの主な理由は、GBDTトレーニングの各ラウンドが前のトレーニングモデルの負の勾配に基づいているためです。これには、各反復で、実際のラベルから弱分類器を差し引いた値が意味があること、つまり、残差が意味があることが必要です。選択した弱分類器が分類木である場合、カテゴリの減算は無意味です。このような問題については、2つの方法で解決できます。

  • 指数損失関数が採用されているため、GBDTはAdaboostに退化し、分類の問題を解決できます。

  • 結果の確率値と真の確率値の差をフィットの残差として使用できるように、ロジスティック回帰と同様の対数尤度損失関数を使用します。

2つの分類問題を通じてGBDTを分類する方法を見てみましょう。

2 GBDTバイナリ分類アルゴリズム

2.1ロジスティック回帰ログ損失関数

ロジスティック回帰の予測関数は次のとおりです。

 

関数の値には特別な意味があり、これは結果が取得される確率を表すため、入力分類結果がカテゴリおよびカテゴリになる確率は次のとおりです。

 

 

以下では、上記の式に基づいてロジスティック回帰の対数損失関数を導出します。上記の式は次のように書くことができます:

次に、尤度関数を次のようにします。

および極値は同じ場所で取得されるため、次に対数尤度関数を次のように使用します。

最尤推定は、最大値を見つけることです。ここでは、逆数を取ることは勾配降下法で解決でき、必要なパラメーターが得られます:

2.2 GBDTの2つの分類原理

ロジスティック回帰の単一サンプルの損失関数は、次のように表すことができます。

その中には、ロジスティック回帰予測の結果があります。現在の学習者が最初の反復の後であると仮定すると、それを上記の式で置き換えた後、損失関数は次のように書くことができます。

その中で、最初のツリーに対応する応答値は(損失関数の負の勾配、つまり疑似残差)です。

生成された決定木について、各リーフノードの最適な残差近似値を次のように計算します。

閉形式の解(閉形式の解)がないため、通常は代わりに概算値を使用します。

補足近似置換プロセス:
サンプルが1つしかないと仮定します。

注文してから 

一次導関数を求める:

2次導関数を求めます。

テイラーの2次展開について:

  極値を取る場合、上記の2次式は次のようになります。

GBDTバイナリ分類アルゴリズムの完全なプロセスは次のとおりです。

(1)最初の弱学習器を初期化します。

それらの中で、学習者を初期化するために以前の情報を使用して、トレーニングサンプルの比率です。

(2)分類回帰木の確立のために:

a)はい、最初のツリーに対応する応答値(損失関数の負の勾配、つまり疑似残差)を計算します。

b)CART回帰ツリーを使用してデータを近似し、最初の回帰ツリーを取得する場合、対応する葉ノード領域は、最初の回帰ツリーの葉ノードの数、場所、および数です。

c)葉ノード領域について、最適な値を計算します。

d)強力な学習者を更新します。

(3)最終的な強力な学習者の表現を取得します。

上記のプロセスから、損失関数による負の勾配の計算とリーフノードの最適な残差近似値の計算を除いて、バイナリGBDT分類とGBDT回帰アルゴリズムのプロセスは基本的に似ていることがわかります。では、バイナリGBDTはどのように分類されますか?

ロジスティック回帰式を整理することで、特定の入力を陽性サンプルとして予測する確率が得られます。ロジスティック回帰では、線形モデルを使用して、イベントのログオッズY = 1 | xを近似します。バイナリGBDT分類アルゴリズムは、ロジスティック回帰の考え方に似ています。一連の勾配リフティングツリーを使用して、この対数確率を近似します。分類モデルは次のように表すことができます。

 

3 GBDTバイナリ分類アルゴリズムの例

3.1データセットの紹介

トレーニングセットを次の表に示します。データセットの特性は年齢と体重です。高さは分類境界として1.5メートルを超えています。高さは1.5メートルを超え、ラベルは1です。高さと1.5メートル未満は0です。4つのグループがあります。データ。

テストデータを次の表に示します。データのセットは1つだけで、25歳で65の重みがあります。トレーニングセットでトレーニングされたGBDTモデルを使用して、このデータセットの高さが1.5メートルより大きいかどうかを予測しますか?

3.2モデルトレーニング段階

パラメータ設定:

  • 学習率:learning_rate = 0.1

  • 反復回数:n_trees = 5

  • ツリーの深さ:max_depth = 3

1)弱学習器を初期化します。

2)分類回帰ツリーの確立:

反復回数を設定したので、n_trees=5これが設定です。

最初に負の勾配を計算します。上記の対数損失によれば、負の勾配(疑似残差、近似残差)は次のとおりです。

勾配リフティングアルゴリズムは重要です。重要なのは、損失関数の負の勾配の値を回帰ツリーリフティングツリーアルゴリズムの残差の近似として使用して、回帰ツリーを近似することです。ここでは、便宜上、負の勾配残差と呼びます。

残差の計算結果は次のように表示されます。

このとき、残差は弱学習器をトレーニングするためのサンプルのラベル、つまり次のテーブルデータとして使用されます。

次に、回帰ツリーの最適なパーティションノードを見つけ、各機能の可能な各値をトラバースします。年齢特徴値から終わりまで、および重み特徴から終わりまで、分割後の2つのデータグループの二乗誤差(二乗誤差)、左ノードの二乗損失、および右ノードの二乗損失を計算し、二乗損失を最小化するものを見つけます分割ノードは、最適な分割ノードです。

例:年齢を分割ノードとして使用し、サンプルを左ノード未満に分割し、7以上のサンプルを右ノードに分割します。左のノードには次のものが含まれ、右のノードにはサンプルが含まれます。可能な分割はすべて次の表に示されています。

上記の分割ポイントの最小合計二乗損失は、年齢と体重の2つの分割ポイントがあるため、ランダムに1つを分割ポイントとして選択し、ここでは年齢を選択します。これで、最初のツリーは次のようになります。

設定したパラメーターでのツリーの深さ、ツリーの深さはmax_depth=3今だけなので、もう一度分割する必要がありますが、今回は左右のノードを別々に分割する必要があります。条件:

  • 深さが最大に達していません。ツリーの深さは3に設定されています。つまり、3つのレイヤーに成長する必要があります。

  • ポイントサンプルの数> = min_samples_split;

  • このノードのサンプルのラベル値は異なります。値が同じである場合、それらは非常によく分割されており、分割する必要がないことを意味します(このプログラムはこの条件を満たしているため、ツリーには2つのレベルしかない)。

最後に、最初の回帰ツリーは次のようになります。

この時点で、ツリーは設定を満たしています。もう1つ行う必要があります。このツリーの各リーフノードにパラメーターを割り当てて、残差を当てはめます。

上記の除算結果によれば、提示の便宜上、左から右に最初の葉ノードを指定し、値を計算するプロセスは次のとおりです。

 

 

この時点での最初のツリーは次のようになります。

:次のアップデート速い学習者は、我々は学習率を使用する必要があるlearning_rate=0.1ことでlr急行。更新式は次のとおりです。

なぜ学習率を使用するのですか?これはShrinkageのアイデアであり、毎回すべてのフィッティング値、つまり学習率を追加すると、1つのステップで簡単に学習してGBDTがオーバーフィットする原因になります。

この手順 を最後まで繰り返し、  最後にツリーを構築します。

以下に、各ツリーの最終的な構造を示します。これらの図は、GitHubのコードによって生成されます。興味のある学生がコードを実行できます。

https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning/GBDT_GradientBoostingBinaryClassifier

最初の木:

2番目のツリー:

3番目のツリー:

4番目のツリー:

5番目のツリー:

3)最後の強力な学習者を取得します。

3.3モデル予測段階

  •  

  • では、テストサンプルの古さは分割ノードの古さよりも大きいため、そうであると予測されます。

  • では、テストサンプルの古さは分割ノードの古さよりも大きいため、そうであると予測されます。

  • では、テストサンプルの古さは分割ノードの古さよりも大きいため、そうであると予測されます。

  • では、テストサンプルの古さは分割ノードの古さよりも大きいため、そうであると予測されます。

  • では、テストサンプルの古さは分割ノードの古さよりも大きいため、そうであると予測されます。

最終的な予測結果は次のとおりです。

4手涙GBDT 2分類アルゴリズム

この記事のすべてのデータセットとコードはGitHubにあります。アドレス:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning

4.1 Python3でGBDTバイナリ分類アルゴリズムを実装する

必要なPythonライブラリ:

pandas、PIL、pydotplus、matplotlib
br

どこにpydotplusライブラリが自動的に呼び出されますGraphviz、に行く必要があるので、Graphvizダウンロードに公式サイトgraphviz-2.38.msiのインストール後、インストールディレクトリは、binシステム環境変数に追加され、最終的には、コンピュータを再起動します。

Python3でGBDTバイナリ分類アルゴリズムを実装するための大量のコードのため、ここでは詳細なコードをリストしません。興味のある学生は、https://github.com/Microstrong0305/WeChat-zhihu-のGitHubをご覧ください。 csdnblog-code /ツリー/マスター/ Ensemble%20Learning / GBDT_GradientBoostingBinaryClassifier

4.2 sklearnを使用してGBDTバイナリ分類アルゴリズムを実装する

import numpy as np
from sklearn.ensemble import GradientBoostingClassifier


'''
调参:
loss:损失函数。有deviance和exponential两种。deviance是采用对数似然,exponential是指数损失,后者相当于AdaBoost。
n_estimators:最大弱学习器个数,默认是100,调参时要注意过拟合或欠拟合,一般和learning_rate一起考虑。
learning_rate:步长,即每个弱学习器的权重缩减系数,默认为0.1,取值范围0-1,当取值为1时,相当于权重不缩减。较小的learning_rate相当于更多的迭代次数。
subsample:子采样,默认为1,取值范围(0,1],当取值为1时,相当于没有采样。小于1时,即进行采样,按比例采样得到的样本去构建弱学习器。这样做可以防止过拟合,但是值不能太低,会造成高方差。
init:初始化弱学习器。不使用的话就是第一轮迭代构建的弱学习器.如果没有先验的话就可以不用管


由于GBDT使用CART回归决策树。以下参数用于调优弱学习器,主要都是为了防止过拟合
max_feature:树分裂时考虑的最大特征数,默认为None,也就是考虑所有特征。可以取值有:log2,auto,sqrt
max_depth:CART最大深度,默认为None
min_sample_split:划分节点时需要保留的样本数。当某节点的样本数小于某个值时,就当做叶子节点,不允许再分裂。默认是2
min_sample_leaf:叶子节点最少样本数。如果某个叶子节点数量少于某个值,会同它的兄弟节点一起被剪枝。默认是1
min_weight_fraction_leaf:叶子节点最小的样本权重和。如果小于某个值,会同它的兄弟节点一起被剪枝。一般用于权重变化的样本。默认是0
min_leaf_nodes:最大叶子节点数
'''


gbdt = GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=5, subsample=1
                                  , min_samples_split=2, min_samples_leaf=1, max_depth=3
                                  , init=None, random_state=None, max_features=None
                                  , verbose=0, max_leaf_nodes=None, warm_start=False
                                  )


train_feat = np.array([[1, 5, 20],
                       [2, 7, 30],
                       [3, 21, 70],
                       [4, 30, 60],
                       ])
train_label = np.array([[0], [0], [1], [1]]).ravel()


test_feat = np.array([[5, 25, 65]])
test_label = np.array([[1]])
print(train_feat.shape, train_label.shape, test_feat.shape, test_label.shape)


gbdt.fit(train_feat, train_label)
pred = gbdt.predict(test_feat)


total_err = 0
for i in range(pred.shape[0]):
    print(pred[i], test_label[i])
    err = (pred[i] - test_label[i]) / test_label[i]
    total_err += err * err
print(total_err / pred.shape[0])

sklearnのGBDTライブラリを使用してGBDTバイナリ分類アルゴリズムを実装することの難しさは、次のパラメーターをより適切に調整する方法です。

sklearnでGBDTバイナリ分類アルゴリズムを実装するためのGitHubアドレス:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning/GBDT_Classification_sklearn

5 GBDT分類タスクの一般的な損失関数

GBDT分類アルゴリズムの場合、損失関数には通常、2種類の対数損失関数と指数損失関数があります。

(1)指数損失関数の場合、損失関数の式は次のとおりです。

負の勾配の計算とリーフノードの最適な負の勾配のフィッティングについては、Adaboostアルゴリズムのプロセスを参照してください。

(2)対数損失関数の場合、2値分類と多変量分類に分けて、主にGBDTの2値分類の損失関数を紹介します。

6まとめ

この記事では、最初にGBDT回帰アルゴリズムを分類アルゴリズムに変換する方法を簡単に紹介します。次に、ロジスティック回帰の対数損失関数からGBDTバイナリ分類アルゴリズムの原理を導き出します。次に、Python3を使用するGBDTバイナリ分類アルゴリズムだけではありません。 sklearnを使用して、GBDTバイナリ分類アルゴリズムを実装します;最後に、GBDT分類タスクの一般的な損失関数を紹介します。GBDTはバイナリ分類タスクを完全に解決できるので、複数の分類タスクに効果的ですか?それが機能する場合、GBDTはどのように複数の分類を行いますか?これらの問題により、GBDTのより深い原理を常に調査し、掘り下げる必要があります。マルチクラスタスクでのGBDTのパフォーマンスを楽しみにしています!

 

記事のソース:https : //mp.weixin.qq.com/s/XLxJ1m7tJs5mGq3WgQYvGw#

公開された45元の記事 ウォンの賞賛2 ビュー5228

おすすめ

転載: blog.csdn.net/xixiaoyaoww/article/details/105182792