我在学习使用caret
进行机器学习,并且是R的新手。我原本在处理UCI银行营销响应数据,但在这里为了可复现性使用了iris
数据集。
问题是我在运行car包
中的vif
函数时,在分类
模型上遇到了错误
。
library(tidyverse)library(caret)library(car)iris# 为了将其转换为二分类问题iris_train <- iris %>% filter(Species %in% c("setosa","versicolor"))iris_train$Species <- factor(iris_train$Species)
创建模型
model_iris3 <- train(Species ~ ., data = iris_train, method = "gbm", verbose = FALSE # tuneLength = 5, # metric = "Spec", # trControl = fitCtrl )
vif中的错误
# vifcar::vif(model_iris3)
在UseMethod(“vcov”)中出现错误:没有适用于类别为”c(‘train’, ‘train.formula’)”对象的方法’vcov’
我从这个Stack Overflow帖子中了解到可以对finalModel
使用vif
:Variance inflation VIF for glm caret model in R
但仍然遇到错误
car::vif(model_iris3$finalModel)
在UseMethod(“vcov”)中出现错误:没有适用于类别为”gbm”对象的方法’vcov’
使用adaboost
、earth
等时也遇到了同样的错误。
非常感谢任何帮助或建议来解决这个问题。
(更新)
最后这个方法奏效了(如果您仍然遇到错误,请查看答案
中的完整解决方案):
vif
对分类
模型不起作用,所以将因变量
转换为数值
,然后运行线性回归
并使用vif
model_iris4 <- train(as.numeric(Species) ~ ., data = iris_train, method = "lm", verbose = FALSE # tuneLength = 5, # metric = "Spec", # trControl = fitCtrl )car::vif(model_iris4$finalModel)######## 输出 ##########Sepal.Length Sepal.Width Petal.Length Petal.Width 4.803414 2.594389 36.246326 25.421395
回答:
car::vif
是一个需要针对每种模型类型进行调整的函数。它在链接的问题中有效是因为car::vif
已经实现了对glm
模型的支持。您的选择模型类型gbm
不受car::vif
支持。