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])

上記のようなシミュレーション用のデータが生成されます。

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による学習でパフォーマンスの向上が見られました。