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

时间:2013-11-04 01:01:20

标签: r random-forest cross-validation

我无法找到一种在我试图生成的回归随机森林模型上执行交叉验证的方法。

所以我有一个包含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

定义您想要做多少交叉折叠,以及每个折叠的大小,以及设置子集的起始和结束值。但是,我不知道以后要做什么。我被告知要循环,但老实说我不知道​​该怎么做。我也不知道如何将验证集和测试集绘制到同一图表上以描绘准确度/误差水平。

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

3 个答案:

答案 0 :(得分:30)

来自source

  

包外(oob)错误估算值

     

在随机森林中,不需要交叉验证或单独进行   测试集以获得测试集错误的无偏估计。它是   在运行期间内部估计...

特别是,如果未给出predict.randomForest,则newdata会返回包外预测。

答案 1 :(得分:11)

作为topchef pointed out,交叉验证不是防止过度拟合的必要条件。这是随机森林算法的一个很好的特性。

听起来您的目标是功能选择,交叉验证仍然可用于此目的。查看randomForest包中的rfcv()函数。文档指定数据框的输入和&矢量,所以我将从创建数据开始。

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))

答案 2 :(得分:-3)

使用scikit-learn库(http://scikit-learn.org/stable/modules/cross_validation.html),这在Python中实际上更快,也更容易实现。您可以进行K折叠验证,分层K折叠(确保类在每个折叠中均匀分布),留下一个,以及其他。

生成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)