簡単な学習 - LightGBM モデルのアルゴリズムの原理と実装 + Python プロジェクトの戦闘

ライトGBM

序文

GBDT アルゴリズムの派生モデルとして、LighGBM は他の論文研究や数学モデリングのコンテストで非常に一般的です。GBDT アルゴリズムに詳しくない場合は、私の以前の記事を参照してください。GBDT についてはあまり詳しく説明しません。GBDT アルゴリズムと比較した LighGBM の改良点、独自のアルゴリズムの詳細の最適化、XGBoost および CatBoost アルゴリズムよりも優れたアプリケーション シナリオについて主に説明します。全体として、LightGBM は、特に中小規模のデータ セットや高次元の特徴に対して、パフォーマンスと効率の点で大きな利点があります。

1. LighGBMアルゴリズムの概要

LightGBM (Light Gradient Boosting Machine) は、Gradient Boosting Decision Tree (GBDT) アルゴリズムに基づく機械学習フレームワークです。GBDT は、一連のデシジョン ツリーを段階的にトレーニングすることでモデルのパフォーマンスを向上させるアンサンブル学習方法です。新しい決定木はそれぞれ、以前の木の予測誤差を修正しようとします。LightGBM は GBDT ベースのアルゴリズムですが、デシジョン ツリーの構築とトレーニングのプロセスでいくつかの最適化戦略を使用して、効率とパフォーマンスを向上させます。次の表は、GBDT 派生モデルの最適化の比較を示しています。

アルゴリズムの違い GBDT XGブースト ライトGBM 猫ブースト
弱い学習者 CART回帰ツリー 1. CART 回帰ツリー 2. 線形学習器 3. ダーツ ツリー 葉ごとの木 対称ツリー
分割点を見つける 貪欲なアルゴリズム 近似アルゴリズム ヒストグラムアルゴリズム 事前並べ替えアルゴリズム
スパース値の処理 なし スパース対応アルゴリズム EFB (独占機能バンドル) なし
カテゴリの特徴 直接サポートされていません。エンコード後にモデルを入力できます 同GBDT 直接サポート、GSエンコーディング 直接サポート、オーダード TS エンコーディング
並行サポート できない できる できる できる

グラフ フローは最適化ポイントを示します。
ここに画像の説明を挿入

LightGMB アルゴリズム モデルは XGBoost よりも後に確立されたため、そのアルゴリズムは XGBoost モデル上でさらに最適化する必要があります。まず第一に、XGBoost の決定木構築アルゴリズムの基本的な考え方は事前ソート アルゴリズムであるため、XGBoost は多くのスペースを消費します。このようなアルゴリズムはデータの特徴量と特徴ソートの結果を保存する必要があります。 、これにはトレーニング データの 2 倍のメモリ消費量が必要です。第二に、時間的なオーバーヘッドも大きく、各分割点を通過する際に分割ゲインを計算する必要があり、多大なコストがかかります。

したがって、LightGMB は主にデシジョン ツリーの構築とアルゴリズムのオーバーヘッドの最適化に焦点を当てています。

2. アルゴリズムの改善

1.リーフごとの成長戦略

LightGBM はリーフ単位の成長戦略を採用しており、従来の GBDT のほとんどのレベル単位の戦略よりも優れたセグメンテーション ポイントをより速く見つけることができます。これは、リーフごとの戦略では、分割のたびに損失関数を最も削減できるリーフ ノードが選択されるため、深度ツリーがより速く構築されます。
ここに画像の説明を挿入

ここに画像の説明を挿入

1.1最適なセグメンテーションポイントを選択する

分割ノードが構築されるたびに、リーフごとの戦略により、損失関数を最小化する特徴と分割ポイントが選択されます。これは、フィーチャの考えられるすべての分割点を横断し、分割の 2 つの子ノードで損失関数を計算することによって実現されます。

1.2貪欲な選択

リーフワイズ戦略は、毎回損失関数を最小化する特徴とセグメンテーション ポイントを選択する貪欲なアルゴリズムです。この選択戦略により、ツリーはデータの詳細とフィーチャ間の関係をより迅速に学習できるようになります。

1.3剪定

ノードを構築した後、リーフごとの戦略は枝刈り操作、つまり現在のノードの損失削減値をしきい値と比較する操作も実行します。損失低減値がしきい値条件を満たさない場合は、過剰適合を避けるためにノードの分割の継続を停止します。

