2013-11-04 38 views
15

我無法找到在我嘗試生成的迴歸隨機森林模型上執行交叉驗證的方法。如何在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 

來定義你要多少交叉褶皺做的,每個折的大小,並設置子集的起點和終點值。但是,我不知道在這裏做什麼。我被告知要循環但我真的不知道如何做到這一點。我也不知道如何將驗證集合和測試集合繪製到同一個圖表上來描述準確性/錯誤的水平。

如果你可以請幫助我,我會永遠感激,謝謝!

+0

如果您仍然對R中的CV感興趣,至少有一對:[caret](http://cran.r-project.org/web/packages/caret/caret.pdf)和[cvTools ](http://cran.r-project.org/web/packages/cvTools/cvTools.pdf) – topchef

回答

0

這實際上比使用scikit-learn庫(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) 
+5

這怎麼可能是被接受的答案,用戶使用R問了一個答案,你用Python回答.... –

28

source

的外的袋(OOB)誤差估計

在隨機森林,就沒有必要對交叉驗證或單獨 測試設置爲獲得測試集錯誤的無偏估計。據 在運行過程中的內部估計,...

尤其predict.randomForest返回了球袋預測,如果沒有給出newdata

10

由於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

這個函數真的在做交叉驗證嗎?它是不是顯示與所用變量的數量有關的錯誤? – marbel