web-dev-qa-db-ja.com

マルチラベル分類のためのXgブースト?

マルチラベル分類にxgboostを使用することは可能ですか?今度は、sklearnのGradientBoostingClassifierよりもOneVsRestClassifierを使用します。動作しますが、私のCPUのコアを1つだけ使用します。私のデータには約45の機能があり、タスクはバイナリ(ブール)データで約20列を予測することです。メトリックは平均平均精度(map @ 7)です。共有するコードの短い例があれば、それは素晴らしいことです。

15
user3318023

これにはいくつかの方法があります。そのうちの1つは、すでに提案した方法です。

1。

from xgboost import XGBClassifier
from sklearn.multiclass import OneVsRestClassifier
# If you want to avoid the OneVsRestClassifier magic switch
# from sklearn.multioutput import MultiOutputClassifier

clf_multilabel = OneVsRestClassifier(XGBClassifier(**params))

clf_multilabelは、クラスごとに1つのバイナリ分類子に適合しますが、paramsで指定した多くのコアを使用します(fyi、n_jobsOneVsRestClassifierにありますが、メモリを多く消費します)。

2.最初にkの正しいラベルが付いたすべてのデータポイントのkコピーを作成してデータを少しマッサージすると、より簡単なマルチクラス問題にハッキングできます。その時点で、

clf = XGBClassifier(**params)
clf.fit(train_data)
pred_proba = clf.predict_proba(test_data)

各クラスの分類マージン/確率を取得し、ラベルを予測するために必要なしきい値を決定します。このソリューションは正確ではないことに注意してください。製品にタグ(1, 2, 3)、クラスごとに2つの負のサンプルを人為的に導入します。

7
marco_ccc

予測する各クラスにラベルを追加できます。たとえば、これがあなたのデータである場合:

X1 X2 X3 X4  Y1 Y2 Y3
 1  3  4  6   7  8  9
 2  5  5  5   5  3  2

出力に従ってラベルを入力に追加することで、データを簡単に再形成できます。xgboostは、それに応じてそれをどのように処理するかを学習する必要があります。

X1 X2 X3 X3 X_label Y
 1  3  4  6   1     7
 1  3  4  6   1     5
 1  3  4  6   2     8
 2  5  5  5   2     3
 2  5  5  5   3     9
 2  5  5  5   3     2

この方法では、1次元のYが得られますが、それでも多くのラベルを予測できます。

2
Binyamin Even