4

我希望这不是一个太天真的问题。我正在使用 R 包中的不同模型执行一系列二项式回归caret。到目前为止,除了地球(MARS)之外,所有模型都在工作。通常,earthglm通过earth函数 as传递给函数glm=list(family=binomial)。这似乎工作正常(如下所示)。对于一般predict()功能,我会使用type="response'来正确缩放预测。fit1下面的示例显示了正确预测的非插入符号方法pred1pred1a是不正确缩放的预测type='response'fit2是方法,caretpred2预测;它与 中的非缩放预测相同pred1a。通过挖掘fit2对象,正确拟合的值存在于glm.list组件中。因此,该earth()函数的行为应如此。

问题是......因为caret prediction()函数只需要type='prob' or 'raw',我如何指示预测响应的规模?

非常感谢。

require(earth)
library(caret)
data(mtcars)

fit1 <- earth(am ~ cyl + mpg + wt + disp, data = mtcars,
        degree=1, glm=list(family=binomial))
pred1 <- predict(fit1, newdata = mtcars, type="response")
range(pred1)
[1] 0.0004665284 0.9979135993 # Correct - binomial with response

pred1a <- predict(fit1, newdata = mtcars)
range(pred1a)
[1] -7.669725  6.170226 # without "response"

fit2ctrl <- trainControl(method = "cv", number = 5)
fit2 <- train(am ~ cyl + mpg + wt + disp, data = mtcars, method = "earth", 
         trControl = fit2ctrl, tuneLength = 3,
        glm=list(family='binomial'))
pred2 <- predict(fit2, newdata = mtcars)
range(pred2)
[1] -7.669725  6.170226 # same as pred1a

#within glm.list object in fit4
[1] 0.0004665284 0.9979135993
4

1 回答 1

10

有几件事:

  • 结果 ( mtcars$am) 是数字 0/1,train并将其视为回归模型
  • 当结果是一个因素时,train将假设分类并自动添加glm=list(family=binomial)
  • 使用分类 和train,您将需要添加classProbs = TRUEtrainControl模型以产生类概率。

以下是earth包中包含不同数据集的示例:

library(earth)
library(caret)

data(etitanic)

a1 <- earth(survived ~ ., 
            data = etitanic,
            glm=list(family=binomial),
            degree = 2,       
            nprune = 5)

etitanic$survived <- factor(ifelse(etitanic$survived == 1, "yes", "no"),
                            levels = c("yes", "no"))

a2 <- train(survived ~ ., 
            data = etitanic, 
            method = "earth",
            tuneGrid = data.frame(degree = 2, nprune = 5),
            trControl = trainControl(method = "none", 
                                     classProbs = TRUE))

然后:

> predict(a1, head(etitanic), type = "response")
      survived
[1,] 0.8846552
[2,] 0.9281010
[3,] 0.8846552
[4,] 0.4135716
[5,] 0.8846552
[6,] 0.4135716
> 
> predict(a2, head(etitanic), type = "prob")
        yes         no
1 0.8846552 0.11534481
2 0.9281010 0.07189895
3 0.8846552 0.11534481
4 0.4135716 0.58642840
5 0.8846552 0.11534481
6 0.4135716 0.58642840

最大限度

于 2014-03-02T03:08:34.533 回答