【问题标题】:Tidy a "train" object using broom用扫帚整理“火车”物体
【发布时间】:2020-10-25 15:35:22
【问题描述】:

我使用 caret 包和下面的代码做了一个线性回归模型

library(caret)
#Anscombe data is available on R
model_1<-train(
  form=y1~x1,
  data=anscombe,
  method='lm',
  trControl=trainControl(method='cv',number=3))

我想做的是使用broom::tidy(model_1)将模型转换为数据框,但它会引发错误

# Error: No tidy method for objects of class train

我认为问题在于插入符号模型的类,它是 train() 而不是 lm()。有没有办法整理train 对象?还是我应该先将train 对象转换为lm

【问题讨论】:

    标签: r machine-learning linear-regression r-caret broom


    【解决方案1】:

    broom 包当前不支持这种类型的对象。见这里:https://github.com/tidymodels/broom/issues/128

    但是,您可以按照此处的说明轻松定义自己的 tidy 方法:https://www.tidymodels.org/learn/develop/broom/

    这是一个最小的例子:

    library(caret)
    library(broom)
    
    tidy.train <- function(x, ...) {
      s <- summary(x, ...)
      out <- data.frame(term=row.names(s$coefficients),
                        estimate=s$coefficients[, "Estimate"],
                        std.error=s$coefficients[, "Std. Error"],
                        statistic=s$coefficients[, "t value"],
                        p.value=s$coefficients[, "Pr(>|t|)"])
      row.names(out) <- NULL
      out
    }
    
    model_1<-train(
      form=y1~x1,
      data=anscombe,
      method='lm',
      trControl=trainControl(method='cv',number=3))
    
    tidy(model_1)
    #>          term  estimate std.error statistic     p.value
    #> 1 (Intercept) 3.0000909 1.1247468  2.667348 0.025734051
    #> 2          x1 0.5000909 0.1179055  4.241455 0.002169629
    

    【讨论】:

    • 非常感谢文森特!顺便说一句,不应该是tidy.train(model_1) 吗?
    • 不,因为如果你运行class(model_1),你会看到这是一个“train”类的对象。因此,当您加载broom 并定义一个名为tidy.train 的函数时,它会将此函数视为一个特殊的“方法”,并在您调用tidy 时自动将其应用于“train”类的任何对象。谷歌“R S3 方法”或阅读我链接到的broom 教程以获取更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多