コードから明確さへ: SHAPを使ったXGBoostの説明
紹介
XGBoost、すなわちExtreme Gradient Boostingは、その速度と精度で知られる人気のある機械学習アルゴリズムです。2014年に陳天奇によって作成され、データサイエンスや機械学習のプロジェクトで広く使用されています。これは、多くの種類のデータとよく合い、他のアルゴリズムよりもしばしばより良い結果をもたらすからです。
この記事では、XGBoostがどのように機能するのか、何が特別なのか、そしてなぜ実世界のアプリケーションで非常に広く使用されているのかを詳しく説明します。また、オリジナルの研究で使用されたデータセットに類似したデータセットを使用して、XGBoostの実際のケーススタディも行います。これにより、XGBoostがどのように機能するかを実際に見ることができます。
このガイドは、XGBoostの基本を理解したい初心者や、実践的な例を探しているデータ実務者に最適です。
概要
機械学習モデルの精度を向上させるには、単にアルゴリズムを適合させたり予測を行ったりするだけでは不十分です。産業プロジェクトや競技の場面では、特徴量エンジニアリングやアンサンブルのようなテクニックがパフォーマンスを向上させるためによく使用されます。
XGBoostはこれの代表的な例であり、速度、柔軟性、移植性で知られている最適化された分散勾配ブースティングライブラリです。また、KaggleやHackerRankなどのプラットフォームでの機械学習コンペティションにおいて、多くのデータサイエンティストにとって信頼されるツールとなっています。実際、これらのチャレンジでのトップパフォーマンスを誇る解決策の約60%がXGBoostを重要なコンポーネントとして使用しています。その中で、約27%はトレーニングにXGBoostのみを依存し、残りはしばしばニューラルネットワークと組み合わせて強力なアンサンブル手法の一部として使用しました。
XGBoostの仕組みを理解するためには、まずいくつかの主要な機械学習の概念、すなわち、教師あり学習、決定木、アンサンブル学習、そして勾配ブースティングを把握することが役立ちます。
教師あり学習は、アルゴリズムがラベル付けされたデータセットで訓練される機械学習の一種であり、各データポイントには特徴と対応するラベルが含まれています。目的は、この訓練データからパターンを学び、訓練されたモデルを使用して新しい未見のデータ、一般にテストデータと呼ばれるものに対して予測を行うことです。
決定木は、データを特徴値に基づいて枝分かれさせ、真偽の質問の連続を使用して予測を行うモデルです—まるでif-then-elseフローチャートのようです。これらは、分類(カテゴリの予測)と回帰(連続値の予測)の両方に使用されます。アイデアは、正確な予測に到達するためにできるだけ少ない質問をすることです。
勾配ブースティング決定木 (GBDT)は、多くの弱い学習者—通常は浅い決定木—を組み合わせることで強いモデルを構築する一種のアンサンブル学習法です。一般的に、アンサンブル学習は複数のモデルを組み合わせることで性能を向上させます。“勾配ブースティング”は、これらのモデルを順次訓練するプロセスを指し、各新しいモデルは前のモデルの誤差を修正しようとします。
XGBoostの主要な特徴と利点
XGBoostは、Python、R、Julia、C++など複数のプログラミング言語をサポートする柔軟なフレームワークであり、さまざまなワークフローに簡単に統合できます。また、DigitaloceanのGPUドロップレット、Azure、Google Colabなどのプラットフォームでシームレスに動作する非常にポータブルなツールでもあります。
XGBoostを特別なものにしているのは、その互換性とポータビリティだけでなく、私たちが「2つのP」と呼ぶことができるパフォーマンスと処理速度です。この2つのコアな強みが、その人気の主な理由です。勾配ブースティングの原則に基づいて構築されたXGBoostは、ランダムフォレストなどの多くの他のアンサンブル手法よりも速いトレーニングと優れた予測能力を提供することで、一歩先に踏み出しています。要するに、XGBoostは速度とパフォーマンスに重点を置いた、勾配ブースティングの高度なバージョンであり、一流の結果を提供します。
さて、このアルゴリズムがなぜそんなに速いのですか?
その答えは並列化の概念の背後にあります。アンサンブルを作成する決定木は並列プロセスを使用して計算されます。アルゴリズムが単一プロセッサで実行される場合、CPUのすべてのコアが考慮されます。また、分散モードで実行される場合、システムの利用可能な最大計算能力を使用することが保証されます。
XGBoostの速度の背後にあるもう一つの重要な理由は、その<強調>キャッシュ最適化強調>の賢い利用です。ウェブブラウザが頻繁に訪れるページを保存してそれらをより早く読み込むのと同様に、コンピュータシステムはデータアクセスを迅速にするためにキャッシュを利用します。キャッシュはCPUとメインメモリの間にある高速ストレージ層として機能し、データ取得の遅延を減少させるのに役立ちます。
XGBoostは、トレーニング中に中間計算や重要な統計をキャッシュすることでこれを利用します。これは、アルゴリズムが同じものを繰り返し再計算する必要がないことを意味し、はるかに迅速な処理と迅速な予測をもたらします。
しかし、これは処理部分に過ぎず、データサイエンティストとしてはパフォーマンス部分も考慮する必要があります。このアルゴリズムには、モデルが過学習するのを防ぐ正則化と自動剪定の概念があります。この基準は、勾配ブースティングやGBには存在しません。モデルを呼び出す際に正則化パラメータが渡され、過学習が管理されることが保証されます。したがって、モデルの分散は制御されます。また、自動剪定は、モデルが特定の深さを超えて成長しないようにする機能です。勾配ブースティング決定木の構築中に特定の枝やサブツリーを切り抜いたり削除したりするこの自動プロセスは、決定木が過度に複雑になり、トレーニングデータに密接にフィットしすぎることで発生する過学習を防ぎ、見えないデータに対する一般化が劣ることを防ぎます。
これらの優れた特徴により、モデルは堅牢になり、さらにXGBoostは欠損値の処理も行います。研究論文では、著者はアルゴリズムがスパースな特徴形式をシームレスに受け入れると述べています。XGBoostは、決定木における最適な分割を見つけるためにスパース性を考慮したアルゴリズムを使用しており、各分割の際に特徴セットはランダムに選択されます。欠損値が遭遇すると、XGBoostは利用可能なデータに基づいて木構造の左に行くか右に行くかについて情報に基づいた意思決定を行うことができます。これは、欠損値を含むカテゴリ特徴にとって特に有用です。
内部的に、XGBoostは値が欠損している場合に最適な方向を学習します。このプロセスはトレーニングフェーズ中に行われます。
XGBoostの前提条件および注意事項
XGBoostを始める前に、Python(または好みのプログラミング言語)の基本的な理解と、教師あり学習、分類、回帰、決定木などの基礎的な機械学習の概念を理解しておくことが重要です。NumPy、pandas、scikit-learnなどのライブラリに慣れておくことも、データセットやモデルを扱うのを容易にします。XGBoostはパフォーマンスの調整や大規模データセットの処理に頻繁に使用されるため、モデル評価技術(交差検証や精度、RMSEなどの指標)に関する経験があると役立ちます。pipやcondaのようなツールを使用して、環境にXGBoostがインストールされていることを確認し、現在のシステム設定との互換性をチェックしてください。
Pip 21.3+ is required
pip install -U xgboost
XGBoostをインストールするためにCondaパッケージマネージャを使うこともできます:
conda install -c conda-forge py-xgboost
XGBoostの簡略化: 簡単な概要
Unsplash サイモン・ワイクス
このチュートリアルのセクションでは、XGBoostのいくつかの主要な機能を詳細に検討します。
ブースティング
私たちが学んだように、XGBoostはブースティングアルゴリズムの洗練されたイテレーションであり、その基盤となるコアとして機能します。ブースティングは、いくつかの弱い分類器を組み合わせて強力な分類器を構築することを目的としたアンサンブルモデリング手法です。一連の弱い学習者を組み合わせてモデルを構築します。最初に、学習データを使用してモデルが構築されます。次に、最初のモデルが犯したエラーを訂正することを目的として、2番目のモデルが作成されます。このプロセスは繰り返され、全てのトレーニングデータセットが正確に予測されるか、最大許容モデル数に達するまでモデルが組み込まれます。
勾配ブースティング
勾配ブースティングは、通常、順次に構築された複数の弱学習者、特に決定木を訓練することによってモデルの予測性能を向上させることに焦点を当てた機械学習手法です。勾配ブースティングの背後にある主要なアイデアは、前のモデルが犯した誤りを反復的に修正することです。
XGBoost
このアルゴリズムでは、決定木が順次作成され、重みがXGBoostで重要な役割を果たします。このアプローチでは、各独立変数に最初に重みが割り当てられ、予測のために決定木に入力されます。木によって誤って予測された変数は重みが増加し、その後、第2の決定木で使用されます。これらの個々の分類器は、アンサンブル学習を通じて堅牢でより正確なモデルを作成するために結合されます。
この反復的ブースティングアプローチは、時間の経過とともにモデルを適応させ改善し、予測エラーを効果的に減少させ、強力なアンサンブルモデルを作成します。これは回帰および分類タスクの両方に広く使用されており、高い予測精度で知られています。勾配ブースティングの人気の実装には、XGBoost、LightGBM、CatBoostがあります。
XGBoostのパラメータ
XGBoostには、モデルの動作と性能をカスタマイズするために調整できる幅広いパラメータがあります。トレーニング中に調整する際に最も重要なものを特定する前に、これらのいくつかを見ていきましょう。
一般パラメータ:
- ブースター:ブースティングモデルの種類(gbtree、gblinear)、デフォルトのオプションはgbtreeです。
- サイレント: 冗長性レベル、有効な値は0(サイレント)、1(警告)、2(情報)、3(デバッグ)です。冗長性はメッセージを印刷することが知られています。
- nthread: 処理に使用する並列CPUスレッドの数
ツリーブースターのパラメータ:
- eta(または学習率):デフォルト値は0.3です。この値は過学習を防ぐためのステップサイズの縮小です。
- max_depth: ツリーの最大深さ
- min_child_weight: 子ノードに必要な全観測の最小合計重みを指定します。このパラメータは過剰適合を制御しますが、値が高すぎると過少適合になる可能性があります。
- サブサンプル:木を構築するために使用される観測の割合。これは、各イテレーションごとに1回発生します。
- colsample_bytree: 木の構築に使用される特徴または列の割合
- ラムダ(または reg_lambda):L2 正則化
- アルファ(または reg_alpha):L1 正則化
学習タスクのパラメーター:
- 目的: ここでは、デフォルト値reg:squarederrorが使用されており、Objectiveはモデルが削減を目指す損失関数を定義しています(例: 回帰の場合はreg:squarederror、バイナリ分類の場合はbinary: logistic)。
- 評価指標: トレーニング中に監視する評価指標 (例: 回帰のためのrmse, 二項分類のためのlogloss)
制御パラメータ:
- num_round(または n_estimators):ブースティングラウンド(木)の数
- early_stopping_rounds: バリデーションメトリックが指定されたラウンド数の間に改善しない場合、トレーニングは停止します。
交差検証パラメータ:
- num_folds(またはnfolds):クロスバリデーションのフォールド数
- 層別サンプリング:クロスバリデーションのために層別サンプリングを実施します。これは、ターゲット変数においてクラスの不均衡がある場合に使用されます。
これはXGBoostで利用できる多くのパラメータの一部に過ぎません。パラメータの選択は、特定の問題とデータセットに依存します。これらのパラメータの慎重な調整は、モデルのパフォーマンスに大きな影響を与えることがあります。
追加パラメータ:
- scale_pos_weight: デフォルト値は1です。このパラメータは、正と負の重みのバランスを作成します。
- シード: 再現性のためのランダムシード。
- ガンマ:葉ノードでさらに分割するために必要な最小損失削減。
XGBoostのパラメータを最適なトレーニングのために最適に調整する方法
最適なトレーニングのためのパラメータ調整は、問題の定義、データセット、およびハイパーパラメータの調整を理解することの組み合わせを含みます。
- ハイパーパラメータの調整に入る前の最初のステップは、データセットと問題の定義を理解することです。これには、初期データの準備、特徴量エンジニアリング、探索的データ分析(EDA)、および問題に基づく評価指標の決定(分類または回帰)が含まれるべきです。
- データをトレーニング、テスト、検証に分割し、モデルのトレーニングや残りの二つのセットでの性能テストに使用します。このプロセス中、データリークの問題にも注意が必要です。トレーニングセットを使用してモデルを作成し、テストセットでモデルを評価し、最良のハイパーパラメータを見つけた後に検証セットを使用してモデルを検証します。これにより、その性能の偏りのない評価が保証されます。
- まず、重要なまたはデフォルトのパラメータを使用してベースモデルを作成します。これにより、モデルの良い出発点が提供され、後でパラメータを微調整してモデルのパフォーマンスを向上させることができます。
- 次に、Grid Search、Random Search、またはベイジアン最適化などの手法を用いてハイパーパラメータチューニングを実行します(例:scikit-learnのGridSearchCVやRandomizedSearchCV、またはOptunaなどのライブラリを使用)。
XGBoostには多くのパラメータがありますが、その中でもいくつかは最も重要で、モデルをトレーニングのために展開する際に考慮する必要があります。最適なトレーニングのためのパラメータのリストは以下の通りです。
A. 学習率 (エータ)
B. 最大深度 (max_depth)
C. 木の数 (n_estimators)
D. 最小子供重量 (min_child_weight)
E. ガンマ (min_split_loss)
F. サブサンプリングおよびカラムサブサンプリング
G. 早期停止
H. クロスバリデーション
早期停止を実装する
L1およびL2などの正則化手法を試してください。
特徴の選択とそれぞれの特徴の理解は重要な役割を果たします。主要な特徴の特定は非常に重要です。XGBoostにはこれを助けるための組み込みの特徴重要度スコアがあります。また、SHAPやLIMEのようなツールを使用することもできます。これらのライブラリは、モデルに対して正の寄与をしている重要な特徴を見つけるのに役立ちます。そして、ブラックボックスモデルの説明にも役立ちます。
モデルが満足のいくパフォーマンスレベルに達した後は、それを実際の予測に展開することが重要です。しかし、データ環境は時間とともに進化する可能性があるため、継続的な監視が不可欠です。これにより、変化するデータ分布や新たな要件に対応するために、定期的な再学習が必要になります。モデルが初めにハイパーパラメータを微調整し、バランスを取った場合でも、ハイパーパラメータを再評価し、場合によっては改訂することは一般的です。この反復プロセスは、動的なデータ状況に対する適応性を反映しており、データサイエンスの基本的な側面として残ります。
最適なハイパーパラメータのセットは、問題ごとに異なる場合があることを心に留めておいてください。バイアスとバリアンスのバランスを取ることが重要であり、これはしばしばバイアス-バリアンストレードオフと呼ばれます。
極限勾配ブースティングの実装
ここでは、実際の問題に対処するためにXGBoostを使用する方法を段階的に示すデモをガイドします。元の研究論文では4つのデータセットが使用されましたが、このチュートリアルではXGBoostの実践を示すために、比較可能なデータセットを使用しています。
| データセット | タスク |
|---|---|
| オールステート | 保険請求の分類 |
| ヒッグス粒子 | イベント分類 |
| Yahoo LTRC | ランクを学ぶ |
| クリテオ | クリック率予測 |
コードデモと説明
今からデータセットのダウンロード方法、モデルの作成方法、そしてテストデータに対する予測にどのように利用するかを説明します。以下のコードはウェブからデータセットを読み込みます。
ここでは、クリック率を予測する分類問題を使用します。クリック率(CTR)予測の目的は、特定の広告やアイテムを人がクリックする可能性を予測することです。
url="https://raw.githubusercontent.com/ataislucky/Data-Science/main/dataset/ad_ctr.csv"
ad_data = pd.read_csv(url)
データセットの特徴を簡単に説明する
このコードはデータセットに存在する列や特徴を表示します。
ad_data.columns
データセットに存在する変数は次のとおりです:
- 広告がクリックされました: ユーザーが広告をクリックした場合は1、そうでない場合は0。
- 年齢: ユーザーの年齢
- サイトでの1日の滞在時間: ユーザーがウェブサイトで過ごす1日の時間
- 毎日のインターネット使用: ユーザーのインターネット使用
- 地域収入: ユーザーの平均収入
- 都市: 市
- 広告のトピックライン: 広告のタイトル
- タイムスタンプ: ユーザーがウェブサイトを訪れた時間
- 性別: ユーザーの性別
- 国: ユーザーの国
データの準備と分析
下記のコードスニペットは、データセットの形状、基本情報、データ型、およびターゲット列の値のカウントを表示します。
provides the dtypes of the columns
ad_data.dtypes
prints the shape of the dataframe
ad_data.shape
displays the columns present in the data
ad_data.columns
describes the dataframe
ad_data.describe()
カテゴリカル列は、モデルに入力する前に数値列に変換する必要があります。
gender_mapping = {'Male': 0, 'Female': 1}
ad_data['Gender'] = ad_data['Gender'].map(gender_mapping)
ad_data['Gender'].value_counts(normalize=True)
Use Label Encoding to convert 'country' to numerical feature
ad_data['Country'] = ad_data['Country'].astype('category').cat.codes
ad_data['Country'].value_counts()
モデル訓練の前にいくつかの不要な列を削除する
ad_data.drop(['Ad Topic Line','City','Timestamp'],axis=1, inplace=True)
トレーニングセットをランダムにトレーニングサブセットとテストサブセットに分割します。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=45)
X_train.shape,X_test.shape,y_train.shape,y_test.shape
モデル訓練:XGBoostモデルを構築し、予測を行う
データセットを2つの異なるセットに分割することが重要です。1つはモデルを訓練するための訓練セット、もう1つはモデルがデータセットにどれだけ適合しているかを評価するためのテストセットです。
データを分割した後、ベースモデルはデフォルトのパラメータを使用して訓練され、その効果を示します。
Step 4: Create and train the first basic XGBoost model
model = XGBClassifier()
model.fit(X_train, y_train)
一度訓練されれば、モデルを使用してテストデータセットを予測し、その性能を評価します。
Step 5: Make predictions
y_pred = model.predict(X_test)
以下のコードはモデルのパフォーマンスを評価します。
Step 6: Evaluate the model's performance
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
print(classification_report(y_test, y_pred))
ここでは、デフォルトパラメータを提供することで、モデルがかなりうまく機能していることに気付きます。精度だけでは、機械学習の分類モデルのパフォーマンスを判断するための信頼できるパラメータではないことに注意してください。
ハイパーパラメータの調整と最適なパラメータの探索
XGBoostにおけるハイパーパラメータの調整は、モデルのパフォーマンスを最適化するための重要なステップです。以下は、XGBoostのハイパーパラメータ調整における重要なステップと考慮事項です:
グリッドサーチCVおよびランダムサーチCVを使用して最適なモデルパラメータを特定します。次のコードは、トレーニングプロセスとパラメータ調整を示しています。
PARAMETERS = {"subsample":[0.5, 0.75, 1],
"colsample_bytree":[0.5, 0.75, 1],
"max_depth":[2, 6, 12],
"min_child_weight":[1,5,15],
"learning_rate":[0.3, 0.1, 0.03],
"n_estimators":[100]}
model = XGBClassifier(n_estimators=100, n_jobs=-1, eval_metric='error')
"""Initialise Grid Search Model to inherit from the XGBoost Model,
set the of cross validations to 3 per combination and use accuracy
to score the models."""
model_gs = GridSearchCV(model,param_grid=PARAMETERS,cv=3,scoring="accuracy")
model_gs.fit(X_train,y_train)
print(model_gs.best_params_)
GrisSearchCVから最良のパラメータを取得したら、それらを使用してモデルをさらにトレーニングし、フィットさせます。
#Initialise model using best parameters
model = XGBClassifier(objective="binary:logistic",subsample=1,
colsample_bytree=0.5,
min_child_weight=1,
max_depth=12,
learning_rate=0.1,
n_estimators=100)
#Fit the model but stop early if there has been no reduction in error after 10 epochs.
model.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_test, y_test)])
モデルを使用して、見えないデータに対するターゲット変数を予測します。
train_predictions = model.predict(X_train)
model_eval(y_train, train_predictions)
次に、再びパラメータを渡しますが、今回は正則化パラメータも追加します。
params = {'max_depth': [3, 6, 10, 15],
'learning_rate': [0.01, 0.1, 0.2, 0.3, 0.4],
'subsample': np.arange(0.5, 1.0, 0.1),
'colsample_bytree': np.arange(0.5, 1.0, 0.1),
'colsample_bylevel': np.arange(0.5, 1.0, 0.1),
'n_estimators': [100, 250, 500, 750],
'reg_alpha' : [0.1,0.001,.00001],
'reg_lambda': [0.1,0.001,.00001]
}
100の推定器でモデルをインスタンス化します。
xgbclf = XGBClassifier(n_estimators=100, n_jobs=-1)
ここでは、RandomizedCVを使用して最適なパラメーターを見つけます。
clf = RandomizedSearchCV(estimator=xgbclf,
param_distributions=params,
scoring='accuracy',
n_iter=25,
n_jobs=4,
verbose=1)
モデルを適合させて最良のパラメーターを見つけ、それを使って目的変数を予測します。
clf.fit(X_train,y_train)
print("Best hyperparameter combination: ", clf.best_params_)
モデルをトレーニングしてテストするプロセスを繰り返してください。
#Initialise model using best parameters from randomized cv
model_new_hyper = XGBClassifier(
subsample=0.89,
reg_alpha=0.1, # L1 regularization (Lasso)
reg_lambda=0.1, # L2 regularization (Ridge)
colsample_bytree=0.6,
colsample_bylevel=.8,
min_child_weight=1,
max_depth=3,
learning_rate=0.2,
n_estimators=500)
#Fit the model but stop early if there has been no reduction in error after 10 epochs.
model_new_hyper.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_test, y_test)])
この場合、モデルの評価を確認すると、モデルが重要なバイアス-バリアンスのトレードオフを維持していることに気付きます。訓練データセットの精度は87%、テストデータセットの精度は84%です。
トレーニングセットの評価
テストセットの評価
XGBoostのハイパーパラメータの調整は時間がかかるプロセスになることがありますが、最良のモデル性能を達成するためには不可欠です。ハイパーパラメータの数が多い場合や計算リソースが限られている場合には、自動調整方法が特に役立ちます。
SHAPを用いた特徴重要度
SHAP(SHapley Additive exPlanations)は、各プレイヤーの最終結果への貢献を理解するためのゲーム理論的アプローチです。これにより、任意の機械学習モデルの出力が説明されます。機械学習モデル、特にアンサンブルモデルは、解釈が難しいためブラックボックスモデルと見なされます。モデルにとって重要な予測因子を特定することは困難です。
モデルへの特徴貢献を理解するために最も広く使用されている手法の1つは、SHAP値を利用することです。これらの値は、収入、日々のインターネット使用、国などの個々の特徴がモデルの予測にどの程度影響を与えるかを測定します。SHAP値は、特定の特徴の重要性と最終予測への影響に関する貴重な洞察を提供します。
このコードデモでは、SHAP値とモデル解釈におけるその役割を含めています。
以下のコードは、PyPIからSHAPパッケージをインストールしてインポートします。
!pip install shap
import shap
SHAP値を計算し可視化し、特徴の重要度、特徴の依存関係、および決定プロットを描画します。
SHAP解説者
次のコードは、XGBoost分類モデルを提供して説明者オブジェクトを作成し、その後、テストセットを使用してSHAP値を計算します。
explainer = shap.Explainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
サマリープロットを表示してください。
概要プロットはモデル内の各特徴の重要度を示しています。結果は「年齢」、「国」、および「日々のインターネット使用」が予測因子として主要な役割を果たすことを示しています。
下のプロットでは、
- Y軸は、重要度の降順に並べられた特徴名を表しており、最も重要な特徴が上に、最も重要でない特徴が下にあります。
- X軸はSHAP値を示しており、これは対数オッズの変化の程度を測る指標です。
"Age" の特徴を調べて、特に正の値を観察すると、Age が出力にかなりの正の影響を与えていることを示しています。言い換えれば、人の年齢が高いほど、その個人が広告をクリックする傾向が強くなる可能性が高くなります。次に、「毎日のインターネット使用量」という機能を見ると、ほとんどが負のSHAP値で高いことがわかります。これは、インターネットの使用率が高いと、出力に悪影響を与える傾向があることを意味します。
では、特徴の「年齢」と「日常のインターネット使用量」の間の「依存プロット」を視覚化しましょう。これは、年齢とインターネット使用の間に相互作用効果があることを示唆しています。
- 各点はデータセットからの単一の予測であり、x軸は年齢の値です。
- y軸はその特徴のSHAP値であり、それはその特徴の値を知ることがそのサンプルの予測に対するモデルの出力をどれくらい変えるかを表します。このモデルにおいて、単位は広告をクリックすることの対数オッズです。
- 例えば、インターネットを多く利用する60歳の人は、その広告をクリックする可能性が高いです。
以下のコードは決定プロットを生成します。決定プロットは次の出力に表示されます。
expected_value = explainer.expected_value
shap.decision_plot(expected_value, shap_values, X_test)
決定プロットに描かれた各線は、特定のモデル予測に対する個々の特徴の影響のレベルを示しており、その予測に最も影響を与えた特徴値を明らかにしています。
XGBoostモデルの保存と読み込み
以下のコードスニペットを使用して、トレーニングされたモデルを保存およびロードします。
model_new_hyper.save_model('model_new_hyper.model')
print("XGBoost model saved successfully.")
Load the saved XGBoost model
import xgboost as xgb
loaded_model = xgb.Booster()
loaded_model.load_model('model_new_hyper.model')
今、‘loaded_model’には訓練されたXGBoostモデルが含まれており、予測に使用できます。
XGBoostの欠点
XGBoostは、強力で人気のある勾配ブースティングアルゴリズムです。複数の決定木を組み合わせて堅牢なモデルを作成することによって機能します。ただし、このアルゴリズムにはいくつかの欠点と制限があります。
複雑性:アンサンブルモデルは本質的に計算を要求する可能性があり、そのハイパーパラメータを効果的に調整するには広範な実験が必要です。特に大規模なデータセットや多数の深い木を扱う際に、XGBoostモデルのトレーニングは計算リソースに負担をかけ、能力の低いハードウェアにとっての制約となる可能性があります。この記事では、この計算の複雑性をGPUを使用することでどのように軽減できるかをすでに解説しています。
オーバーフィッティング:XGBoostはノイズデータや外れ値に敏感です。過剰適合を処理するための組み込みの正則化がありますが、極端なノイズや外れ値のケースは依然としてその性能に影響を与える可能性があります。また、それは木ベースのモデルであり、時には過剰適合につながることがあります。
解釈性の欠如:XGBoostは、その解釈性の欠如から「ブラックボックス」モデルと呼ばれることがよくあります。私たちは、SHAP値とプロットを使用して特徴の重要性とモデルへの影響を理解する方法を示しました。しかし、大量の特徴を使用してモデルを構築する場合、正確な意思決定プロセスを理解することは複雑になることがあります。
これらの欠点にもかかわらず、XGBoostはさまざまなKaggleコンペティション、機械学習、データサイエンスのタスクにおいて堅牢で多目的なアルゴリズムとして残っています。これらの制約を理解し、それらを軽減するための適切な手段を講じることで、XGBoostを使用する際の利点を最大化することができます。
結論
このブログ記事では、勾配ブースティングアルゴリズムの理論的原則と実践的な側面の両方を紹介しました。また、データサイエンティストによって広く使用されており、多くの問題において最先端の結果を提供するスケーラブルなツリーブースティングシステムであるXGBoostの詳細な概要も提供しました。
このチュートリアルのアウトラインは、XGBoostの学習とマスターのための構造化されたアプローチを提供し、インストールやデータ準備からモデルのトレーニング、評価、デプロイメントまでをカバーしています。モデルのいくつかの欠点と、過剰適合や不足適合に対抗する方法についても議論しました。また、モデルの重要な特徴を理解し、解釈するためにSHAPプロットも含めました。
追加のリソースと参考文献
- 天琦・チェンによる原著研究論文
- SKlearn XGBoost ドキュメント
- 分類における勾配ブースティング:もうブラックボックスではない!
- 2025年の機械学習における最高のPythonライブラリ








