¿Xg boost para la clasificación multilabel?

¿Es posible usar xgboost para la clasificación multilabel? Ahora uso OneVsRestClassifier sobre GradientBoostingClassifier de sklearn. Funciona, pero usa solo un núcleo de mi CPU. En mis datos tengo ~ 45 características y la tarea es predecir unas 20 columnas con datos binarios (booleanos). La métrica es la media de la precisión (mapa @ 7). Si tienes un pequeño ejemplo de código para compartir, sería genial.

Hay un par de maneras de hacerlo, una de las cuales es la que ya sugirió:

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 se ajustará a un clasificador binario por clase, y utilizará sin embargo muchos de los núcleos que especifique en params (fyi, también puede especificar n_jobs en OneVsRestClassifier , pero eso OneVsRestClassifier más memoria).

2. Si masajea un poco sus datos haciendo k copias de cada punto de datos que tiene k tags correctas, puede abrir un camino hacia un problema multiclase más simple. En ese punto, solo

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

para obtener los márgenes / probabilidades de clasificación para cada clase y decidir qué umbral desea para predecir una etiqueta. Tenga en cuenta que esta solución no es exacta: si un producto tiene tags (1, 2, 3) , introduce artificialmente dos muestras negativas para cada clase.

Puede agregar una etiqueta a cada clase que desee predecir. por ejemplo, si esta es su información:

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

Simplemente puede remodelar sus datos agregando una etiqueta a la entrada, de acuerdo con la salida, y xgboost debería aprender a tratarlos como corresponde:

 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 esta manera, tendrá una Y de una dimensión, pero aún puede predecir muchas tags.