簡體   English   中英

可能過度擬合的分類樹,但預測誤差穩定

[英]Possibly overfitted classification tree but with stable prediction error

我對rpart和過度擬合有疑問。 我的目標只是在預測上做得好。 我的數據集很大,幾乎是20000點。 使用約2.5%的點作為訓練,我得到約50%的預測誤差。 但是使用97.5%的數據作為訓練,我得到了大約30%。 由於我在訓練中使用了大量數據,因此我認為存在過度擬合的風險。

我使用隨機訓練/測試數據+修剪樹運行了1000次,如果我正確理解它的話,這是一種交叉驗證,並且我得到的結果非常穩定(相同的預測誤差和變量的重要性)。

即使我已經運行1000次並且預測誤差是穩定的,過度擬合仍然會是一個問題嗎?

我還對我的解釋變量之間的相關性有疑問。 這在CART中是否會成為問題(與回歸一樣)? 在回歸中,我可能會使用套索嘗試修正相關性。 如何修復與分類樹的相關性?

當我繪制cptree時,我得到此圖:

cptree圖

這是我正在運行的代碼(我已經用不同的隨機分割重復了1000次)。

set.seed(1) # For reproducability
train_frac = 0.975
n = dim(beijing_data)[1]

# Split into training and testing data
ii = sample(seq(1,dim(beijing_data)[1]),n*train_frac)
data_train = beijing_data[ii,]
data_test = beijing_data[-ii,]

fit = rpart(as.factor(PM_Dongsi_levels)~DEWP+HUMI+PRES+TEMP+Iws+
              precipitation+Iprec+wind_dir+tod+pom+weekend+month+
              season+year+day,
            data = data_train, minsplit = 0, cp = 0)

plotcp(fit)

# Find the split with minimum CP and prune the tree
cp_fit = fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"]
pfit = prune(fit, cp = cp_fit)
pp <- predict(pfit, newdata = data_test, type = "class")

err = sum(data_test[,"PM_Dongsi_levels"] != pp)/length(pp)
print(err)

鏈接到beijing_data(作為RData文件,以便您可以重現我的示例) https://www.dropbox.com/s/6t3lcj7f7bqfjnt/beijing_data.RData?dl=0

這個問題非常復雜,很難全面回答。 我將嘗試提供一些見識和參考,以供進一步閱讀。

  • 對於基於樹的方法,相關特征不會像使用超平面作為分類邊界的模型那樣嚴重。 當有多個相關特征時,樹將只選擇一個,其余的將被忽略。 但是,相關的特征通常會模糊這種模型的解釋性,蒙版交互作用等。 基於樹的模型也可以從此類變量的刪除中受益,因為它們將不得不搜索較小的空間。 是樹木上的體面資源。 還要檢查這些視頻123ISLR書。

  • 基於一棵樹的模型的性能往往不如基於超平面的方法。 因此,如果您主要對預測質量感興趣,則應基於一堆樹探索模型,例如裝袋模型和增強模型。 R中的套袋和增強的流行實現是randomForestxgboost 兩者都幾乎沒有經驗就可以利用,並且可以帶來良好的預測。 是有關如何使用流行的R機器學習庫插入符號來調整隨機森林的資源。 另一個資源是R mlr庫,它為與ML相關的許多重要事物提供了出色的包裝,例如, 這是一篇有關基於模型的xgboost優化的簡短博客文章

  • 用於模型驗證的重采樣策略隨任務和可用數據的不同而不同。 對於20k行,我可能會使用50%-60%以上的時間進行訓練,使用20%以上的時間進行驗證,並使用20-30%的時間作為測試集。 我將使用50%的測試集,通過重復的K倍交叉驗證(2-3次重復4-5倍或類似)來選擇合適的ML方法,特征,超參數等。 我將使用20%的驗證集微調內容,以了解我在訓練集上的交叉驗證的普遍程度。 當我對一切都感到滿意時,我會使用測試集作為最終證明,我有一個很好的模型。 下面是關於重采樣一些資源: 123嵌套重采樣

在您的情況下,我會使用

z <- caret::createDataPartition(data$y, p = 0.6, list = FALSE)
train <- data[z,]
test <- data[-z,]

分割數據以訓練和測試集,然后我將重復此過程以p = 0.5再次分割測試集。

在火車數據上,我將在隨機森林上使用教程,通過在插入符號和網格搜索中進行5次重復交叉驗證來調整mtryntree參數(擴展插入符號部分)。

control <- trainControl(method = "repeatedcv", number = 5, repeats = 3)

tunegrid <- expand.grid(.mtry = c(1:15), .ntree = c(200, 500, 700, 1000, 1200, 1500))

等等,如上述鏈接中所述。

最后一點,您需要訓練的數據越多,適合的可能性就越小。

暫無
暫無

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

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