我试图通过修改 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) 中的错误:'。' 在公式中,没有“数据”参数”,所以我想它没有捕捉到数据......
任何帮助表示赞赏。谢谢!