Comment prédire les probabilités dans xgboost?

16

La fonction de prédiction ci-dessous donne également des valeurs -ve, il ne peut donc pas s'agir de probabilités.

param <- list(max.depth = 5, eta = 0.01,  objective="binary:logistic",subsample=0.9)
bst <- xgboost(param, data = x_mat, label = y_mat,nround = 3000)

pred_s <- predict(bst, x_mat_s2)

J'ai google et essayé pred_s <- predict(bst, x_mat_s2,type="response") mais cela n'a pas fonctionné.

Question

Comment prédire les probabilités à la place?

GeorgeOfTheRF
la source
Ne génère-t-il pas les probabilités par défaut avec les paramètres que vous avez utilisés? Je veux dire: avez-vous examiné les pred_s et vous êtes certain que ce ne sont pas des probabilités?
kpb
Pas de valeurs négatives. La probabilité devrait varier entre 0 et 1.
GeorgeOfTheRF
Je ne vois aucun problème évident. (Bien que je sois plus familier avec le wrapper python). Avez-vous essayé d'ajouter outputmargin=Fà la predictfonction? Si la valeur outputmarginest définie sur T, elle renverra la valeur avant la transformation logistique.
inversion du
1
Pour Python, vous pouvez copier l' predict_probaimplémentation à partir de l' sklearnAPI: github.com/dmlc/xgboost/blob/master/python-package/xgboost/…
Anton Tarasenko

Réponses:

14

Je sais que je suis un peu en retard, mais pour obtenir des probabilités de xgboostvotre part, spécifiez un multi:softmaxobjectif comme celui-ci:

xgboost(param, data = x_mat, label = y_mat,nround = 3000, objective='multi:softprob')

Du ?xgb.train:

multi: softprob identique à softmax, mais génère un vecteur de ndata * nclass, qui peut être remodelé en ndata, nclass matrix. Le résultat contient les probabilités prédites de chaque point de données appartenant à chaque classe.

cyberj0g
la source
2
Merci. En quoi cette fonction de perte est-elle différente du binaire: logistique pour la classification binaire?
GeorgeOfTheRF du
3
C'est juste une généralisation de la fonction logistique pour le cas multi-classe, ne devrait pas faire de différence significative.
cyberj0g
14

Utilisez simplement predict_probaau lieu de predict. Vous pouvez laisser l'objectif comme binary:logistic.

ihadanny
la source
3
S'il s'agissait de Python et non de R, cette réponse pourrait être judicieuse. Mauvaise langue.
B_Miner du
1
Oups! merci @B_Miner. Je ne supprime pas cette réponse car cela pourrait être utile pour d'autres qui commettront la même erreur et penseront que nous parlons de python ..
ihadanny
Pour moi, cela ne fait pas l'affaire datascience.stackexchange.com/questions/14527/…
Georg Heiler
4
xgboost n'a pas de fonction predict_proba
Ashoka Lella
1
Le classificateur XGBoost possède une option Predict_Proba xgboost.readthedocs.io/en/latest/python/python_api.html
Paul Bendevis
0

après la prédiction

pred_s <- predict(bst, x_mat_s2)

vous pouvez obtenir la probabilité en

pred_s$data

S'il s'agit d'une classification binaire, alors pred_s$datainclut prob.0, prob.1, response.

Vous pouvez donc obtenir prob.1 en

pred_s$data$prob.1
Dera
la source