楼主: lanlanmei
1350 5

[问答] 来自《机器学习与R语言》-Lants一书中的代码运行错误 [推广有奖]

  • 0关注
  • 0粉丝

本科生

17%

还不是VIP/贵宾

-

威望
0
论坛币
17 个
通用积分
1.3500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
243 点
帖子
16
精华
0
在线时间
134 小时
注册时间
2005-8-31
最后登录
2023-12-5

楼主
lanlanmei 发表于 2018-4-9 22:28:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
credit.xlsx (98.68 KB)
  1. ctrl <- trainControl(method = "cv",number = 10)
  2. bagctrl <- bagControl(fit = svmBag$fit,
  3.                       predict = svmBag$pred,
  4.                       aggregate = svmBag$aggregate)
  5. set.seed(300)
  6. svmbag111 <- train(default~.,
  7.                    data = credit,
  8.                    "bag",
  9.                    trControl = ctrl,
  10.                    bagControl = bagctrl)
复制代码
Error in train(default ~ ., data = credit, "bag", trControl = ctrl, bagControl = bagctrl) :   unused arguments (data = credit, trControl = ctrl, bagControl = bagctrl)代码出自这本书的P245页,关于集成学习的部分。试了很多遍都不知道错在哪里,请大家帮忙看看如何处理。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:ants 机器学习 运行错误 NTS Ant

沙发
narcissism0923 发表于 2018-4-10 10:09:28
R里的caret包和mlr包都有一个强大的train函数,它俩重名,调用时需要指定是哪个,用caret::train试试。

藤椅
narcissism0923 发表于 2018-4-10 10:31:19
兰茨的那本《机器学习与R语言》(原书第2版)我也从头到尾学过,很不错的入门教程,但是确实比较浅,很多代码可以在自己日后学习中将其不断完善以致适用面更广、更强大。
关于bagging自助汇聚法,其实caret包更多是直接调用train函数,并配合trControl、tuneGrid或tuneLength几个参数去进行参数调优。比如我学过那本书之后,上网参考了caret包的官方教程,修改了代码形成了自己的“套路”:
  1. library(doMC)                                       # 根据caret官方教程使用此包为了并行计算
  2. registerDoMC(8)                                   # 根据本地计算机cpu内核数量,载入指定数量的内核参与并行运算
  3. credit <- read.csv("credit.csv", stringsAsFactors = T)
  4. credit %>% glimpse
  5. credit$default %>% CrossTable             # 查看分类情况

  6. credit.idx <- createDataPartition(credit$default, p = 0.8, list = F) # 划分训练集和测试集
  7. credit.tr <- credit[credit.idx, ]
  8. credit.ts <- credit[-credit.idx, ]

  9. # 支持向量机----
  10. modelLookup("svmRadial")                     # 查看调用的算法可以调试的参数
  11. system.time(credit.svm <- caret::train(default ~ ., credit.tr, method = "svmRadial",
  12.                                                       metric = "ROC", # 评价模型的指标选择ROC曲线下的面积值
  13.                                                       trControl = trainControl("cv", # 10折交叉验证
  14.                                                                                          10,
  15.                                                                                          summaryFunction = twoClassSummary,
  16.                                                                                          classProbs = T),
  17.                                                       tuneLength = 10)) # 调试参数的数量
  18. credit.svm
  19. credit.svm %>% plot                            # 调试结果可视化(lattice包)
  20. credit.svm %>% ggplot                        # 调试结果可视化(ggplot2包)
  21. credit.svm.pred <- predict(credit.svm, credit.ts) # 预测测试集
  22. (credit.svm.cm <- caret::confusionMatrix(credit.svm.pred, credit.ts$default)) # 生成混淆矩阵
  23. credit.svm.cm$byClass                         # 查看更多详细的测试结果
复制代码


板凳
lanlanmei 发表于 2018-4-10 11:11:45
narcissism0923 发表于 2018-4-10 10:31
兰茨的那本《机器学习与R语言》(原书第2版)我也从头到尾学过,很不错的入门教程,但是确实比较浅,很多代码 ...
学习了,但是您发的代码只包含了调参数的部分,也就是只训练了一个分类器,如果要训练多个基分类器,应该怎么做呢?

报纸
narcissism0923 发表于 2018-4-10 11:26:16
lanlanmei 发表于 2018-4-10 11:11
学习了,但是您发的代码只包含了调参数的部分,也就是只训练了一个分类器,如果要训练多个基分类器,应该 ...
每个学习器都有自己独特的参数,要调试参数最好一个个分别做,最后的结果可以汇总比较的。比如:
  1. # 综合比较----
  2. credit.res <-
  3.   resamples(list(
  4.     rf = credit.rf,                                        # 随机森林
  5.     svm = credit.svm,                                # 支持向量机
  6.     xgb = credit.xgb                                   # xgboost
  7.   ))
  8. summary(credit.res)
  9. bwplot(credit.res)                                     # 汇总结果可视化,箱线图
  10. bwplot(credit.res, metric = "ROC")
  11. bwplot(credit.res, metric = "Sens")
  12. bwplot(credit.res, metric = "Spec")
  13. densityplot(credit.res, auto.key = T, pch = "|") # 汇总结果可视化,概率密度图
  14. densityplot(credit.res,
  15.             auto.key = T,
  16.             pch = "|",
  17.             metric = "ROC")
  18. densityplot(credit.res,
  19.             auto.key = T,
  20.             pch = "|",
  21.             metric = "Sens")
  22. densityplot(credit.res,
  23.             auto.key = T,
  24.             pch = "|",
  25.             metric = "Spec")
复制代码


当然,也可以把一堆学习器放一起调试,但那样的代码比较复杂,mlr包里的流程更清晰些。
我目前的“套路”是,先用一堆学习器一起学习一次,综合比较下谁的结果最好,挑出精度和时间综合平衡下最好的两三个学习器,再分别一个个调参,然后再利用调优的参数进行交叉验证,最后将验证结果放一起综合比较。
就我目前的水平来说,随机森林和xgboost是“黑箱”类中常常领先的两个学习器,尤其是xgboost,速度快、效果好!偶尔有earth、glmnet、nntrain这样的学习器在某些数据集上也不错,因为它们常常耗时更少。svm支持向量机综合起来精度不如随机森林和xgboost,速度更比不过xgboost。还有一类就是深度学习,如h2o的deeplearning,效果也不错,就是慢……

地板
lanlanmei 发表于 2018-4-10 11:50:03
narcissism0923 发表于 2018-4-10 11:26
每个学习器都有自己独特的参数,要调试参数最好一个个分别做,最后的结果可以汇总比较的。比如:
我现在试了几个学习器后,也发现随机森林效果比较好,xgboost还没有试。我现在就像把bagControl这一项加到train函数中,这样能实现多个分类器的综合评价,但是总是出现错误,也不知道哪里出了问题。还有一点,我发现交叉验证方法实质上就相当于一个bagging过程了,不知道这样理解对吗?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 12:30