1.4リーフノードの割り当て

リーフごとの戦略では、新しいサンプルが既存のリーフ ノードに割り当てられます。特定のリーフ ノードの損失関数が分割後に十分に低減されていない場合、そのノードは分割を停止し、リーフ ノードになります。

深さ1.5

リーフごとの戦略の貪欲な性質により、より深いツリーを構築することができます。ただし、毎回選択される分割点は 1 つだけであるため、一部のリーフ ノードに含まれるサンプルが少なくなり、過剰適合の問題が発生する可能性があります。したがって、トレーニング中にツリーまたは他の正則化手段の最大深さを制御するにはパラメータを使用する必要があります。

2. ヒストグラム特徴の最適化

LightGBM のヒストグラム最適化は、デシジョン ツリー構築プロセスを高速化するための特徴処理の手法です。連続固有値を一連の離散ヒストグラム (つまり、ヒストグラム) に分割することで、計算の複雑さとメモリ使用量を削減します。

ここに画像の説明を挿入

2.1固有値の除算

LightGBM は、連続的な特徴ごとに、まず特徴の値の範囲を特定の間隔 (ビン) に従って離散的な間隔に分割し、ヒストグラムを形成します。各間隔はビンと呼ばれ、この間隔の特徴値のサンプルが含まれます。この離散化されたバケット化のアイデアには実際に多くの利点があります。まず第一に、最も明白なのはメモリ消費量の削減です。xgboost は特徴値を格納するために 32 ビット浮動小数点数を使用し、インデックスを格納するために 32 ビット整数を使用する必要があります。 Lightgbm のヒストグラム このアルゴリズムは、事前に並べ替えられた結果の追加のストレージを必要としないだけでなく、特徴の離散化された値のみを保存できます。この値は通常、8 ビット整数に格納するのに十分であり、メモリ消費量も少なくなります。純正の1/8まで縮小できます。

ここに画像の説明を挿入

次の写真は https://blog.csdn.net/wuzhongqiang/article/details/105350579 からのものです。

ここに画像の説明を挿入

2.2統計的勾配とヘシアン

各ビンで、LightGBM はサンプルの勾配とヘシアンの累積値を計算します。これらの値は、最適な分割点を見つけるときに損失関数の変化を評価するために使用されます。

ここに画像の説明を挿入

2.3スプリットポイントを選択する

最適な分割ポイントを探すとき、LightGBM は各ビン間の境界だけでなく、各ビン内の分割ポイントの候補も横断します。蓄積された勾配とヘシアン値を使用して、これらの分割点での損失低減を評価し、最適な分割点を選択します。ヒストグラムの最適化では、カテゴリ特徴と欠損値を直接処理することもできます。カテゴリ特徴の場合、LightGBM は異なるカテゴリを異なるビンに割り当てます。欠損値の場合、LightGBM は欠損値を特別なビンに割り当て、欠損情報を効果的に処理します。

3. 片側勾配サンプリング アルゴリズム (GOSS)

一般的に、データ前処理部分でデータ等化エンジニアリングを開始しますが、LightGBM の組み込み GOSS アルゴリズムの主な目的は、モデルのパフォーマンスを維持しながらトレーニング プロセスを高速化することです。より大きな勾配のサンプルを保持することでデータセットのサイズを削減し、反復ごとにモデルをより効率的に更新します。データ バランス アルゴリズムは、主にサンプルの不均衡の問題に対処することに重点を置き、サンプルの重みやサンプリング戦略を調整することでさまざまなカテゴリの影響のバランスをとります。

GBDT の各データは異なる勾配値を持ちます。つまり、勾配が小さいサンプルのトレーニング エラーは比較的小さく、勾配が比較的小さいサンプルは残差誤差の削減にほとんど効果がないため、勾配が高いサンプルに焦点を当てることができます

アルゴリズムの流れは次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-CgfE7kN0-1692751421156) (C:\Users\10799\AppData\Roaming\Typora) \typora-user-images\ image-20230822114728503.png)]

