45 votos

Calculado manualmente $R^2$ no coincide con randomForest() $R^2$ para probar nuevos datos

Sé que es un tema bastante específico R pregunta, pero puede que esté pensando en la proporción de la varianza explicada, $R^2$ , incorrectamente. Aquí va.

Estoy tratando de usar el R paquete randomForest . Tengo algunos datos de entrenamiento y datos de prueba. Cuando ajusto un modelo de bosque aleatorio, el randomForest le permite introducir nuevos datos de prueba para comprobar. A continuación, le indica el porcentaje de varianza explicada en estos nuevos datos. Cuando miro esto, obtengo un número.

Cuando uso el predict() para predecir el valor del resultado de los datos de prueba basándose en el ajuste del modelo a partir de los datos de entrenamiento, y tomo el coeficiente de correlación al cuadrado entre estos valores y el actual valores de resultado para los datos de prueba, obtengo un número diferente. Estos valores no coinciden .

Aquí hay algunos R código para demostrar el 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])

68voto

giulio Puntos 166

La razón por la que el $R^2$ los valores no coinciden es porque randomForest está informando variación explicado en contraposición a desviación explicada. Creo que este es un malentendido común sobre $R^2$ que se perpetúa en los libros de texto. Incluso lo mencioné en otro hilo el otro día. Si quieren un ejemplo, vean el libro de texto (por lo demás bastante bueno) de Seber y Lee, Análisis de regresión lineal , 2ª ed.

Una definición general para $R^2$ es $$ R^2 = 1 - \frac{\sum_i (y_i - \hat{y}_i)^2}{\sum_i (y_i - \bar{y})^2} . $$

Es decir, calculamos el error cuadrático medio, lo dividimos por la varianza de las observaciones originales y luego lo restamos de uno. (Tenga en cuenta que si sus predicciones son realmente malas, este valor puede ser negativo).

Ahora bien, lo que ocurre con la regresión lineal ( ¡con un término de intercepción! ) es que el media valor del $\hat{y}_i$ Los partidos de la $\bar{y}$ . Además, el vector residual $y - \hat{y}$ es ortogonal al vector de valores ajustados $\hat{y}$ . Cuando se juntan estas dos cosas, la definición se reduce a la que se encuentra más comúnmente, es decir, $$ R^2_{\mathrm{LR}} = \mathrm{Corr}(y,\hat{y})^2 . $$ (He utilizado los subíndices $\mathrm{LR}$ en $R^2_{\mathrm{LR}}$ para indicar regresión lineal .)

El randomForest está utilizando la primera definición, por lo que si hace

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

verás que las respuestas coinciden.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X