簡體   English   中英

如何在R中執行隨機森林/交叉驗證

[英]How to perform random forest/cross validation in 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

定義要執行的交叉折疊的數量,每個折疊的大小,以及設置子集的起始值和結束值。 但是,我不知道以后要做什么。 我被告知要循環,但老實說我不知道​​該怎么做。 我也不知道如何將驗證集和測試集繪制到同一圖表上以描繪准確度/錯誤的級別。

如果你能幫助我,我會非常感激,謝謝!

來源

out of of-bag(oob)錯誤估計

在隨機森林中,不需要交叉驗證或單獨的測試集來獲得測試集錯誤的無偏估計。 在運行期間內部估計......

特別是,如果沒有給出newdatapredict.randomForest將返回袋外預測。

正如topchef 指出的那樣 ,交叉驗證不是防止過度擬合的必要條件。 這是隨機森林算法的一個很好的特性。

聽起來您的目標是功能選擇,交叉驗證仍然可用於此目的。 看一下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))

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM