web-dev-qa-db-fra.com

Comment effectuer une validation aléatoire forestière / croisée dans R

Je ne parviens pas à trouver un moyen d'effectuer une validation croisée sur un modèle de forêt aléatoire de régression que j'essaie de produire.

J'ai donc un ensemble de données contenant 1664 variables explicatives (différentes propriétés chimiques), avec une variable de réponse (temps de rétention). J'essaie de produire un modèle de forêt aléatoire de régression afin de pouvoir prédire les propriétés chimiques de quelque chose compte tenu de son temps de rétention.

ID  RT (seconds)    1_MW    2_AMW   3_Sv    4_Se
4281    38  145.29  5.01    14.76   28.37
4952    40  132.19  6.29    11  21.28
4823    41  176.21  7.34    12.9    24.92
3840    41  174.24  6.7 13.99   26.48
3665    42  240.34  9.24    15.2    27.08
3591    42  161.23  6.2 13.71   26.27
3659    42  146.22  6.09    12.6    24.16

Ceci est un exemple du tableau que j'ai. Je veux essentiellement tracer RT contre 1_MW, etc. (jusqu'à 1664 variables), afin que je puisse trouver lesquelles de ces variables sont importantes et lesquelles ne le sont pas.

Je fais:-

r = randomForest(RT..seconds.~., data = cadets, importance =TRUE, do.trace = 100)
varImpPlot(r)

ce qui me dit quelles variables sont importantes et ce qui ne l'est pas, ce qui est génial. Cependant, je veux pouvoir partitionner mon jeu de données afin de pouvoir effectuer une validation croisée sur celui-ci. J'ai trouvé un tutoriel en ligne qui expliquait comment le faire, mais pour un modèle de classification plutôt que pour la régression.

Je comprends que vous: -

k = 10
n = floor(nrow(cadets)/k)
i = 1
s1 = ((i-1) * n+1)
s2 = (i * n)
subset = s1:s2

pour définir le nombre de plis croisés que vous voulez faire, et la taille de chaque pli, et pour définir la valeur de début et de fin du sous-ensemble. Cependant, je ne sais pas quoi faire ici après. On m'a dit de passer en revue, mais honnêtement, je n'ai aucune idée de la façon de procéder. Je ne sais pas non plus comment tracer ensuite l'ensemble de validation et l'ensemble de test sur le même graphique pour représenter le niveau de précision/erreur.

Si vous pouviez m'aider, je vous serais très reconnaissant, merci!

17
user2062207

De la source :

Estimation de l'erreur hors sac (oob)

Dans les forêts aléatoires, il n'est pas nécessaire de procéder à une validation croisée ou à un ensemble de tests séparé pour obtenir une estimation non biaisée de l'erreur de l'ensemble de tests. Il est estimé en interne, pendant la course ...

En particulier, predict.randomForest renvoie la prédiction hors sac si newdata n'est pas donné.

31
topchef

Comme topchef souligné , la validation croisée n'est pas nécessaire pour se prémunir contre le sur-ajustement. Il s'agit d'une fonctionnalité intéressante de l'algorithme de forêt aléatoire.

Il semble que votre objectif soit la sélection des fonctionnalités, la validation croisée est toujours utile à cet effet. Jetez un œil à la fonction rfcv() dans le package randomForest. La documentation spécifie l'entrée d'un bloc de données et d'un vecteur, je vais donc commencer par créer ceux-ci avec vos données.

set.seed(42)
x <- cadets
x$RT..seconds. <- NULL
y <- cadets$RT..seconds.

rf.cv <- rfcv(x, y, cv.fold=10)

with(rf.cv, plot(n.var, error.cv))
11
Lenwood