GOSS アルゴリズムを通じて、LightGBM はモデルのパフォーマンスを維持しながらトレーニング データ セットのサイズを削減できるため、トレーニング プロセスが高速化されます。これは大規模なデータセットに特に役立ち、各反復に必要な計算リソースとストレージ リソースが削減されます。GOSS アルゴリズムではサンプルの一部が破棄されるため、ノイズが発生する可能性がありますが、通常、このノイズの影響はハイパーパラメータを調整することで制御できることに注意してください。
ここに画像の説明を挿入

4. 排他的機能バンドル アルゴリズム (EFB)

「排他的特徴バンドリング」(Exclusive Feature Bundling、EFB) は、高次元データの特徴相関の問題に対処するために LightGBM で使用されるテクノロジーです。その考え方は、相関性の高い特徴をまとめて全体として扱い、モデルの複雑さと過学習のリスクを軽減することです。

4.1特徴相関バンドリング

高次元データには、相関性の高い特徴が多数存在することがあります。これらの機能は同様の情報を提供しますが、モデルの複雑さが増すため、モデルの過学習につながる可能性があります。EFB の考え方は、これらの相関性の高い機能を機能グループとしてバンドルすることです。

極度にまばらなデータの効果は、以下の図に示すように、より直観的に見ることができます。もちろん、実際のアルゴリズムは PCA 次元削減アルゴリズムと似ています。

ここに画像の説明を挿入

4.2特徴グループの表現

各特徴グループ内で、EFB は代表特徴として 1 つの特徴を選択します。この代表的な特徴は、特徴グループ内の他の特徴との相関が低いため、特徴グループの代表とみなすことができます。
ここに画像の説明を挿入

