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

使用bayes_opt调优CatBoostRegressor参数时遇多维目标错误求助

问题解决:CatBoostRegressor多维目标适配错误

错误根源

出现CatBoostError的核心原因:你的目标变量(trainy/testy)是多维数组,但当前指定的损失函数RMSE属于单变量回归目标,不支持多维输入。CatBoost仅允许多回归(multi-regression)、多标签(multilabel)、生存分析(survival)类目标函数处理多维目标。

修复方案

根据实际任务类型,选择对应处理方式:

场景1:单变量回归任务(目标变量误转为多维)

检查get_data()函数,确保返回的trainy和testy是一维数组(形状为(n_samples,))。如果是误将一维数组转为二维(如(n_samples,1)),用ravel()或flatten()修正:

# 在get_data()中修正目标变量维度
trainy = trainy.ravel()
testy = testy.ravel()

保持损失函数RMSE不变,单变量回归场景下该指标合理。

场景2:多变量回归任务

将损失函数替换为多回归支持的MultiRMSE,同时调整评估指标的多输出参数:

# 修改CatBoostRegressor的损失函数
model = CatBoostRegressor(
    iterations = iterations, 
    learning_rate = learning_rate, 
    depth = depth,
    l2_leaf_reg = l2_leaf_reg, 
    min_child_samples = min_child_samples, 
    loss_function='MultiRMSE'  # 切换为多回归损失
)

# 多变量回归时计算R2,需指定multioutput参数
score = r2_score(testy, yhat, multioutput='uniform_average')

额外代码问题修正

你的代码存在几个细节问题:

  • 导入了分类任务的make_classification和accuracy_score,回归任务应使用make_regression和回归指标(如r2_score)
  • get_data()函数未补全数据加载逻辑,直接运行会报错
  • optimize_XGB函数名与实际优化的CatBoost不符,建议改为optimize_CBR

修正后的完整代码示例

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from catboost import Pool, CatBoostRegressor
from bayes_opt import BayesianOptimization
from bayes_opt.util import Colours
from sklearn.metrics import r2_score

def get_data():
    """准备回归数据集"""
    X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=31)
    trainx, testx, trainy, testy = train_test_split(X, y, test_size=0.2, random_state=31)
    # 确保目标变量为一维
    trainy = trainy.ravel()
    testy = testy.ravel()
    return trainx, testx, trainy, testy

def CBR_cv(iterations, learning_rate, depth, l2_leaf_reg, min_child_samples, trainx, testx, trainy, testy):
    train_pool = Pool(trainx, trainy)
    test_pool = Pool(testx) 

    model = CatBoostRegressor(
        iterations=int(iterations), 
        learning_rate=learning_rate, 
        depth=int(depth),
        l2_leaf_reg=l2_leaf_reg, 
        min_child_samples=int(min_child_samples), 
        loss_function='RMSE',
        verbose=False
    )

    model.fit(train_pool)
    yhat = model.predict(test_pool)
    score = r2_score(testy, yhat)
    return score

def optimize_CBR(trainx2, testx2, trainy2, testy2):
    """对CatBoostRegressor应用贝叶斯优化"""
    def CBR_crossval(iterations, learning_rate, depth, l2_leaf_reg, min_child_samples):
        return CBR_cv(
            iterations=int(iterations),
            learning_rate=max(min(learning_rate, 0.5), 1e-3),
            depth=int(depth),
            l2_leaf_reg=max(min(l2_leaf_reg, 5.5), 1.0),
            min_child_samples=int(min_child_samples),
            trainx=trainx2, testx=testx2, trainy=trainy2, testy=testy2
        )
        
    optimizer = BayesianOptimization(
        f=CBR_crossval,
        pbounds={
            "iterations": (50, 500),
            "depth": (2, 25),
            "learning_rate": (0.01, 0.5),
            "l2_leaf_reg": (1.0, 5.5),
            "min_child_samples": (1, 50),
        },
        random_state=1234,
        verbose=2
    )
    optimizer.maximize(n_iter=100)  # 先小范围迭代测试,避免资源浪费

    print("Final result:", optimizer.max)

if __name__ == "__main__":
    trainx2, testx2, trainy2, testy2 = get_data()
    print(Colours.green("--- Optimizing CatBoost Regressor ---"))
    optimize_CBR(trainx2, testx2, trainy2, testy2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:45:28