我在火车包中使用火车训练一些c50型号.我设法用C5.0方法做得很好但是当我想使用成本敏感的C50方法时,我很难理解如何调整成本参数.我想要做的是在预测错误的课程时引入费用.我尝试在插入包网站(http://topepo.github.io/caret/index.html)中搜索并阅读这里和那里发现的几本手册/教程.我没有找到有关如何处理成本参数的任何信息.所以这就是我自己尝试的:
使用默认设置运行火车,看看我得到了什么.在输出中,列车功能尝试从0到2的成本,并给出成本= 2的最佳模型.
尝试在expand.grid函数中添加成本作为矩阵,就像使用C5.0包一样.代码如下(试验被推到1,因为我只想在输出中输入一棵树/一套规则)
c50Grid < - expand.grid(.trials = 1,.model = c("tree","rules"),. winnow = c("TRUE","FALSE"),. cost = matrix(c(0,1) ,2,0),ncol = 2))
然而,当我执行列车功能时,虽然我没有得到任何错误(但我得到50个警告),火车再次尝试从0到2的成本.我做错了什么?哪种格式有成本参数?这是什么意思?我如何解释结果?获得成本的那一类是"预测0级错误成本是否超过1级"?此外,我尝试使用一个矩阵,但虽然它不适用于这种格式,我如何添加我想测试的不同成本?
谢谢!任何帮助都会非常受欢迎!
编辑:
所以,试着自己找一个关于C5.0Cost成本参数意义的答案,我去了C5.0Cost.R(https://r-forge.r-project.org/scm/viewvc .php/models/files/C5.0Cost.R?view = markup&root = caret&pathrev = 761)并查找代码.这一行:
cmat <-matrix(c(0, param$cost, 1, 0), ncol = 2)
Run Code Online (Sandbox Code Playgroud)
我猜,它将成本参数传递给成本矩阵.所以,我想现在我能理解它是如何运作的.如果我有class = {0,1}并且我的正类是0,那么这个矩阵表示"预测0级错误成本比1级高两倍",对吧?我现在的问题是,我怎么能这样做呢?我怎么能设置"预测1级错误成本比0级加倍",这将是:
cmat <- matrix(c(0, 1, param$cost, 0), ncol=2)
Run Code Online (Sandbox Code Playgroud)
我可以将成本设置为0.5吗?如果想要使用不同的值进行训练,只需使用小于1 {0.5,0.6,0.7等}的值.注意:我的数据的方式,当我之前使用C50或其他树时,它采用"正类= 0",所以当我使用C50时我不得不反转成本矩阵,所以如果我使用插入方法C5.0Cost,我我需要做同样的事情或找到另一种方式来做到这一点......
我真的很感激这里的任何帮助.谢谢!
我有一个数据表(可以更快地处理我拥有的所有记录),并且我想根据组中某些行满足的条件来标记行。我会尝试说明。我的数据如下所示:
ID DATE EVENT
1 01-Jan-97 A
1 01-Jan-97 K
2 03-Jan-03 A
3 04-Jan-03 K
Run Code Online (Sandbox Code Playgroud)
因此,有一个ID,一个日期和一个事件。最终目的是,如果同一日期已经有EVENT = K,则删除具有EVENT = A的行。因此,我考虑设置两个标志,如果组(ID,DATE)具有A,则另一个标志,如果它们具有K,则设置两个标志,因此,如果它同时具有两个标志= 1,我将删除包含A的行,因为我不需要它。
因此,获得前两个标志是可以的。代码如下所示:
mydata.table[EVENT=="K", k.flag:=1, by=.(ID, DATE)]
Run Code Online (Sandbox Code Playgroud)
我对A.flag也这样做。然后我不知道如何获取第三个标志来标记它是否同时具有,那么我可以使用A删除记录。所以我想要一个类似表的内容:
ID DATE EVENT K.FLAG A.FLAG BOTH
1 01-Jan-97 A 0 1 1
1 01-Jan-97 K 1 0 1
2 03-Jan-03 A 0 1 0
3 04-Jan-03 K 1 0 0
Run Code Online (Sandbox Code Playgroud)
然后我将同时删除= 1和EVENT = A。我知道这不是一个非常优雅的解决方案,但这是我能想到的最好的解决方案,但是我对第三个标志的声明有疑问。有什么建议么?我认为这就像在data.table中使用CASE语句,但我无法弄清楚...
谢谢!