Используя R и Weka. Как я могу использовать метаалгоритмы наряду с методом NFOLD оценки?

StackOverflow https://stackoverflow.com/questions/3871473

Вопрос

Вот пример моей проблемы

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() дает вам правильную поперекварительство. Ни для 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() от пакета Randomfort. Это собирает набор оптимальных деревьев на основе перекрестности. Он может быть использован в сочетании с пакетом Rweka.

Редактировать: исправленный код для истинной перекрестности. С использованием subset аргумент имеет эффект в evaluate_Weka_classifier() также.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top