我试着用贝叶斯优化来调优超参数。这是一个具有目标函数的回归问题: objective =‘reg:方格误差’。
我的数据集由20k向量组成,每个向量的长度为12 (12个特征)。每个向量都有一个对应的Y值。
我想找到一组超参数,以最小化损失函数。这是如何在代码中实现的:
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)在出现负预测的情况下存在。而且,即使在超参数优化之后,我也得到了不好的结果。
这些是我评估的超参数:
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
发布于 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)
发布于 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)相同
https://datascience.stackexchange.com/questions/84609
复制相似问题