Traffine I/O

日本語

2022-08-03

XGBoost概要

XGBoostとは

XGBoost(eXtreme Gradient Boosting)は、勾配ブースティング決定木の効率的かつスケーラブルな実装を提供するオープンソースの機械学習ライブラリです。その優れた性能、柔軟性、使いやすさから、多くのデータサイエンティストや機械学習の実践者によって選ばれるようになっています。

起源と進化

XGBoostは、2014年にリリースされた最初の実装を行った陳天奇氏が率いるワシントン大学の研究プロジェクトから生まれました。ライブラリの開発は、勾配ブースティング木のスケーラブルで効率的な実装を作成するという願望から生まれました。このプロジェクトは、Kaggleのような様々なデータサイエンスコンテストでの卓越したパフォーマンスにより、機械学習コミュニティで急速に発展しました。

XGBoostの成功は、高いパフォーマンス、柔軟性、使いやすさを組み合わせた独自の組み合わせによるものです。ライブラリは、新機能、強化、最適化が追加されることで、年々進化を続けています。

XGBoostを選ぶ理由

XGBoostを他の機械学習ライブラリやアルゴリズムに対して選ぶ理由はいくつかあります。主なものを以下に示します。

  • 優れたパフォーマンス
    XGBoostは、精度と速度の面で他のアルゴリズムに比べて常に優れた結果を出し、多くの実践者の選択肢となっています。

  • スケーラビリティ
    このライブラリは、大規模なデータセットを扱うことができ、データポイントの数に比例して線形にスケーリングできるため、ビッグデータアプリケーションに適しています。

  • 柔軟性
    XGBoostは、ハイパーパラメータやカスタマイズオプションの幅広い範囲を提供し、ユーザーが特定のタスクやデータセットにモデルを微調整できるようにします。

  • 解釈性
    ベースとなる学習器としての決定木の使用により、XGBoostモデルは、ディープニューラルネットワークなどのより複雑なモデルに比べて、比較的簡単に解釈および視覚化できます。

  • クロスプラットフォーム互換性
    XGBoostは、Python、R、Javaなど、複数のプログラミング言語で利用できるため、幅広いユーザーにアクセスできます。

XGBoostアルゴリズム

勾配ブースティング木

勾配ブースティングは、複数の弱い学習器を組み合わせてより正確かつ堅牢なモデルを作成する機械学習技術です。XGBoostの文脈では、これらの弱学習器は決定木です。ブースティングプロセスは、アンサンブルに木を反復的に追加し、各木が以前の木で行った残差誤差を修正するように設計されています。最終的な予測は、アンサンブル内の全ての個々の木の予測の合計です。

勾配ブースティングのキーとなる考え方は、問題を勾配降下最適化タスクとして扱うことです。各反復では、アルゴリズムは前のアンサンブルの予測値に関する損失関数の負の勾配を計算し、その負の勾配値に基づいて新しい木をフィットさせます。このアプローチにより、新しい木の予測は損失関数のもっとも急な勾配に沿って調整され、モデルの予測が真の目標値に近づくようになります。

XGBoostにおける勾配ブースティングのプロセスは、次のステップに分解できます。

  1. 損失関数を最小化する定数予測値でモデルを初期化。これはアンサンブルのベースモデルとして機能する。
  2. ブースティングプロセスの各反復について:
    1. 各トレーニング例について、現在のアンサンブルの予測に関する損失関数の負の勾配を計算。これらの負の勾配値は、新しい木が修正すべき残差誤差を表す。
    2. 負の勾配値に基づいて、新しい決定木をフィットさせる。この木はGreedyアルゴリズムを使用して構築され、損失関数のもっとも急な勾配に基づいて特徴量と分割点が選択される。
    3. 新しい木の最適なステップサイズ(学習率)を決定。これは、新しい木の予測と現在のアンサンブルを組み合わせたときに、損失関数の最小値を出すステップサイズを見つけるラインサーチを使用して実現される。
    4. 最適なステップサイズにスケーリングされた新しい木を追加してアンサンブルを更新。この更新されたアンサンブルには、以前の木で行った残差誤差を修正するために設計された新しい木の貢献が含まれる。
  3. 最大反復回数に達したか、事前定義された停止基準が満たされた場合、最終アンサンブルを使用して予測を行う。

