结合二进制分类算法

时间:2016-06-05 22:45:31

标签: r algorithm machine-learning classification ensemble-learning

我有几种算法通过为每个观察值分配目标值等于1的概率来解决二进制分类(响应0或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响应。

1 个答案:

答案 0 :(得分:3)

这称为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文档。他们也与美国国会的数据做了几乎相同的例子,我在上面的例子中或多或少地模仿了这些数据。

希望这有用。