Используя r и weka. Как я могу использовать мета-алгоритмы вместе с методом оценки nfold? - PullRequest
4 голосов
/ 06 октября 2010

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

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 для получения правильной точности.

1 Ответ

5 голосов
/ 06 октября 2010

Полагаю, вы неверно истолковали функцию valu_Weka_classifier. В обоих случаяхvalu_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.

edit: исправлен код для истинного перекрестного подтверждения. Использование аргумента subset влияет и на evaluate_Weka_classifier().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...