マルチラベル分類にxgboostを使用することは可能ですか?今度は、sklearnのGradientBoostingClassifierよりもOneVsRestClassifierを使用します。動作しますが、私のCPUのコアを1つだけ使用します。私のデータには約45の機能があり、タスクはバイナリ(ブール)データで約20列を予測することです。メトリックは平均平均精度(map @ 7)です。共有するコードの短い例があれば、それは素晴らしいことです。
これにはいくつかの方法があります。そのうちの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_jobs
はOneVsRestClassifier
にありますが、メモリを多く消費します)。
2.最初にk
の正しいラベルが付いたすべてのデータポイントのk
コピーを作成してデータを少しマッサージすると、より簡単なマルチクラス問題にハッキングできます。その時点で、
clf = XGBClassifier(**params)
clf.fit(train_data)
pred_proba = clf.predict_proba(test_data)
各クラスの分類マージン/確率を取得し、ラベルを予測するために必要なしきい値を決定します。このソリューションは正確ではないことに注意してください。製品にタグ(1, 2, 3)
、クラスごとに2つの負のサンプルを人為的に導入します。
予測する各クラスにラベルを追加できます。たとえば、これがあなたのデータである場合:
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が得られますが、それでも多くのラベルを予測できます。