【问题标题】:How to tweak maximum number of iterations in R caret package如何调整 R 插入符号包中的最大迭代次数
【发布时间】:2016-05-03 23:57:20
【问题描述】:

我在 R caret 包中运行具有径向基核函数的支持向量机。我的代码运行时没有错误或警告,但是它会生成“达到最大迭代次数...”消息,我将其解释为算法没有收敛到解决方案。

以一个小型大学招生数据集(4 个特征,n=400)为例:

# Load data & factor admit variable.
> mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
  mydata$admit <- as.factor(mydata$admit)

# Create levels yes/no to make sure the the classprobs get a correct name.
 levels(mydata$admit) = c("yes", "no")


# Train SVM via 10-fold CV.
set.seed(123)
train_control <- trainControl( method="cv",
    number=10,
    classProbs = TRUE,
    savePredictions = TRUE)

model_rbfsvm<- train(as.factor(admit) ~ .,
    data=mydata,
    trControl=train_control,
    method="svmRadial", 
    family="binomial", 
    tuneGrid=expand.grid(C=c(.000001, .00001, .0001, .001, .01, .1, 1, 10), sigma=c(.00001, .0001, .001, .01, .1, 1, 10)), 
    metric="Accuracy", 
    preProcess=c("center","scale"))

成功执行但产生以下消息(我已经缩写 - 它持续了很多行):

maximum number of iterations reached 4.663775e-05 4.663771e-05maximum number of iterations reached 0.0003396917 0.0003396878...

使用 train 函数中的 maxiter= 语句调整最大迭代次数会产生相同的消息。

是否可以调整caret中的最大迭代次数还是固定在特定级别?

【问题讨论】:

    标签: r iteration r-caret


    【解决方案1】:

    无法调整迭代次数。如果您指定maxiter = .....,它会被传递到底层kernlab lssvm 函数,但不是lssvm 函数中的选项并且被忽略。

    您的警告仅在您设置classProbs = TRUE 时发生,如果您将其保留为默认选项,您将不会看到任何消息。这很有趣,因为该消息表明 svm 尚未达到收敛,并且在 classProbs = FALSE 时以某种方式达到了收敛。但我对此表示怀疑,因为模型结果完全相同。如果您设置verboseIter = TRUE,消息会更好地显示。

    + Fold1: C=0.001, sigma=0.001 
    maximum number of iterations reached 0.00024476 0.0002447579- Fold1: C=0.001, sigma=0.001 
    + Fold1: C=0.010, sigma=0.001 
    maximum number of iterations reached 0.002770727 0.002765972- Fold1: C=0.010, sigma=0.001
    

    直接使用lssvm 函数运行模型不会返回任何具有最大迭代次数的消息。您可能想在github page of caret 上写一行。

    P.S.:您在 train 函数中指定的 family 选项不需要(也未使用)。

    【讨论】:

    • 谢谢@phiver,这很有帮助。是的,我在lssvm 函数中看不到任何maxiter= 参数,所以我假设算法仅在满足容差标准时终止(默认值 = .0001)。尽管“达到了最大迭代次数...”消息,caret 仍在输出 SVM 预测,所以这一定是一个虚假警告。
    • 经过一番挖掘,我发现了这篇文章:stackoverflow.com/questions/15503027/…,其中讨论了在classProbs = TRUE(其中预测响应是概率)与classProbs = FALSE(其中预测的响应是是/否标签)。可能我们在classProbs = TRUE 时看到最大迭代消息,因为算法没有收敛。
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 2020-10-12
    • 2020-07-15
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2018-01-14
    相关资源
    最近更新 更多