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!
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)
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é.
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))