为何lda()可运行但train()调用lda/qda/gam时报‘wrong model type for regression’错误?
问题原因与解决办法
这个问题的核心在于caret包的train()函数对任务类型的自动判断逻辑,以及LDA/QDA/GAM这类模型的任务局限性:
为什么会报错?
- 你的因变量
website_fakeness是数值型的0/1,train()默认会把这种数值型变量当成回归任务来处理。 - 但LDA、QDA、GAM(当用于分类场景时)是仅支持分类任务的模型,无法处理回归任务,所以就会抛出
Error: wrong model type for regression的错误。 - 而你提到的SVM、KNN、MLP、NB这类模型,本身同时支持分类和回归任务,
train()会根据因变量类型自动适配任务模式,所以不会报错。
怎么解决?
你只需要明确告诉train()这是一个分类任务,最直接的方式就是把因变量转换成因子类型,下面是针对你三个错误代码的修正方案:
方案1:先全局转换因变量类型(推荐)
先把website_fakeness转成因子,再用公式调用train():
# 将数值型的0/1转为因子,添加标签能让结果更直观 dfn$website_fakeness <- factor(dfn$website_fakeness, levels = c(0, 1), labels = c("Real", "Fake")) # 现在再运行你的model4就正常了 model4 <- train(website_fakeness ~ ., data = dfn, method = "lda")
方案2:在公式中直接转换因变量
如果不想修改原始数据,可以在公式里直接把因变量转成因子:
model3 <- train(as.factor(website_fakeness) ~ ., data = dfn, method = "lda")
方案3:修正x/y分开调用的方式
你的model2错误在于x=dfn包含了因变量本身,导致特征和目标重叠,需要先提取纯特征矩阵,再配合因子化的y:
# 提取不含因变量的特征数据 x_features <- dfn[, !names(dfn) %in% "website_fakeness"] # 把目标变量转成因子 y_target <- as.factor(dfn$website_fakeness) # 现在运行修正后的model2 model2 <- train(x = x_features, y = y_target, method = "lda")
额外提示
如果你的模型需要输出分类概率,还可以在train()中添加trControl参数指定classProbs = TRUE,让结果更完整:
ctrl <- trainControl(classProbs = TRUE) model4 <- train(website_fakeness ~ ., data = dfn, method = "lda", trControl = ctrl)
内容的提问来源于stack exchange,提问作者Afrouz Hojati
相关产品推荐
相关产品推荐

