使用TidyModels构建逻辑回归模型遇两类问题求助
解决TidyModels构建逻辑回归模型的两个问题
问题1:混淆矩阵触发conf_mat方法错误
原因
你执行了model_predictions <- model_fit %>% pull(.predictions),这会把预测结果转换成列表格式,而conf_mat()需要数据框输入,因此触发方法不匹配的错误。之前已经用collect_predictions()得到了正确的数据框格式,不需要额外用pull()提取。
解决方案
直接使用collect_predictions()返回的数据框调用conf_mat(),删除pull(.predictions)这一步。
问题2:模型性能指标返回RMSE和RSQ而非Accuracy、ROC-AUC
原因
你用了linear_reg()(线性回归模型),这是针对回归任务的模型,默认输出回归类指标。而你的任务是二分类逻辑回归,需要使用logistic_reg()模型;同时要确保响应变量bankrupt是分类(因子)类型,否则模型会误判为回归任务。
解决方案
- 替换模型为
logistic_reg(),并指定引擎(比如glm); - 将
bankrupt转换为因子类型,明确分类任务; - 通过
metric_set()指定需要的二分类指标(accuracy、roc_auc)。
修正后的完整代码
library(tidymodels) # 数据处理:将bankrupt转为因子类型,明确二分类任务 debt_data <- data %>% select( Bankrupt., Interest.bearing.debt.interest.rate, Total.debt.Total.net.worth, Debt.ratio.., ) %>% rename( bankrupt = Bankrupt., total_debt_vs_total_net_worth = Total.debt.Total.net.worth, debt_ratio = Debt.ratio.. ) %>% mutate(bankrupt = factor(bankrupt, levels = c(0, 1))) # 按实际类别调整levels set.seed(234589) debt_split <- initial_split(debt_data, prop = 3/4) debt_train <- training(debt_split) debt_test <- testing(debt_split) # 定义配方 debt_recipe <- recipe(bankrupt ~ Interest.bearing.debt.interest.rate + total_debt_vs_total_net_worth + debt_ratio, data = debt_data) %>% step_normalize(all_numeric_predictors()) %>% step_impute_knn(all_predictors()) # 构建逻辑回归工作流 model_workflow <- workflow() %>% add_recipe(debt_recipe) %>% add_model(logistic_reg(engine = "glm")) # 在测试集上拟合模型 model_fit <- model_workflow %>% last_fit(debt_split) # 获取指定的二分类性能指标 model_performance <- model_fit %>% collect_metrics(metric = metric_set(accuracy, roc_auc)) model_performance # 获取预测结果数据框 model_predictions <- model_fit %>% collect_predictions() model_predictions # 生成混淆矩阵 model_predictions %>% conf_mat(truth = bankrupt, estimate = .pred_class)
内容的提问来源于stack exchange,提问作者Ulrik
相关产品推荐
相关产品推荐

