Python 在GridSearchCV中为XGBoost评分

Python 在GridSearchCV中为XGBoost评分,python,machine-learning,parameters,xgboost,grid-search,Python,Machine Learning,Parameters,Xgboost,Grid Search,我目前正在尝试第一次使用XGBoost分析数据。我想使用GridsearchCV找到最佳参数。我想最小化均方根误差,为此,我使用“rmse”作为评估指标。然而,网格搜索中的评分并没有这样的标准。我在这个网站上发现“负均方误差”也有同样的结果,但我发现这给了我不同于RMSE的结果。当我计算“neg_mean_squared_error”绝对值的根时,我得到的值约为8.9,而另一个函数给出的RMSE约为4.4。 我不知道出了什么问题,也不知道如何使这两个函数一致/给出相同的值 由于这个问题,我得到了

我目前正在尝试第一次使用XGBoost分析数据。我想使用GridsearchCV找到最佳参数。我想最小化均方根误差,为此,我使用“rmse”作为评估指标。然而,网格搜索中的评分并没有这样的标准。我在这个网站上发现“负均方误差”也有同样的结果,但我发现这给了我不同于RMSE的结果。当我计算“neg_mean_squared_error”绝对值的根时,我得到的值约为8.9,而另一个函数给出的RMSE约为4.4。 我不知道出了什么问题,也不知道如何使这两个函数一致/给出相同的值

由于这个问题,我得到了错误的值作为“best_params_”,这给了我一个比我最初用来调优的一些值更高的RMSE

谁能解释一下如何在网格搜索中获得RMSE的分数,或者为什么我的代码给出不同的值

提前谢谢

def modelfit(alg, trainx, trainy, useTrainCV=True, cv_folds=10, early_stopping_rounds=50):
    if useTrainCV:
        xgb_param = alg.get_xgb_params()
        xgtrain = xgb.DMatrix(trainx, label=trainy)
        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
                          metrics='rmse', early_stopping_rounds=early_stopping_rounds)
        alg.set_params(n_estimators=cvresult.shape[0])

    # Fit the algorithm on the data
    alg.fit(trainx, trainy, eval_metric='rmse')

    # Predict training set:
    dtrain_predictions = alg.predict(trainx)
    # dtrain_predprob = alg.predict_proba(trainy)[:, 1]
    print(dtrain_predictions)
    print(np.sqrt(mean_squared_error(trainy, dtrain_predictions)))

    # Print model report:
    print("\nModel Report")
    print("RMSE : %.4g" % np.sqrt(metrics.mean_squared_error(trainy, dtrain_predictions)))

 param_test2 = {
 'max_depth':[6,7,8],
 'min_child_weight':[2,3,4]
}

grid2 = GridSearchCV(estimator = xgb.XGBRegressor( learning_rate =0.1, n_estimators=2000, max_depth=5,
 min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
 objective= 'reg:linear', nthread=4, scale_pos_weight=1, random_state=4),
 param_grid = param_test2, scoring='neg_mean_squared_error', n_jobs=4,iid=False, cv=10, verbose=20)
grid2.fit(X_train,y_train)
# Mean cross-validated score of the best_estimator
print(grid2.best_params_, np.sqrt(np.abs(grid2.best_score_))), print(np.sqrt(np.abs(grid2.score(X_train, y_train))))
modelfit(grid2.best_estimator_, X_train, y_train)
print(np.sqrt(np.abs(grid2.score(X_train, y_train))))

GridSearchCV
中,对评分参数进行转换,使较高的值总是优于较低的值。在您的示例中,
neg_mean_squared_error
只是RMSE的一个否定版本。您不应将
neg_mean_squared_error
解释为RMSE,而应在交叉验证中比较
neg_mean_squared_error
的值,其中较高的值优于较低的值

模型评估
文档的评分参数部分提到了这种行为


谢谢您的回复!我明白这一点,但是为什么“print(np.sqrt(np.abs(grid2.score(X_train,y_train)))”语句的值与modelfit“print”(RMSE:%.4g”%np.sqrt(metrics.mean_squared_error(trainy,dtrain_predictions)))语句的值不同呢?另外,当我真正想最小化RMSE时,最小化均方误差是错误的吗?我认为这可以归结为同一件事,因为如果你最小化某个东西,根也会最小化。这是正确的吗?
grid2.最佳得分是交叉验证期间模型在保持数据上实现的最佳性能。然后,将该估计器与整个训练集进行拟合,并使用这些预测来计算RMSE。因此,差异归结为分数不是基于他们计算中的相同数据。谢谢,但这是否解释了“模型拟合(grid2.best_估计量,X_序列,y_序列)”和“np.sqrt(np.abs(grid2.score(X_序列,y_序列))之间的RMSE差异在最后一行?你解决过这个问题吗?我们发现了完全相同的东西,但没有看到最佳的_分数如何与我们认为用于手动计算分数的指标一致。