EFB アルゴリズムは、特徴と特徴間の関係を使用して重み付けされた無向グラフを構築し、それをグラフの色分け問題に変換して解決します。解決プロセスで使用される貪欲な戦略。

  • まず、すべてのフィーチャをグラフの頂点とみなし、独立していないフィーチャをエッジで結び、そのエッジの重みを、接続された 2 つのフィーチャの競合値の合計 (つまり、 2 つの特徴は同時に 0 ではありません (サンプル数)。
  • 次に、ノードの次数に応じて特徴を降順に並べ替えます。次数が大きくなるほど、他の特徴との競合が大きくなります。
  • 特徴ごとに、既存の特徴クラスターを走査し、この特徴によって特徴クラスターに追加された矛盾の数が特定のしきい値を超えていないことが判明した場合、この特徴をこのクラスターに追加します。機能を既存の機能クラスターに追加できない場合は、新しいクラスターを作成し、新しく作成したクラスターに機能を追加します。

ここに画像の説明を挿入

4.3特徴量変換

トレーニング プロセス中に、EFB は特徴グループ内の特徴を変換して、それらと代表的な特徴の間の相関を最小限に抑えます。これは、モデルのパフォーマンスに対する機能バンドルの影響を軽減するのに役立ちます。EFB は、相関性の高い特徴をまとめてバンドルすることにより、モデル内の特徴の数を減らし、それによってモデルの複雑さを軽減します。これは、過学習のリスクを軽減し、モデルの汎化能力を向上させるのに役立ちます。

理論的な内容を話しすぎました。しばらくは皆さんが理解できないと思います。そのため、例を直接使用して、lightgbm アルゴリズムの威力を示します。

3. LightGBMをベースとしたユーザー購買意向予測モデルの構築

上記の検討を経て、LightGBM モデルのいくつかの重要な点が理解できました。データに対してデータ等化処理を実行する必要がなく、追加の欠損値処理も必要なく、特徴量の次元削減操作も必要ありません。カテゴリの特徴を直接処理し、直接回避する 多くのデータ エンジニアリングが必要でした。

それでは、まずデータセットをプレビューしてみましょう。
ここに画像の説明を挿入

これは、2021 年華樹杯全国学部数学コンテスト モデリング C の質問データセットです。リストの各次元特性は、顧客の個人特性アンケートで収集された次元データに対応しています。

ここに画像の説明を挿入

同様に

  • a1. 快適性(環境保護、スペースシート)総合性能の満足度
  • a2. 経済性の総合満足度(エネルギー消費量と価値維持率)
  • a3. 安全性能の総合満足度(制動視界、運転視界)
  • a4. 動力性能(登坂・加速)の総合満足度
  • a5. 操縦性能(旋回性、高速安定性)の総合満足度
  • a6. 全体的な外観と内装性能の満足度
  • a7. 構成と品質の総合満足度スコア

a1からa7の正規性に基づいて購入意向を計算するのは比較的簡単なアルゴリズムですが、ユーザー特性テーブルのテーブルBのデータと組み合わせると、異なる質問に応じて対応する各次元のデータも処理する必要があります、それがネガティブであろうと定量的であろうと。従来の機械学習が使用され、データ クリーニングとデータ バランシングが必要になると、これらの問題はさらに厄介になります。これは、次のものを購入する意欲のあるユーザーがほとんどいないためです。

ここに画像の説明を挿入

そして、処理する必要のあるデータには多くの null 値があります。

ここに画像の説明を挿入

ただし、LightGBM を使用して上記の状況を無視して直接トレーニングすることもできます。一般的に使用される LightGBM トレーニング パラメーターの一部を次に示します。

  1. boosting_type (ブースティング タイプ):オプションの値には、「gbdt」 (従来の勾配ブースティング ツリー)、「rf」 (ランダム フォレスト)、「dart」 (ドロップアウトが多重加法回帰ツリーと一致する)、「goss」 (勾配ベースのブースティング ツリー) が含まれます。サイドサンプリング)など。
  2. num_leaves (リーフ ノードの数):各ツリーのリーフ ノードの数を定義します。値を大きくすると、モデルの複雑さが増す可能性がありますが、過学習につながる可能性もあります。
  3. learning_rate (学習率):各反復におけるモデル パラメーターの更新ステップ サイズを制御します。値が小さいほどトレーニング プロセスは安定しますが、より多くの反復が必要になる場合があります。
  4. n_estimators (反復数):トレーニング ツリーの数を指定します。通常、問題の複雑さに応じて設定する必要があります。
  5. max_ Depth (ツリーの最大深さ):各ツリーの最大深さを制限します。これは、過学習を防ぐために使用できます。
  6. min_child_samples (リーフ ノードの最小サンプル数):各リーフ ノードのサンプルの最小数を指定します。これは、枝刈りを制御し、深すぎるツリーの生成を防ぐために使用されます。
  7. subsample (サブサンプリング比):過学習を防ぐために、各ツリーのトレーニング中にサンプルのサブサンプリング比を制御します。
  8. Colsample_bytree (特徴サブサンプリング比):特徴間の強い相関を防ぐために、各ツリー トレーニングの特徴サブサンプリング比を制御します。
  9. reg_alpha (L1 正則化項)およびreg_lambda (L2 正則化項):モデルの複雑さを制御し、過学習を防ぐために使用されます。
  10. scale_pos_weight (正と負のサンプルの重みバランス):カテゴリの不均衡に対処し、少数派のカテゴリのサンプルの重みを増やすために使用されます。
  11. object (目的関数):「回帰」(回帰問題) や「バイナリ」(2 つの分類問題) など、最小化する損失関数を定義します。
  12. メトリック (評価指標):「rmse」 (二乗平均平方根誤差)、「auc」 (ROC 曲線下の面積) など、モデルのパフォーマンスを評価するために使用される指標。

これは一般的に使用される LightGBM トレーニング パラメーターのほんの一例であり、実際の使用時に調整できるパラメーターは他にも多数あります。問題やデータセットが異なれば、異なるパラメーター構成が必要になる場合があるため、LightGBM を使用する場合は、問題の特性に応じてパラメーター調整を実行して、最高のモデルのパフォーマンスを得ることができます。LightGBM の公式ドキュメントと関連リソースを参照すると、各パラメーターの意味と使用法を深く理解できます。

import lightgbm as lgb
from sklearn.model_selection import train_test_split
import joblib
from sklearn.metrics import mean_squared_error

X_train, X_test, y_train, y_test = train_test_split(X, target, test_size=0.2)

# 创建成lgb特征的数据集格式
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)

# 定义训练参数
params = {
    
    
    'boosting_type': 'gbdt',
    'objective': 'binary',  # 适用于二分类问题
    'metric': 'binary_logloss',  # 适用于二分类问题的损失函数
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0
}

# 训练模型
num_round = 100  # 迭代次数
bst = lgb.train(params, lgb_train, num_round, valid_sets=[lgb_eval], early_stopping_rounds=10)

