Comment effectuer une validation aléatoire de forêt/cross dans R

je suis incapable de 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 (propriétés chimiques différentes), avec une variable de réponse (Temps de rétention). J'essaie de produire un modèle de régression de forêt aléatoire afin de pouvoir prédire les propriétés chimiques de quelque chose étant donné 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 de la table que je avoir. Je veux essentiellement tracer RT contre 1_MW, etc (jusqu'à 1664 variables), de sorte que je peux trouver laquelle de ces variables sont d'importance et qui ne 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 être capable de partitionner mon ensemble de données afin que je puisse effectuer la validation croisée. J'ai trouvé un tutoriel qui explique comment le faire, mais pour un modèle de classification plutôt que de régression.

je comprends que vous faites:-

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

pour définir combien de plis transversaux vous voulez faire, et la taille de chaque plis, et pour définir la valeur de départ et la valeur finale du sous-ensemble. Cependant, je ne sais pas quoi faire après. On m'a dit de faire une boucle par mais honnêtement, je n'ai aucune idée de comment faire cela. Je ne sais comment puis tracer l'ensemble de validation et le test sur le même graphique pour représenter le niveau de l'exactitude ou de l'erreur.

si vous pouviez s'il vous plaît m'aider avec ceci je être très reconnaissante, merci!

16
demandé sur user2062207 2013-11-04 05:01:19

3 réponses

c'est en fait plus rapide ainsi que très facile à faire en Python en utilisant la bibliothèque scikit-learn (http://scikit-learn.org/stable/modules/cross_validation.html). Vous pouvez procéder à la validation de K-fold, de K-fold stratifié (ce qui garantit que les classes sont également réparties dans chacun des plis), en omettre un et d'autres.

il est également très facile de générer la courbe ROC, les importances de fonctionnalités, et d'autres paramètres d'évaluation.

Voici un rapide exemple:

y  = data[1:, 0].astype(np.float)
X  = data[1:, 1:].astype(np.float)
cv = StratifiedKFold(y, n_folds = 5)

precision   = []
accuracy    = []
sensitivity = []
matthews    = []
r2          = []
f1          = []
auroc       = []
cm          = [[0, 0], [0, 0]]

for i, (train, test) in enumerate(cv):
    probas_     = rf.fit(X[train], y[train]).predict_proba(X[test])
    classes     = rf.fit(X[train], y[train]).predict(X[test])
    r2          = np.append(r2, (r2_score(y[test], probas_[:, 1])))
    precision   = np.append(precision, (precision_score(y[test], classes)))
    auroc       = np.append(auroc, (roc_auc_score(y[test], classes)))
    accuracy    = np.append(accuracy, (accuracy_score(y[test], classes)))
    sensitivity = np.append(sensitivity, (recall_score(y[test], classes)))
    f1          = np.append(f1, (f1_score(y[test], classes)))
    matthews    = np.append(matthews, (matthews_corrcoef(y[test], classes)))
    cma         = np.add(cma, (confusion_matrix(y[test], classes)))

cma         = np.array(cma)
r2          = np.array(r2)
precision   = np.array(precision)
accuracy    = np.array(accuracy)
sensitivity = np.array(sensitivity)
f1          = np.array(f1)
auroc       = np.array(auroc)
matthews    = np.array(matthews)

print("KF Accuracy: %0.2f (+/- %0.2f)" % (accuracy.mean(), accuracy.std() * 2))
print("KF Precision: %0.2f (+/- %0.2f)" % (precision.mean(), precision.std() * 2))
print("KF Sensitivity: %0.2f (+/- %0.2f)" % (sensitivity.mean(), sensitivity.std() * 2))
print("KF R^2: %0.2f (+/- %0.2f)" % (r2.mean(), r2.std() * 2))
print("KF F1: %0.2f (+/- %0.2f)" % (f1.mean(), f1.std() * 2))
print("KF AUROC: %0.2f (+/- %0.2f)" % (auroc.mean(), auroc.std() * 2))
print("KF Matthews: %0.2f (+/- %0.2f)" % (matthews.mean(), matthews.std() * 2))
print("Confusion Matrix", cma)
-2
répondu eagle34 2015-10-22 19:09:03

source:

Le hors-de-sac (oob) erreur d'estimation

dans les forêts aléatoires, il n'y a pas besoin de validation croisée ou d'une validation séparée Test set pour obtenir une estimation non biaisée de l'erreur du test set. Il est estimation interne, pendant la course...

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

28
répondu topchef 2013-11-04 03:25:33

Comme topchef souligné, la validation croisée n'est pas nécessaire pour se prémunir contre un ajustement excessif. C'est une caractéristique intéressante de la forêt aléatoire de l'algorithme.

on dirait que votre but est la sélection de fonctionnalités, la validation croisée est toujours utile à cet effet. Jetez un oeil à l' rfcv() fonction dans le paquet randomForest. La Documentation spécifie l'entrée d'une base de données et d'un vecteur, donc je vais commencer par les créer 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))
10
répondu Lenwood 2017-05-23 12:02:11