4

これが私の問題の例です

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

nfoldを実行して、分類器の適切な精度を取得します。

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検証方法を使用して適切な精度を取得できないことです。

4

1 に答える 1

5

あなたは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()は正しい交差検定を提供します。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()ます。

于 2010-10-06T14:11:27.293 に答える