XGBoostにおける勾配ブースティングのこの反復プロセスにより、アルゴリズムは適応的に以前の木での残差誤差から学習し、時間とともにモデルの精度を向上させることができます。損失関数のもっとも急な勾配に新しい木をフィットさせることで、XGBoostは各木が全体の損失をもっとも減らすように設計されているため、強力で堅牢なモデルを提供します。

正則化

過学習を防ぎ、汎化性能を向上させるために、XGBoostは過剰に複雑になることを防ぐ正則化テクニックを組み込んでいます。正則化は、損失関数にペナルティ項を追加し、モデルの重みを制約し、それらがあまり大きくならないようにします。

XGBoostで使用される主な2つの正則化の種類は次のとおりです。

  • L1正則化(Lasso)
    L1正則化は、重みの絶対値を損失関数に追加します。この正則化方法の効果は、いくつかの重みが正確にゼロになるように促し、疎なモデルを作成します。XGBoostの文脈では、L1正則化は決定木の葉の重みに適用され、いくつかの葉ノードが重みがゼロになるように促して、木をプルーニングすることができます。

  • L2正則化(Ridge)
    L2正則化は、重みの二乗値を損失関数に追加します。この方法はL1正則化のような疎なモデルを生成しないが、重みを縮小して大きくなりすぎないようにします。XGBoostでは、L2正則化は決定木の葉の重みに適用され、モデルをスムーズにし、過学習を減らすのに役立ちます。

決定木の構築とプルーニング

XGBoostが他の決定木ベースのアルゴリズムと異なる重要な点の1つは、決定木の構築とプルーニングに対する効率的なアプローチです。このセクションでは、XGBoostが使用する技術について詳しく説明し、より効果的かつ正確なモデルにつながります。

Greedy決定木の構築

XGBoostは深さ優先戦略を用いて決定木を構築し、より効率的な木の構築を可能にしています。木の構築プロセスは、各ノードに対して損失関数をもっとも減らす結果をもたらす特徴量と分割点を選択することで行われます。このアプローチは、即座の結果だけを考慮するため、Greedyアルゴリズムとして知られています。

決定木の構築中、XGBoostは、分割によって損失関数が改善されるかどうかを測定するために、Gainメトリックを計算して潜在的な分割を評価します。各ノードについて、アルゴリズムは全ての可能な特徴量と分割点を反復処理し、Gainが最大になるものを選択します。このGreedyなアプローチにより、木の構造が最適化され、全体的な損失が減少します。

ツリープルーニング

Greedyアルゴリズムは最適な構造を見つけるために効果的ですが、木が複雑になりすぎると過剰適合を引き起こす可能性があります。過剰適合を防ぐために、XGBoostは「プルーニング」と呼ばれる技術を使用して、全体的なGainに十分な貢献をしない分割を削除します。

XGBoostは、深さ優先のアプローチを使用してツリープルーニングを行います。アルゴリズムは、プルーニングプロセスを制御する正則化項を組み込みます。XGBoostの深さ優先プルーニング戦略にはいくつかの利点があります。構築中にツリーをプルーニングすることで、XGBoostは不要な枝を作成せず、ツリー構築に必要な時間とメモリを削減します。このアプローチにより、アルゴリズムは前の決定を再評価する必要がないため、最適なツリー構造をより効率的に見つけることができます。

カラムブロックと並列処理

効率的なツリー構築とプルーニング技術に加えて、XGBoostはカラムブロックデータ構造と並列処理を利用してトレーニングプロセスを高速化します。カラムブロックデータ構造は、特徴をブロックにグループ化してデータセットをメモリに格納し、ツリー構築中にデータにより迅速にアクセスできるようにします。

XGBoostは、現代のマルチコアプロセッサを活用して、ツリー構築プロセスを並列化して高速化します。アルゴリズムは、同時に複数の特徴量と分割点を評価できるため、各ツリーの構築に必要な時間を大幅に短縮できます。この並列化は、大規模なデータセットを扱う場合に特に有益であり、XGBoostを効果的にスケーリングして大量のデータを処理できるようにします。

欠損値とカテゴリカル特徴量の取り扱い

