LGBMClassifier 入門ガイド
LGBMClassifier 入門ガイド
特定の現象をモデル化するために適している機械学習アルゴリズムは非常に多数存在します。一部のモデルは他のモデルを凌駕するために属性のセットを利用する一方、他のモデルは弱い学習者を含め、モデルに追加情報を提供するために属性の残りを利用する、アンサンブルモデルとして知られるものもあります。
アンサンブルモデルの前提は、異なるモデルの予測を組み合わせることで、エラーを減らしてモデルの性能を向上させることです。バギングとブースティングという2つの人気のあるアンサンブル技術があります。
バギング(ブートストラップ集約)は、トレーニングデータの異なるランダムなサブセット上で複数の個別のモデルをトレーニングし、その予測の平均値を使用して最終的な予測を生成します。一方、ブースティングは個別のモデルを順番にトレーニングし、各モデルが前のモデルの誤りを修正しようとします。
アンサンブルモデルについての文脈がわかったので、Microsoftが開発したLight GBM(LGBM)アルゴリズムであるブースティングアンサンブルモデルについて詳しく見てみましょう。
LGBMClassifierとは何ですか?
LGBMClassifierは、Light Gradient Boosting Machine Classifierの略です。ランキング、分類、およびその他の機械学習タスクにおいて、決定木アルゴリズムを使用します。LGBMClassifierは、大規模データを高精度で処理するために、Gradient-based One-Side Sampling(GOSS)およびExclusive Feature Bundling(EFB)という新しい技術を使用しており、効率的に高速化しメモリ使用量を削減します。
Gradient-based One-Side Sampling(GOSS)とは何ですか?
従来の勾配ブースティングアルゴリズムは、トレーニングにすべてのデータを使用しますが、大規模なデータセットを扱う際に時間がかかることがあります。一方、LightGBMのGOSSは、大きな勾配を持つインスタンスはすべて保持し、小さな勾配を持つインスタンスにランダムなサンプリングを行います。これには、大きな勾配を持つインスタンスはフィットさせるのが難しく、より多くの情報を持っているという直感があります。GOSSは、サンプリング中の情報の損失を補うために、小さな勾配を持つデータインスタンスに対して定数の乗数を導入します。
Exclusive Feature Bundling(EFB)とは何ですか?
スパースなデータセットでは、ほとんどの特徴はゼロです。EFBは、相互に排他的な特徴(同時に非ゼロにならない特徴)をバンドル/結合して次元数を減らす、ほぼ非損失のアルゴリズムです。これらの特徴は「排他的」であるため、元の特徴空間は重要な情報の損失なしに保持されます。
インストール
LightGBMパッケージは、pip(Pythonのパッケージマネージャー)を使用して直接インストールすることができます。以下のコマンドをターミナルまたはコマンドプロンプトに入力して、LightGBMライブラリをダウンロードしてインストールします:
pip install lightgbm
Anacondaユーザーは、以下に示すように「conda install」コマンドを使用してインストールすることもできます。
conda install -c conda-forge lightgbm
OSに応じて、このガイドを使用してインストール方法を選択できます。
実際にやってみよう!
それでは、LightGBMとその他の必要なライブラリをインポートしましょう:
import numpy as np
import pandas as pd
import seaborn as sns
import lightgbm as lgb
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
データセットの準備
人気のあるタイタニックのデータセットを使用しています。このデータセットには、タイタニック号の乗客に関する情報が含まれており、目的変数はその乗客が生存したかどうかを示しています。データセットをKaggleからダウンロードするか、以下のコードを使用してSeabornから直接ロードできます:
titanic = sns.load_dataset('titanic')
「deck」、「embark_town」、「alive」といった不要な列を削除します。これらの列は冗長であり、また船上の任意の人物の生存に寄与しないためです。次に、「age」、「fare」、「embarked」といった特徴には欠損値があることに気づきます。異なる属性は適切な統計的手法で補完されます。
# 不必要な列を削除します
titanic = titanic.drop(['deck', 'embark_town', 'alive'], axis=1)
# 欠損値を中央値または最頻値で置き換えます
titanic['age'] = titanic['age'].fillna(titanic['age'].median())
titanic['fare'] = titanic['fare'].fillna(titanic['fare'].mode()[0])
titanic['embarked'] = titanic['embarked'].fillna(titanic['embarked'].mode()[0])
最後に、pandasのカテゴリカルコードを使用して、カテゴリ変数を数値変数に変換します。これで、データがモデルのトレーニングプロセスを開始する準備が整いました。
# カテゴリ変数を数値変数に変換します
titanic['sex'] = pd.Categorical(titanic['sex']).codes
titanic['embarked'] = pd.Categorical(titanic['embarked']).codes
# データセットを入力特徴と目的変数に分割します
X = titanic.drop('survived', axis=1)
y = titanic['survived']
LGBMClassifierモデルのトレーニング
LGBMClassifierモデルのトレーニングを開始するには、scikit-learnのtrain_test_split関数を使用して、データセットを入力特徴と目的変数、およびトレーニングセットとテストセットに分割する必要があります。
# データセットをトレーニングセットとテストセットに分割します
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
非数値データを数値データに変換するために、カテゴリ(”who”)と順序データ(”class”)にラベルエンコードを行います。
class_dict = {
"Third": 3,
"First": 1,
"Second": 2
}
who_dict = {
"child": 0,
"woman": 1,
"man": 2
}
X_train['class'] = X_train['class'].apply(lambda x: class_dict[x])
X_train['who'] = X_train['who'].apply(lambda x: who_dict[x])
X_test['class'] = X_test['class'].apply(lambda x: class_dict[x])
X_test['who'] = X_test['who'].apply(lambda x: who_dict[x])
次に、モデルのハイパーパラメータをコンストラクタの引数またはset_paramsメソッドに辞書として渡すことで指定します。
モデルのトレーニングを開始するための最後のステップは、LGBMClassifierクラスのインスタンスを作成し、トレーニングデータに適合させることによってデータセットを読み込むことです。
params = {
'objective': 'binary',
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9
}
clf = lgb.LGBMClassifier(**params)
clf.fit(X_train, y_train)
次に、トレーニングされた分類器の性能を未知のテストデータセットで評価しましょう。
predictions = clf.predict(X_test)
print(classification_report(y_test, predictions))
precision recall f1-score support
0 0.84 0.89 0.86 105
1 0.82 0.76 0.79 74
accuracy 0.83 179
macro avg 0.83 0.82 0.82 179
weighted avg 0.83 0.83 0.83 179
ハイパーパラメータのチューニング
LGBMClassifierは、最適なパフォーマンスを得るためにチューニングできる多くの柔軟性を持っています。ここでは、いくつかの主要なハイパーパラメータについて簡単に説明します:
- num_leaves: これは木モデルの複雑さを制御する主要なパラメータです。num_leavesの値は、2^(max_depth)以下であるべきです。
- min_data_in_leaf: これはリーフワイズツリーにおける過学習を防ぐための重要なパラメータです。最適な値は、トレーニングサンプルの数とnum_leavesに依存します。
- max_depth: これを使用してツリーの深さを明示的に制限することができます。過学習の場合には、このパラメータをチューニングすると良いです。
これらのハイパーパラメータを調整して新しいモデルを訓練しましょう:
model = lgb.LGBMClassifier(num_leaves=31, min_data_in_leaf=20, max_depth=5)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
precision recall f1-score support
0 0.85 0.89 0.87 105
1 0.83 0.77 0.80 74
accuracy 0.84 179
macro avg 0.84 0.83 0.83 179
weighted avg 0.84 0.84 0.84 179
実際のハイパーパラメータの調整は、試行錯誤により行われ、ビジネスの問題に対するブースティングアルゴリズムとドメイン知識の経験と深い理解によってもガイドされるプロセスです。
この記事では、LightGBMアルゴリズムとそのPythonの実装について学びました。これは、さまざまなタイプの分類問題に役立つ柔軟な技術であり、機械学習ツールキットの一部であるべきです。 Vidhi Chugh は、製品、科学、エンジニアリングの交差点で働くAI戦略家であり、デジタルトランスフォーメーションのリーダーです。彼女は受賞歴のあるイノベーションリーダー、著者、国際的なスピーカーです。彼女は機械学習を民主化し、誰もがこの変革の一部になるための専門用語を解体する使命に取り組んでいます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles