簡體   English   中英

使用r和weka。如何使用元算法和nfold評估方法?

[英]Using r and weka. How can I use meta-algorithms along with nfold evaluation method?

這是我的問題的一個例子

library(RWeka)
iris <- read.arff("iris.arff")

執行nfolds以獲得分類器的正確准確度。

m<-J48(class~., data=iris)
e<-evaluate_Weka_classifier(m,numFolds = 5)
summary(e)

這里提供的結果是通過使用部分數據集構建模型並使用另一部分進行測試獲得的,因此可以提供准確的精度

現在我執行AdaBoost來優化分類器的參數

m2 <- AdaBoostM1(class ~. , data = temp ,control = Weka_control(W = list(J48, M = 30)))
summary(m2)

這里提供的結果是通過使用相同的數據集來構建模型以及用於評估模型的相同數據集獲得的,因此精度不能代表我們使用模型評估其他實例的實際精度。 然而,此過程有助於優化構建的模型。

主要問題是我無法優化構建的模型,同時使用未用於構建模型的數據對其進行測試,或者僅使用nfold驗證方法來獲得正確的精度。

我猜你誤解了evaluate_Weka_classifier的功能。 在這兩種情況下,evaluate_Weka_classifier僅根據訓練數據進行交叉驗證。 它不會改變模型本身。 比較以下代碼的混淆矩陣:

m<-J48(Species~., data=iris)
e<-evaluate_Weka_classifier(m,numFolds = 5)
summary(m)
e


m2 <- AdaBoostM1(Species ~. , data = iris ,
       control = Weka_control(W = list(J48, M = 30)))
e2 <- evaluate_Weka_classifier(m2,numFolds = 5)
summary(m2)
e2

在這兩種情況下,摘要都會根據訓練數據為您提供evaluate_Weka_classifier() ,而evaluate_Weka_classifier()函數會為您提供正確的交叉驗證。 對於J48和AdaBoostM1,模型本身都不會根據交叉驗證進行更新。

現在關於AdaBoost算法本身:事實上,它確實使用某種“加權交叉驗證”來得出最終的分類器。 在下一個構建步驟中,錯誤分類的項目被賦予更多權重,但是對於所有觀察,使用相同的權重進行評估。 因此,使用交叉驗證來優化結果並不真正符合自適應增強算法背后的一般思路。

如果您希望使用訓練集和評估集進行真正的交叉驗證,則可以執行以下操作:

id <- sample(1:length(iris$Species),length(iris$Species)*0.5)
m3 <- AdaBoostM1(Species ~. , data = iris[id,] ,
      control = Weka_control(W = list(J48, M=5)))

e3 <- evaluate_Weka_classifier(m3,numFolds = 5)
# true crossvalidation
e4 <- evaluate_Weka_classifier(m3,newdata=iris[-id,])

summary(m3)
e3
e4

如果您想要一個基於交叉驗證更新的模型,您將不得不使用其他算法,例如randomForest包中的randomForest() 它基於交叉驗證收集一組最佳樹。 它也可以與RWeka包一起使用。

編輯:更正的代碼以進行真正的交叉驗證。 使用subset參數也會在evaluate_Weka_classifier()生效。

暫無
暫無

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

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