実世界のデータセットにおいて、欠損値やカテゴリカル特徴量の取り扱いは課題の一つです。XGBoostは、欠損値を処理するための特殊な技術や、カテゴリカル特徴量を扱うための手法を備えているため、より柔軟で強力な機械学習アルゴリズムとなっています。

欠損値の処理

欠損値は、センサーの故障、データ入力エラー、または観測が欠落した場合など、さまざまな理由でデータセットに発生することがあります。XGBoostは、欠損値の代入がバイアスを導入したり、アルゴリズムの効率を低下させたりする場合がある代わりに、欠損値を効果的に処理するための組み込み機構を持っています。

木構築の過程で、XGBoostが特定の特徴量の欠損値に遭遇すると、欠損値を左右どちらかの方向に割り当てます。デフォルトの方向は、欠損値を各方向に送信した場合に損失関数がどの程度低減されるかに基づいて選択されます。このアプローチにより、データが不完全な場合でも、アルゴリズムが最適な決定を行うことができます。

木が構築された後、XGBoostは、木構築中に指定されたデフォルトの方向に従って欠損値を処理できます。これにより、いくつかの特徴量の値が欠損していても、アルゴリズムは正確な予測を行うことができます。

カテゴリカル特徴量の処理

XGBoostは、当初数値特徴量を扱うように設計されていましたが、カテゴリカル特徴量を効果的に扱うために拡張することができます。XGBoostにおいてカテゴリカル特徴量を処理するためのいくつかの方法があります。

  • ワンホットエンコーディング
    カテゴリカル特徴量をバイナリ特徴量に変換し、それぞれの一意のカテゴリ値を別々のバイナリ特徴量で表現する方法があります。各カテゴリが存在する場合は値が1になり、そうでない場合は0になります。このアプローチは、カテゴリの値が少ない場合には効果的ですが、多くのカテゴリを持つ特徴量に対しては高次元の特徴空間になる可能性があります。

  • ラベルエンコーディング
    カテゴリカル特徴量を処理する別の方法として、各一意のカテゴリ値に数値ラベルを割り当てる方法があります。この方法は、ワンホットエンコーディングと比較して特徴空間の次元数を大幅に削減することができます。ただし、ラベルエンコーディングはカテゴリの順序を導入するため、時には最適な結果が得られないことがあります。

  • ターゲットエンコーディング
    ターゲットエンコーディングでは、各カテゴリ値をそのカテゴリに属するターゲット変数の平均値で置き換えます。このアプローチは、ラベルエンコーディングよりもカテゴリカル特徴量とターゲット変数の関係をより効果的に捉えることができます。ただし、ターゲットエンコーディングを正しく行わない場合にはリークが発生する可能性があるため、トレーニングセットと検証セットで別々にエンコーディングを実行する必要があります。

Shrinkage

Shrinkageは、XGBoostを含むブースティングアルゴリズムで使用される技術であり、モデルに追加される各個々の木の影響を減らすことで過剰適合を防止するために使用されます。これは、学習率、またはShrinkage係数として知られるものを導入することによって達成されます。この学習率により、各木の貢献が最終モデルにスケーリングされます。このようにして、モデルはよりゆっくりと学習し、未知のデータに対してより一般的に適合するようになります。

XGBoostの文脈において、Shrinkageは、決定木に頼る機械学習モデル、特に過剰適合の問題が一般的なものに対して、過剰適合を減らすために重要な役割を果たします。モデルが過剰適合すると、訓練データでは非常に優れた性能を発揮しますが、新しい、未知のデータでは不十分な性能を発揮します。Shrinkageは、各決定木に割り当てられる重みを制御することで、この問題を緩和するのに役立ちます。

参考

https://arxiv.org/pdf/1603.02754.pdf
https://www.youtube.com/watch?v=OtD8wVaFm6E&ab_channel=StatQuestwithJoshStarmer
https://www.youtube.com/watch?v=8b1JEDvenQU&ab_channel=StatQuestwithJoshStarmer
https://www.youtube.com/watch?v=ZVFeW798-2I&ab_channel=StatQuestwithJoshStarmer
https://www.youtube.com/watch?v=oRrKeUCEbq8&ab_channel=StatQuestwithJoshStarmer

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!