如何在R中执行随机森林/交叉验证

我无法找到一种在我想要生产的回归随机森林模型上执行交叉验证的方法.

所以我有一个数据集包含1664个解释变量(不同的化学属性),一个响应变量(保留时间).我正在尝试产生一个回归随机森林模型,以便能够预测其保留时间的某些化学性质.

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

这是我拥有的表的一个例子.我想基本上绘制RT对1_MW等(最多1664个变量),所以我可以找到哪些变量是重要的,哪些不是.

我做:-

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

这告诉我哪些变量是重要的,什么不是,哪个是伟大的.但是,我想要分割我的数据集,以便我可以执行交叉验证.我发现一个在线教程解释了如何做,但分类模型而不是回归.

我明白你这样做:

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

定义您想要执行的交叉折叠以及每个折叠的大小,以及设置子集的起始和终止值.但是,我不知道该怎么做.我被告知要循环,但我真的不知道如何做到这一点.我也不知道如何将验证集和测试集映射到同一个图上来描述准确性/错误的级别.

如果你能帮助我,我会非常感激,谢谢!

最佳答案
这实际上更快,并且使用scikit学习库(http://scikit-learn.org/stable/modules/cross_validation.html)在Python中很容易做到.您可以进行K-fold验证,分层的K-fold(这确保了这些类在每个折叠中平均分配),留下一个等等.

生成ROC曲线,功能重要性和其他评估指标也很容易.

以下是一个简单的例子:

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)

转载注明原文:如何在R中执行随机森林/交叉验证 - 代码日志