web-dev-qa-db-fra.com

Boost Xg pour la classification multi-étiquettes?

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.

15
user3318023

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.

7
marco_ccc

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.

2
Binyamin Even