# 保存模型
model_filename = 'lgb_model.pkl'
joblib.dump(bst, model_filename)

# 预测数据集
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
 
# 评估模型
print('The rmse of prediction is:', mean_squared_error(y_test,y_pred))

ここに画像の説明を挿入

混同行列:

from sklearn.metrics import confusion_matrix
import numpy as np
# 使用 NumPy 将小于 0.5 的值归为 0,大于等于 0.5 的值归为 1
y_pred_binary = (y_pred >= 0.5).astype(int)

labels=[0,1]
cm= confusion_matrix(y_test, y_pred_binary,labels=[0,1])
sns.heatmap(cm,annot=True ,fmt="d",xticklabels=labels,yticklabels=labels)

plt.title('confusion matrix')  # 标题
plt.xlabel('Predict lable')  # x轴
plt.ylabel('True lable')  # y轴
plt.show()

ここに画像の説明を挿入

サンプルケースのデータはあまり良くありません。バランスが崩れすぎています。仕方がないので、次回、良いデータセットがあれば、もう一度実行してください。

要約する

最後に、前のアルゴリズムの XGBoost アルゴリズムと比較します。

LightGBM の利点:

  1. トレーニング速度の高速化: LightGBM は GOSS (勾配ベースの片側サンプリング) やヒストグラム最適化などのテクノロジーを使用しているため、トレーニング速度の点では通常 XGBoost よりも高速です。これは、大規模なデータセットを処理する場合に非常に有益です。
  2. メモリ消費量の削減: LightGBM は固有値の離散化とヒストグラムの最適化によってメモリ使用量を削減し、特に大規模なデータの処理に適しています。
  3. 高次元のスパース データの処理の向上: LightGBM はヒストグラム最適化手法を使用できるため、高次元のスパース データを処理する際のパフォーマンスが向上します。
  4. カテゴリ特徴量の処理の向上: LightGBM は、ワンホット エンコーディングなどの処理を行わずに、カテゴリ特徴量を直接処理できます。
  5. 並列化のサポート: LightGBM は並列コンピューティングをサポートしており、マルチコア プロセッサを効果的に利用できます。

LightGBM の欠点:

  1. 外れ値に敏感: LightGBM のサンプル サンプリング技術は外れ値に敏感な場合があるため、外れ値を扱うときは注意が必要です。

XGBoost の利点:

  1. 強力な正則化: XGBoost は正則化が強力であり、過剰適合を効果的に防止できます。
  2. 幅広い用途: XGBoost は長い間存在しており、多くのデータ サイエンス コンテストや実用的なアプリケーションで広く使用されており、より実践的な経験があります。

XGBoost の欠点:

  1. メモリ消費量が大きい: XGBoost はメモリ消費量が比較的大きいため、大規模なデータセットの場合は制限される可能性があります。
  2. 比較的遅い: LightGBM と比較すると、XGBoost のトレーニング速度はわずかに遅い場合があります。

一般的に言えば、LightGBM と XGBoost はどちらも優れた勾配ブースティング ツリー アルゴリズムの実装であり、シナリオによっては異なる利点がある可能性があります。どのアルゴリズムを選択するかは、データセットのサイズ、特徴の性質、計算リソース、および特定の問題の要件によって異なります。実際の使用では、通常、さまざまなアルゴリズムを試し、パラメータ調整を実行して、問題に最適なアルゴリズムと構成を見つける必要があります。

幅広い用途、より実践的な経験。

XGBoost の欠点:

  1. メモリ消費量が大きい: XGBoost はメモリ消費量が比較的大きいため、大規模なデータセットの場合は制限される可能性があります。
  2. 比較的遅い: LightGBM と比較すると、XGBoost のトレーニング速度はわずかに遅い場合があります。

一般的に言えば、LightGBM と XGBoost はどちらも優れた勾配ブースティング ツリー アルゴリズムの実装であり、シナリオによっては異なる利点がある可能性があります。どのアルゴリズムを選択するかは、データセットのサイズ、特徴の性質、計算リソース、および特定の問題の要件によって異なります。実際の使用では、通常、さまざまなアルゴリズムを試し、パラメータ調整を実行して、問題に最適なアルゴリズムと構成を見つける必要があります。

おすすめ

転載: blog.csdn.net/master_hunter/article/details/132443565
おすすめ