为什么在XGBRegressor中使用优化参数(MSE是最小化目标)会给我与优化RMSE不同的RMSE?

时间:2019-07-19 01:55:18

标签: python machine-learning optimization parameters machine-learning-model

我正在处理回归器问题。我正在调整XGBRegressor模型的参数,因此我使用库GPyOpt来获取优化的参数。函数返回一个由5个元素组成的数组,最小化的MSE为1813。然后,我尝试在模型中输入优化的参数,然后模型的MSE返回2810。我想知道为什么会这样吗?

我真的很熟悉GPyOpt库。我没有关于这个问题的很多信息,所以我想知道这是因为我的粗心大意还是有些我不理解?

git rebase origin/master
import GPyOpt
from GPyOpt.methods import BayesianOptimization
def cv_score(parameters):
    parameters = parameters[0]
    score = cross_val_score(
                XGBRegressor(learning_rate=parameters[0],
                              gamma=int(parameters[1]),
                              max_depth=int(parameters[2]),
                              n_estimators=int(parameters[3]),
                              min_child_weight = parameters[4]), 
                x_train, y_train, scoring='neg_mean_squared_error').mean()
    score = np.array(score)
    return score

bds = [{'name': 'learning_rate', 'type': 'continuous', 'domain': (0, 1)},
        {'name': 'gamma', 'type': 'continuous', 'domain': (0, 5)},
        {'name': 'max_depth', 'type': 'discrete', 'domain': (1, 50)},
        {'name': 'n_estimators', 'type': 'discrete', 'domain': (1, 300)},
        {'name': 'min_child_weight', 'type': 'discrete', 'domain': (1, 10)}]


optimizer = BayesianOptimization(f=cv_score, domain=bds,
                                 model_type='GP',
                                 acquisition_type ='EI',
                                 acquisition_jitter = 0.05,
                                 exact_feval=True, 
                                 maximize=True)
optimizer.run_optimization(max_iter=20)
  
    
      

array([0.56133897,2.697656,50.,300.,               10.])

    
  
optimizer.x_opt

我希望MSE大约在1813年左右,但我达到了2810年。所以我想知道为什么

1 个答案:

答案 0 :(得分:0)

gpyopt中的离散变量不是由其最小值/最大值指定的,而是由其整个值列表指定的。为什么?因为您可能具有不连续性,所以您的变量可能只采用值(1, 3, 8)。请参见here的示例。

因此,在您的示例中,为这些域正确指定域的方法是生成所有可能值的列表:

{'name': 'max_depth', 'type': 'discrete', 'domain': list(range(1, 51))}

与其他离散变量类似。请注意,对于连续代码,可以使用它们的范围来指定。