Est-il possible d'utiliser xgboost pour la classification multi-étiquettes? Maintenant, j'utilise OneVsRestClassifier sur GradientBoostingClassifier de sklearn. Cela fonctionne, mais n'utilisez qu'un seul cœur de mon processeur. Dans mes données, j'ai environ 45 fonctionnalités et la tâche consiste à prédire environ 20 colonnes avec des données binaires (booléennes). La métrique est la précision moyenne moyenne (carte @ 7). Si vous avez un court exemple de code à partager, ce serait formidable.
Il y a deux façons de procéder, dont l'une que vous avez déjà suggérée:
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
s'adaptera à un classificateur binaire par classe, et il utilisera le nombre de cœurs que vous spécifiez dans params
(fyi, vous pouvez également spécifier n_jobs
dans OneVsRestClassifier
, mais cela consomme plus de mémoire).
2. Si vous commencez par masser un peu vos données en créant k
des copies de chaque point de données qui a k
étiquettes correctes, vous pouvez pirater votre chemin vers un problème multiclasse plus simple. À ce stade, juste
clf = XGBClassifier(**params)
clf.fit(train_data)
pred_proba = clf.predict_proba(test_data)
pour obtenir des marges/probabilités de classification pour chaque classe et décider du seuil que vous souhaitez pour prédire une étiquette. Notez que cette solution n'est pas exacte: si un produit a des balises (1, 2, 3)
, vous introduisez artificiellement deux échantillons négatifs pour chaque classe.
Vous pouvez ajouter une étiquette à chaque classe que vous souhaitez prévoir. par exemple si ce sont vos données:
X1 X2 X3 X4 Y1 Y2 Y3
1 3 4 6 7 8 9
2 5 5 5 5 3 2
Vous pouvez simplement remodeler vos données en ajoutant une étiquette à l'entrée, en fonction de la sortie, et xgboost devrait apprendre à les traiter en conséquence, comme ceci:
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
De cette façon, vous aurez un Y à une dimension, mais vous pouvez toujours prédire de nombreuses étiquettes.