首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boosting方法生成PR曲线

使用boosting方法生成PR曲线
EN

Stack Overflow用户
提问于 2013-05-13 09:12:33
回答 1查看 185关注 0票数 0

我试图通过修改Torgo的“使用R进行数据挖掘”的第4章中的代码,使用AdaBoost和gradient boosting (分别是ada和gbm包)在R中生成一组精度/响应曲线。示例代码如下:http://www.dcc.fc.up.pt/~ltorgo/DataMiningWithR/code4.html

Torgo确实实现了AdaBoost,但是使用了一个不同的包(正如我所说的,我正在尝试使用包ada)。但是,我无法在不返回这样或那样的错误的情况下交换方法。如果任何人有任何见解,将不胜感激。

谢谢

gh

编辑:

这是我正在尝试的:

这些数据是一组销售数据,我正在尝试在这些数据上构建几个有监督的学习模型。响应变量是"Insp“,它有三个值- unkn、ok和欺诈值。在向前移动之前,将从数据集中删除所有unkn条目。它看起来是这样的:

代码语言:javascript
复制
      ID  Prod Quant   Val Insp    Uprice
1         v1    p1   182  1665 unkn  9.148352
2         v2    p1  3072  8780 unkn  2.858073
3         v3    p1 20393 76990 unkn  3.775315
4         v4    p1   112  1100 unkn  9.821429
5         v3    p1  6164 20260 unkn  3.286827
6         v5    p2   104  1155 unkn 11.105769
7         v6    p2   350  5680 unkn 16.228571
411816 v5896 p4127   143  1835 unkn 12.832168
411817 v1796 p4127   102  1445 unkn 14.166667
411818 v2540 p4127   106  1275 unkn 12.028302

代码提供了两个有效的监督学习示例,朴素贝叶斯和AdaBoostM1,实现了一个用于交叉验证的坚持例程。最终输出是PR曲线。这些代码如下所示:

代码语言:javascript
复制
nb <- function(train,test) {
  require(e1071,quietly=T)
  sup <- which(train$Insp != 'unkn')
  data <- train[sup,c('ID','Prod','Uprice','Insp')]
  data$Insp <- factor(data$Insp,levels=c('ok','fraud'))
  model <- naiveBayes(Insp ~ .,data)
  preds <- predict(model,test[,c('ID','Prod','Uprice','Insp')],type='raw')
  return(list(rankOrder=order(preds[,'fraud'],decreasing=T),
             rankScore=preds[,'fraud'])
         )
}


ho.nb <- function(form, train, test, ...) {
  res <- nb(train,test)
  structure(evalOutlierRanking(test,res$rankOrder,...),
            itInfo=list(preds=res$rankScore,
                        trues=ifelse(test$Insp=='fraud',1,0)
                       )
           )
}


nb.res <- holdOut(learner('ho.nb',
                          pars=list(Threshold=0.1,
                                    statsProds=globalStats)),
                  dataset(Insp ~ .,sales),
                  hldSettings(3,0.3,1234,T),
                  itsInfo=TRUE)

summary(nb.res)

AdaBoostM1:

代码语言:javascript
复制
ab <- function(train,test) {
      require(RWeka,quietly=T)
      sup <- which(train$Insp != 'unkn')
      data <- train[sup,c('ID','Prod','Uprice','Insp')]
      data$Insp <- factor(data$Insp,levels=c('ok','fraud'))
      model <- AdaBoostM1(Insp ~ .,data,
                  control=Weka_control(I=100))
      preds <- predict(model,test[,c('ID','Prod','Uprice','Insp')],
               type='probability')
      return(list(rankOrder=order(preds[,'fraud'],decreasing=T),
               rankScore=preds[,'fraud'])
     )
}


  ho.ab <- function(form, train, test, ...) {
      res <- ab(train,test)
      structure(evalOutlierRanking(test,res$rankOrder,...),
            itInfo=list(preds=res$rankScore,
                        trues=ifelse(test$Insp=='fraud',1,0)
                   )
       )
}


ab.res <- holdOut(learner('ho.ab',
                      pars=list(Threshold=0.1,
                                statsProds=globalStats)),
              dataset(Insp ~ .,sales),
              hldSettings(3,0.3,1234,T),
              itsInfo=TRUE
              )


summary(ab.res)

我下一步要做的就是运行同样类型的方法,除了使用梯度提升(gbm包)。我对model命令以及predictor向量进行了必要的相应更改(我希望如此),但我得到了一个错误,即它没有读取我的数据集。

代码语言:javascript
复制
gb <- function(train, test) {
  require(gbm, quietly=T)
  sup <- which(train$Insp != 'unkn')
  data <- train[sup ,c('ID','Prod','Uprice','Insp')]
  data$Insp <- factor(data$Insp,levels=c('ok','fraud'))
  model <- gbm(Insp ~ .,data, n.trees = 100, shrinkage = 1)
  preds <- predict(model,test[,c('ID','Prod','Uprice','Insp')], n.trees = 100, type =             "response")
  return(list(rankOrder=order(preds[,'fraud'],decreasing=T),
          rankScore=preds[,'fraud'])
      )
    }


ho.gb <- function(form, train, test, ...) {
  res <- gb(train,test)
  structure(evalOutlierRanking(test,res$rankOrder,...),
            itInfo=list(preds=res$rankScore,
                        trues=ifelse(test$Insp=='fraud',1,0)
            )
      )
    }


gb.res <- holdOut(learner('ho.gb',
                      pars=list(Threshold=0.1,
                                statsProds=globalStats)),
              dataset(Insp~.,sales),
              hldSettings(3,0.3,1234,T),
              itsInfo=TRUE
)


summary(gb.res)

然而,R将返回一个错误,声明"Error in terms.formula( formula,data = data):‘. in formula and no 'data’argument“,所以我猜它没有捕获数据……

任何帮助都是非常感谢的。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-04-11 06:22:23

您可能会遇到与因子变量Insp的离散性质相关的解析错误。看一下这个问题,看看建议的修复方法是否也适用于您的gbm实验:data error in BMA package's bic.glm but not glm

相关:您能说明一下您使用的是哪些版本的base R和包吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16513646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档