如何调整 R caret 包中的最大迭代次数
How to tweak maximum number of iterations in R caret package
我是 运行 R caret
包中具有径向基核函数的支持向量机。我的代码运行时没有错误或警告,但是它生成了 "maximum number of iterations reached ..." 消息,我将其解释为算法没有收敛到解决方案。
以小型大学招生数据集(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
中的最大迭代次数,还是固定在特定级别?
无法调整迭代次数。如果您指定 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
函数的模型不会 return 任何具有最大迭代次数的消息。您可能想在 github page of caret 上添加一行。
P.S.: 您在 train 函数中指定的 family 选项不需要(也未使用)。
我是 运行 R caret
包中具有径向基核函数的支持向量机。我的代码运行时没有错误或警告,但是它生成了 "maximum number of iterations reached ..." 消息,我将其解释为算法没有收敛到解决方案。
以小型大学招生数据集(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
中的最大迭代次数,还是固定在特定级别?
无法调整迭代次数。如果您指定 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
函数的模型不会 return 任何具有最大迭代次数的消息。您可能想在 github page of caret 上添加一行。
P.S.: 您在 train 函数中指定的 family 选项不需要(也未使用)。