0

我试图通过修改 Torgo 的“Data Mining with R”第 4 章中的代码,使用 AdaBoost 和梯度提升(分别为包 ada 和 gbm)在 R 中生成一组精度/响应曲线。示例代码在这里:http ://www.dcc.fc.up.pt/~ltorgo/DataMiningWithR/code4.html 。

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

谢谢

gh

编辑:

这是我正在尝试的:

该数据是一组销售数据,我试图在其上构建几个监督学习模型。响应变量是“Insp”,它具有三个值 - unkn、ok 和欺诈。在继续之前,所有 unkn 条目都会从数据集中删除。它看起来像这样:

      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

该代码提供了两个有效的监督学习示例,Naive Bayes 和 AdaBoostM1,实现了一个保留例程以进行交叉验证。最终输出是一条 PR 曲线。这些代码如下:

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:

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)。我对模型命令以及预测向量进行了必要的相应更改(我希望是),但我收到一个错误,即它没有读取我的数据集。

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 将返回一个错误,指出“terms.formula(formula, data = data) 中的错误:'。' 在公式中,没有“数据”参数”,所以我想它没有捕捉到数据......

任何帮助表示赞赏。谢谢!

4

1 回答 1

0

您可能遇到与因子变量的离散性质相关的解析错误Insp。看看这个问题,看看建议的修复是否也适用于您的 gbm 实验: BMA 包的 bic.glm 但不是 glm 中的数据错误

相关:您能否澄清您正在使用哪些版本的基本 R 和软件包?

于 2014-04-10T22:22:22.923 回答