使用tidymodels建模时遇‘object '.' not found’错误求助
解决tidymodels中
fit()报错:object '.' not found 错误原因
- 核心问题出在recipe里的
step_dummy(endpoint):你对响应变量endpoint做了哑变量编码,但分类模型(如SVM)直接支持因子类型的响应变量,完全不需要这一步。执行该步骤后,原始的endpoint列会被替换为哑变量列(比如endpoint_1),但模型拟合时仍在寻找原始的endpoint变量,最终触发找不到对象的错误。 - 额外问题:模型spec中使用了
tune()参数,但直接调用fit()时没有指定具体参数值,这种情况下无法直接拟合,需要先指定固定值或改用交叉验证调优流程。
解决方法
- 移除recipe中的
step_dummy(endpoint)步骤,保留endpoint的因子类型作为响应变量。 - 给SVM模型的
cost和rbf_sigma指定具体数值(后续需要调优时,可再改为tune()并使用交叉验证流程)。
修正后的完整代码
library(tidymodels) tidymodels_prefer() # 创建数据集 endpoint <- factor(rep(c(1, 0), each = 10)) genes <- data.frame(matrix(rnorm(20 * 20), ncol = 20)) data <- data.frame(endpoint, genes) # 修正后的Recipe:移除对响应变量的哑变量编码 svm_linear_rec <- recipe(endpoint ~ ., data = data) %>% step_normalize(all_numeric_predictors()) # 修正后的Spec:指定具体参数值替代tune() svm_spec <- svm_rbf(cost = 1, rbf_sigma = 0.1) %>% set_engine("kernlab") %>% set_mode("classification") # 构建Workflow svm_wflow <- workflow() %>% add_model(svm_spec) %>% add_recipe(svm_linear_rec) # 拟合模型 svm_fit <- fit(svm_wflow, data) # 查看拟合结果 svm_fit
后续参数调优说明
如果需要对cost和rbf_sigma进行参数调优,不要直接用fit(),而是使用交叉验证流程:
# 重新定义带调优参数的模型spec svm_spec_tune <- svm_rbf(cost = tune(), rbf_sigma = tune()) %>% set_engine("kernlab") %>% set_mode("classification") # 更新workflow svm_wflow_tune <- svm_wflow %>% update_model(svm_spec_tune) # 创建交叉验证折 set.seed(123) data_folds <- vfold_cv(data, v = 5) # 运行参数调优 svm_tune_results <- tune_grid( svm_wflow_tune, resamples = data_folds, grid = 10 # 使用默认10组参数组合,也可自定义参数网格 ) # 查看最优参数组合 show_best(svm_tune_results, metric = "roc_auc")
内容的提问来源于stack exchange,提问作者roybatty
相关产品推荐
相关产品推荐

