2015-04-05 20 views
9

La mia risposta è una variabile categoriale (alcuni alfabeti), quindi ho usato distribution = 'multinomial' quando ho creato il modello, e ora voglio predire la risposta e ottenere l'output in termini di questi alfabeti, anziché di matrice di probabilità.In gbm multinomial dist, come utilizzare la previsione per ottenere l'output categoriale?

Tuttavia in predict(model, newdata, type='response'), dà probabilità, uguale al risultato di type='link'.

C'è un modo per ottenere uscite categoriali?

BST = gbm(V1~.,data=training,distribution='multinomial',n.trees=2000,interaction.depth=4,cv.folds=5,shrinkage=0.005) 

predBST = predict(BST,newdata=test,type='response') 
+0

ne dite di prendere la risposta che ha la più alta probabilità? –

risposta

21

In predict.gbm documentazione, essa viene menzionata:

Se type = "risposta" poi GBM riconverte alla stessa scala come il risultato . Attualmente l'unico effetto che questo avrà sarà restituire le probabilità di per bernoulli e i conteggi attesi per poisson. Per il altre distribuzioni "risposta" e "link" restituiscono lo stesso.

Che cosa si dovrebbe fare, come suggerisce Domenico, è quello di scegliere la risposta con la più alta probabilità dalla predBST matrice risultante, facendo apply(.., 1, which.max) sull'uscita vettore da previsione. Ecco un esempio di codice con il iris set di dati:

library(gbm) 

data(iris) 

df <- iris[,-c(1)] # remove index 

df <- df[sample(nrow(df)),] # shuffle 

df.train <- df[1:100,] 
df.test <- df[101:150,] 

BST = gbm(Species~.,data=df.train, 
     distribution='multinomial', 
     n.trees=200, 
     interaction.depth=4, 
     #cv.folds=5, 
     shrinkage=0.005) 

predBST = predict(BST,n.trees=200, newdata=df.test,type='response') 

p.predBST <- apply(predBST, 1, which.max) 

> predBST[1:6,,] 
    setosa versicolor virginica 
[1,] 0.89010862 0.05501921 0.05487217 
[2,] 0.09370400 0.45616148 0.45013452 
[3,] 0.05476228 0.05968445 0.88555327 
[4,] 0.05452803 0.06006513 0.88540684 
[5,] 0.05393377 0.06735331 0.87871292 
[6,] 0.05416855 0.06548646 0.88034499 

> head(p.predBST) 
[1] 1 2 3 3 3 3 
+0

Questo è veramente utile, grazie mille! – shavendy

+0

Che ne dici di accettare e/o upvoting della risposta? :-) – desertnaut

+0

sry reputazione troppo bassa per upvote, grazie comunque :) – shavendy