mtext - Cómo realizar la validación aleatoria de bosque/cruz en R
plot title r (3)
No puedo encontrar una manera de realizar la validación cruzada en un modelo de bosque aleatorio de regresión que estoy tratando de producir.
Así que tengo un conjunto de datos que contiene 1664 variables explicativas (diferentes propiedades químicas), con una variable de respuesta (tiempo de retención). Estoy tratando de producir un modelo de bosque aleatorio de regresión para poder predecir las propiedades químicas de algo dado su tiempo de retención.
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
Este es un ejemplo de la tabla que tengo. Básicamente, quiero trazar RT contra 1_MW, etc. (hasta 1664 variables), por lo que puedo encontrar cuáles de estas variables son importantes y cuáles no.
Hago:-
r = randomForest(RT..seconds.~., data = cadets, importance =TRUE, do.trace = 100)
varImpPlot(r)
lo que me dice qué variables son importantes y cuáles no, lo que es genial. Sin embargo, quiero poder particionar mi conjunto de datos para poder realizar una validación cruzada en él. Encontré un tutorial en línea que explicaba cómo hacerlo, pero para un modelo de clasificación en lugar de una regresión.
Entiendo que lo haces: -
k = 10
n = floor(nrow(cadets)/k)
i = 1
s1 = ((i-1) * n+1)
s2 = (i * n)
subset = s1:s2
para definir cuántos pliegues cruzados desea hacer, y el tamaño de cada pliegue, y para establecer el valor inicial y final del subconjunto. Sin embargo, no sé qué hacer aquí después. Me dijeron que pasara pero honestamente no tengo idea de cómo hacer esto. Tampoco sé cómo trazar el conjunto de validación y el conjunto de prueba en el mismo gráfico para representar el nivel de precisión / error.
Si pudiera ayudarme con esto, estaría muy agradecido, ¡gracias!
Como señaló topchef, la validación cruzada no es necesaria como una protección contra el ajuste excesivo. Esta es una buena característica del algoritmo de bosque aleatorio.
Parece que su objetivo es la selección de características, la validación cruzada sigue siendo útil para este propósito. Eche un vistazo a la función rfcv()
dentro del paquete randomForest. La documentación especifica la entrada de un marco de datos y un vector, por lo que comenzaré por crearlos con sus datos.
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))
De la source :
La estimación de error de out-of-bag (oob)
En los bosques aleatorios, no es necesario realizar una validación cruzada o un conjunto de prueba separado para obtener una estimación imparcial del error del conjunto de prueba. Se estima internamente, durante la carrera ...
En particular, predict.randomForest
devuelve la predicción fuera de bolsa si no se proporcionan newdata
.
Esto es realmente más rápido y bastante fácil de hacer en Python utilizando la biblioteca scikit-learn ( http://scikit-learn.org/stable/modules/cross_validation.html ). Puede realizar la validación de K-fold, K-pliegue estratificado (lo que garantiza que las clases se distribuyan equitativamente en cada uno de los pliegues), omitir uno y otros.
También es muy fácil generar la curva ROC, las características de las características y otras métricas de evaluación.
Aquí hay un ejemplo rápido:
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)