1

У меня есть несколько алгоритмов, которые решают задачу двоичной классификации (с ответом 0 или 1), назначая каждому наблюдению вероятность того, что целевое значение равно 1. Все алгоритмы пытаются свести к минимуму log loss function где N - количество наблюдений, y_i - фактическое целевое значение, а p_i - вероятность 1, предсказанная алгоритмом. Вот некоторые R код с данными выборки:Объединение алгоритмов двоичной классификации

actual.response = c(1,0,0,0,1) 
prediction.df = data.frame(
    method1 = c(0.5080349,0.5155535,0.5338271,0.4434838,0.5002529), 
    method2 = c(0.5229466,0.5298336,0.5360780,0.4217748,0.4998602), 
    method3 = c(0.5175378,0.5157711,0.5133765,0.4372109,0.5215695), 
    method4 = c(0.5155535,0.5094510,0.5201827,0.4351625,0.5069823) 
) 

log.loss = colSums(-1/length(actual.response)*(actual.response*log(prediction.df)+(1-actual.response)*log(1-prediction.df))) 

Пример кода дает потерю журнала для каждого алгоритма:

method1 method3 method2 method4 
0.6887705 0.6659796 0.6824404 0.6719181 

Теперь я хочу, чтобы объединить это алгоритмы, так что я могу свести к минимуму потери журнала еще больше , Есть ли какой-либо пакет R, который может сделать это для меня? Я буду признателен за ссылки на любые алгоритмы, статьи, книги или исследовательские работы, которые решают эту проблему. Обратите внимание, что в качестве конечного результата я хочу предсказать вероятности каждого класса и отметить простые 0,1 ответы.

ответ

2

Это называется ensemble learning (Wikipedia).

проверить эту статью: "an intro to ensemble learning in r."

Вот пример, который я сделал с помощью Cornell movie review data, который можно загрузить, нажав на ссылку. Я использовал набор данных с 1000 положительными и 1000 отрицательными отзывами. После того, как вы получите данные в R:

library(RTextTools) 
library(tm) 
library(glmnet) 
library(ipred) 
library(randomForest) 
library(data.table) 

## create a column of sentiment score. 0 for negative and 1 for   
## positive. 

text_neg$pos_neg<-rep(0,1000) 
text_pos$pos_neg<-rep(1,1000) 

## Combine into 1 data.table and rename. 

text_all<-rbind(text_neg, text_pos) 
##dont forget to shuffle 
set.seed(26) 
text2<-text_all[sample(nrow(text_all)),] 
## turn the data.frame into a document term matrix. This uses the handy 
##RTextTools wrappers and functions. 

doc_matrix <- create_matrix(text2$V1, language="english", 
removeNumbers=TRUE, stemWords=TRUE, removeSparseTerms=.98) 
ncol(data.frame(as.matrix(doc_matrix))) 

## 2200 variables at .98 sparsity. runs pretty slow... 
## create a container with the very nice RTextTools package 

container <- create_container(doc_matrix, text2$pos_neg, 
trainSize=1:1700, testSize=1701:2000, virgin=FALSE) 

## train the data 
time_glm<-system.time(GLMNET <- train_model(container,"GLMNET"));  
time_glm #1.19 
time_slda<-system.time(SLDA <- train_model(container,"SLDA")); 
time_slda #45.03 
time_bag<-system.time(BAGGING <- train_model(container,"BAGGING")); 
time_bag #59.24 
time_rf<-system.time(RF <- train_model(container,"RF")); time_rf #69.59 

## classify with the models 
GLMNET_CLASSIFY <- classify_model(container, GLMNET) 
SLDA_CLASSIFY <- classify_model(container, SLDA) 
BAGGING_CLASSIFY <- classify_model(container, BAGGING) 
RF_CLASSIFY <- classify_model(container, RF) 

## summarize results 
analytics <- create_analytics(container,cbind(SLDA_CLASSIFY, 
BAGGING_CLASSIFY,RF_CLASSIFY, GLMNET_CLASSIFY)) 

summary(analytics) 

Это побежало ансамбль классификаторов с использованием 4 различных методов (случайные лесов, GLM, SLD и отбор в газосборном). Ансамбль Резюме в конце показывает

# ENSEMBLE SUMMARY 
# 
# n-ENSEMBLE COVERAGE n-ENSEMBLE  RECALL 
# n >= 1    1.00    0.86 
# n >= 2    1.00    0.86 
# n >= 3    0.89    0.89 
# n >= 4    0.63    0.96 

, что если все 4 метода согласован, если обзор был положительным или отрицательным, то ансамбль имел скорость повторного вызова 96%. Но будьте осторожны, потому что с бинарным результатом (2 варианта) и 4-мя различными алгоритмами обязательно будет много согласия.

Дополнительную информацию см. В документации RTextTools. Они также делают почти идентичный пример с данными Конгресса США, которые я более или менее имитировал в приведенном выше примере.

Надеюсь, это было полезно.

Смежные вопросы