首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超参数调谐XGBoost

超参数调谐XGBoost
EN

Data Science用户
提问于 2020-10-28 12:16:45
回答 2查看 337关注 0票数 1

我试着用贝叶斯优化来调优超参数。这是一个具有目标函数的回归问题: objective =‘reg:方格误差’。

\frac{1}{2}[log(pred+1)-log(true+1)]^2

我的数据集由20k向量组成,每个向量的长度为12 (12个特征)。每个向量都有一个对应的Y值。

我想找到一组超参数,以最小化损失函数。这是如何在代码中实现的:

代码语言:javascript
复制
def evaluate_model(learning_rate, max_depth, nr_estimators, min_child_weight, min_split_loss, reg_lambda):
    model = get_model(learning_rate, max_depth, nr_estimators, min_child_weight, min_split_loss, reg_lambda)
    model.fit(X_train, Y_train)
    pred = model.predict(X_val)

    error = np.array([])
    for i in range(len(pred)):
        prediction = np.maximum(pred[i],1)
        error = np.append(error, (1/2)*(np.log(prediction+1)-np.log(Y_val[i]+1))**2)
    err = np.mean(error)
    return -err

我的问题是,如果有人对我如何构造evaluate_model函数有任何问题。在实现贝叶斯超优化时,这是否优化了平方日志错误?最大值(pred我,1)在出现负预测的情况下存在。而且,即使在超参数优化之后,我也得到了不好的结果。

这些是我评估的超参数:

代码语言:javascript
复制
pbounds = {'learning_rate': (0,1), 'max_depth': (3,10), 'nr_estimators': (100, 5000), 'min_child_weight': (1,9), 'min_split_loss': (0,10), 'reg_lambda': (1,10)}

优化运行在100个迭代和10个init点。我用于贝叶斯优化的包是bayes_opt

EN

回答 2

Data Science用户

回答已采纳

发布于 2020-10-28 13:53:24

另一种方法是使用来自相同度量模块的mean_squared_log_error。

首先将预测中的负值剪辑为1,然后找到均方日志错误。

pred = np.clip(pred,min=1,max=None)

err = mean_squared_log_error(yval,pred)

票数 0
EN

Data Science用户

发布于 2020-10-28 13:42:14

与其循环遍历预测,不如从scikit的度量模块导入mean_squared_error?我猜您正在使用均方日志错误目标进行优化。

首先,对实际值和预测值进行对数变换,求出均方误差。

示例:从sklearn.metrics导入mean_squared_error

mean_sq_error = mean_squared_error(np.log1p(yval),np.log1p(pred))

np.log1p(x)与np.log(x+1)相同

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/84609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档