我试图通过修改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条目。它看起来是这样的:
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曲线。这些代码如下所示:
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包)。我对model命令以及predictor向量进行了必要的相应更改(我希望如此),但我得到了一个错误,即它没有读取我的数据集。
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“,所以我猜它没有捕获数据……
任何帮助都是非常感谢的。谢谢!
发布于 2014-04-11 06:22:23
您可能会遇到与因子变量Insp的离散性质相关的解析错误。看一下这个问题,看看建议的修复方法是否也适用于您的gbm实验:data error in BMA package's bic.glm but not glm
相关:您能说明一下您使用的是哪些版本的base R和包吗?
https://stackoverflow.com/questions/16513646
复制相似问题