calculé manuellement ne correspond pas à randomForest () pour tester de nouvelles données

38

Je sais que cette question est assez spécifique R, mais je pense peut-être à la variance des proportions expliquée, , de manière incorrecte. Voici.R2

J'essaie d'utiliser le Rpaquet randomForest. J'ai des données d'entraînement et des données de test. Lorsque j'adapte un modèle de forêt aléatoire, la randomForestfonction vous permet de saisir de nouvelles données de test à tester. Il vous indique ensuite le pourcentage de variance expliqué dans ces nouvelles données. Quand je regarde cela, je reçois un numéro.

Lorsque j'utilise la predict()fonction pour prédire la valeur de résultat des données de test en fonction du modèle ajusté à partir des données d'apprentissage, et que je prends le coefficient de corrélation au carré entre ces valeurs et les valeurs de résultat réelles pour les données de test, j'obtiens un nombre différent. Ces valeurs ne correspondent pas .

Voici du Rcode pour illustrer le problème.

# 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])
Stephen Turner
la source

Réponses:

52

La raison pour laquelle les valeurs ne correspondent pas, c'est parce que la variation de déclaration est expliquée par opposition à la variance . Je pense que ceci est un malentendu courant au sujet de la R 2 qui se perpétue dans les manuels scolaires. J'ai même mentionné cela sur un autre fil, l'autre jour. Si vous voulez un exemple, voir le manuel (sinon très bon) Seber et Lee, Linear Regression Analysis , 2nd. ed.R2randomForestR2

R2

R2=1i(yiy^i)2i(yiy¯)2.

En d’autres termes, nous calculons l’erreur quadratique moyenne, nous la divisons par la variance des observations initiales, puis nous la soustrayons de l’une. (Notez que si vos prédictions sont vraiment mauvaises, cette valeur peut devenir négative.)

y^iy¯yy^y^

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

L' randomForestappel utilise la première définition, donc si vous faites

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

vous verrez que les réponses correspondent.

cardinal
la source
1
R2
(+1) Réponse très élégante, en effet.
chl
@mpiktas, @chl, je vais essayer de développer cela un peu plus tard aujourd'hui. Fondamentalement, il existe un lien étroit (mais peut-être légèrement caché) avec le test d'hypothèse en arrière-plan. Même dans un paramètre de régression linéaire, si le vecteur constant ne se trouve pas dans l'espace des colonnes de la matrice de conception, la définition de "corrélation" échouera.
cardinal
Si vous avez une référence autre que le manuel Seber / Lee (qui ne m'est pas accessible), j'aimerais voir une bonne explication de la façon dont la variation expliquée (1-SSerr / SStot) diffère du coefficient de corrélation au carré ou de la variance expliquée. Merci encore pour le conseil.
Stephen Turner
Si la valeur R-carré est négative par rapport aux résultats de la régression par variable instrumentale, existe-t-il un moyen de supprimer cette valeur négative et de la traduire en une valeur positive aux fins de la déclaration? Consultez ce lien à l' adresse suivante
Eric