You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用单个预测变量拟合XGBoost分类模型时遇报错问题

单预测变量拟合XGBoost分类模型报错解决

问题现象

使用单个数值预测变量通过tidymodels的boost_tree拟合XGBoost分类模型时,触发如下错误:

Error in xgboost::xgb.DMatrix(x[-trn_index, ], label = y[-trn_index], : xgb.DMatrix does not support construction from double

错误原因

  1. 当仅选择单个预测变量时,提取的特征数据会变成一维double向量,而xgboost的xgb.DMatrix要求输入必须是矩阵、数据框等二维结构,无法直接处理一维向量。
  2. 代码中设置的mtry=2与单个预测变量矛盾:mtry参数定义了每次树分裂时使用的特征数量,不能超过现有特征总数。

解决方法

方法1:修正参数并确保特征为二维结构

将mtry改为1(匹配单个特征数量),同时通过cbind将单个特征转为二维格式:

# 修正mtry参数,适配单个特征
model_x1 <- boost_tree(learn_rate = 0.1,
                       tree_depth = 2,
                       mtry = 1,  # 改为1,与特征数量一致
                       trees = 100,
                       stop_iter = 20) %>% 
  set_engine("xgboost", validation = 0.2) %>% 
  set_mode("classification") %>%
  fit(y ~ cbind(x1), data = d)

方法2:用recipe预处理维持数据结构

通过tidymodels的recipe进行预处理,确保单个特征始终以二维结构传递:

# 创建预处理配方
x1_recipe <- recipe(y ~ x1, data = d) %>%
  prep(training = d)

# 提取预处理后的数据集
processed_data <- juice(x1_recipe)

# 拟合模型
model_x1 <- boost_tree(learn_rate = 0.1,
                       tree_depth = 2,
                       mtry = 1,
                       trees = 100,
                       stop_iter = 20) %>% 
  set_engine("xgboost", validation = 0.2) %>% 
  set_mode("classification") %>%
  fit(y ~ ., data = processed_data)

方法3:手动转换特征为矩阵

直接将单个预测变量转换为矩阵,避免被解析为一维向量:

# 转换x1为矩阵
d_processed <- d %>% 
  mutate(x1 = as.matrix(x1))

# 拟合模型
model_x1 <- boost_tree(learn_rate = 0.1,
                       tree_depth = 2,
                       mtry = 1,
                       trees = 100,
                       stop_iter = 20) %>% 
  set_engine("xgboost", validation = 0.2) %>% 
  set_mode("classification") %>%
  fit(y ~ x1, data = d_processed)

内容的提问来源于stack exchange,提问作者gfronk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:13:26