XGBoost 2.0で導入されたVector Leafでマルチラベル分類を試す
Vector Leafについて
昨年9月にリリースされたXGBoost 2.0でマルチターゲット回帰、マルチラベル分類、マルチクラス分類のために追加された新機能です。
以前のバージョンではXGBoostは各ターゲット毎に別々のモデルを構築していましたが、Vector Leafでは全てのターゲットに対して1つのツリーを構築出来ます。
この機能はまだ開発途中ですが、過学習を防ぐのに役立ち、より小さなモデルを生成し、ターゲット間の相関を考慮したツリーを構築することが出来るメリットがあるという事のようです。
今回はマルチラベル分類のシミュレーションデータを生成し、デフォルトのモデルとVector Leafによるモデルを2つ作成して学習を行なった後、それぞれのモデルの正解率を比較してみたいと思います。
デモンストレーション
環境はGoogle Corabです。
インストール
import xgboost as xgb
print(xgb.__version__)
執筆時点でGoogle Corabでは最新のリリースバージョン(2.0.3)がインストールされていますので、特に追加でインストールする必要はありません。
マルチラベル分類問題のシミュレーションデータの生成
from sklearn.datasets import make_multilabel_classification
N_FEATURES = 5
N_SAMPLES = 1000
N_CLASSES = 5
N_LABELS = 3
RANDOM_STATE = 1
X, y = make_multilabel_classification(n_features=N_FEATURES, n_samples=N_SAMPLES, n_classes=N_CLASSES, n_labels=N_LABELS, random_state=RANDOM_STATE)
マルチラベル分類問題のシミュレーションデータの生成にはmake_multilabel_classification()を利用します。
for i in range(5):
print(X[i]," ========> ", y[i])
![](https://assets.st-note.com/img/1709894687394-qxRHIzRMYm.png)
上記のようなシミュレーション用のデータが生成されます。
XGBoostモデルの学習
from sklearn.model_selection import train_test_split
n = 100
accuracy = [np.nan] * n
accuracy_with_vector_leaf = [np.nan] * n
for i in range(n):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=i)
model = xgb.XGBClassifier(tree_method="hist")
model.fit(X_train, y_train)
preds = model.predict(X_test)
accuracy[i] = (preds == y_test).all(axis=1).mean()
model_with_vector_leaf = xgb.XGBClassifier(tree_method="hist", multi_strategy="multi_output_tree")
model_with_vector_leaf.fit(X_train, y_train)
preds_with_vector_leaf = model_with_vector_leaf.predict(X_test)
accuracy_with_vector_leaf[i] = (preds_with_vector_leaf == y_test).all(axis=1).mean()
デフォルトのモデルとVector Leafによるモデルを作成して学習をさせてみます。Vector Leafでの学習はmulti_strategy="multi_output_tree"を指定します。
スコアの比較
print("デフォルトのモデルの正解率の平均: ", np.mean(accuracy))
print("Vector Leafによる学習を行ったモデルの正解率の平均: ", np.mean(accuracy_with_vector_leaf))
それぞれスコアを出力してみます。
デフォルトのモデルの正解率の平均: 0.40124999999999994
Vector Leafによる学習を行ったモデルの正解率の平均: 0.4332000000000001
上記のような結果となりました。
このデモンストレーションだけの結果では一概に言えないかと思いますが、Vector Leafによる学習でパフォーマンスの向上が見られました。