calcolato manualmente non corrisponde a randomForest ()


38

So che questa è una Rdomanda abbastanza specifica , ma potrei pensare alla varianza della proporzione spiegata, , in modo errato. Ecco qui.R2

Sto cercando di usare il Rpacchetto randomForest. Ho alcuni dati di allenamento e dati di test. Quando inserisco un modello di foresta casuale, la randomForestfunzione consente di inserire nuovi dati di test da testare. Ti dice quindi la percentuale di varianza spiegata in questi nuovi dati. Quando guardo questo, ottengo un numero.

Quando utilizzo la predict()funzione per prevedere il valore di risultato dei dati di test in base all'adattamento del modello dai dati di allenamento e prendo il coefficiente di correlazione al quadrato tra questi valori e i valori di risultato effettivi per i dati di test, ottengo un numero diverso. Questi valori non corrispondono .

Ecco del Rcodice per dimostrare il problema.

# use the built in iris data
data(iris)

#load the randomForest library
library(randomForest)

# split the data into training and testing sets
index <- 1:nrow(iris)
trainindex <- sample(index, trunc(length(index)/2))
trainset <- iris[trainindex, ]
testset <- iris[-trainindex, ]

# fit a model to the training set (column 1, Sepal.Length, will be the outcome)
set.seed(42)
model <- randomForest(x=trainset[ ,-1],y=trainset[ ,1])

# predict values for the testing set (the first column is the outcome, leave it out)
predicted <- predict(model, testset[ ,-1])

# what's the squared correlation coefficient between predicted and actual values?
cor(predicted, testset[, 1])^2

# now, refit the model using built-in x.test and y.test
set.seed(42)
randomForest(x=trainset[ ,-1], y=trainset[ ,1], xtest=testset[ ,-1], ytest=testset[ ,1])

Risposte:


52

La ragione per cui i valori di non corrispondono è perché viene spiegata la variazione del rapporto anziché la varianza . Penso che questo sia un malinteso comune su R 2 che si perpetua nei libri di testo. L'ho anche menzionato su un altro thread l'altro giorno. Se vuoi un esempio, vedi il manuale (altrimenti abbastanza buono) Seber and Lee, Linear Regression Analysis , 2nd. ed.R2randomForestR2

Una definizione generale è R 2 = 1 - Σ i ( y i - y i ) 2R2

R2=1-Σio(yio-y^io)2Σio(yio-y¯)2.

Cioè, calcoliamo l'errore quadratico medio, lo dividiamo per la varianza delle osservazioni originali e quindi sottraggiamo questo da uno. (Nota che se le tue previsioni sono davvero pessime, questo valore può diventare negativo.)

y^ioy¯y-y^y^

RLR2=Corr(y,y^)2.
LRRLR2

La randomForestchiamata utilizza la prima definizione, quindi se lo fai

   > y <- testset[,1]
   > 1 - sum((y-predicted)^2)/sum((y-mean(y))^2)

vedrai che le risposte corrispondono.


1
R2

(+1) Risposta molto elegante, davvero.
chl

@mpiktas, @chl, cercherò di approfondire questo più tardi oggi. Fondamentalmente, c'è una stretta (ma, forse, leggermente nascosta) connessione al test delle ipotesi in background. Anche in un'impostazione di regressione lineare, se il vettore costante non si trova nello spazio della colonna della matrice di progettazione, la definizione di "correlazione" avrà esito negativo.
cardinale il

Se hai un riferimento diverso dal libro di testo di Seber / Lee (non accessibile a me), mi piacerebbe vedere una buona spiegazione di come la variazione spiegata (cioè 1-SSerr / SStot) differisce dal coefficiente di correlazione al quadrato o spiegazione della varianza. Grazie ancora per il suggerimento.
Stephen Turner,

Se il valore R al quadrato è negativo dai risultati di regressione della variabile strumentale, c'è un modo per sopprimere questo valore negativo e tradurlo in un valore positivo per motivi di rendicontazione? Fare riferimento a questo link per favore: stata.com/support/faqs/statistics/two-stage-least-squares
Eric
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.