Python Can';t复制Xgb.cv交叉验证结果

Python Can';t复制Xgb.cv交叉验证结果,python,machine-learning,classification,xgboost,Python,Machine Learning,Classification,Xgboost,我使用的是Python 3.5和XGBoost的Python实现,版本为0.6 我用Python构建了一个正向特性选择例程,它迭代地构建最佳特性集(导致最佳分数,这里的度量是二进制分类错误) 在我的数据集上,使用xgb.cv例程,通过将(树的)最大深度增加到40,我可以得到大约0.21的错误率 但是,如果我使用相同的XG Boost参数、相同的折叠、相同的度量和相同的数据集进行自定义交叉验证,我的最佳分数为0.70,最大深度为4。。。如果我使用xgb.cv例程获得的最佳最大深度,我的分数将降至0

我使用的是Python 3.5和XGBoost的Python实现,版本为0.6

我用Python构建了一个正向特性选择例程,它迭代地构建最佳特性集(导致最佳分数,这里的度量是二进制分类错误)

在我的数据集上,使用xgb.cv例程,通过将(树的)最大深度增加到40,我可以得到大约0.21的错误率

但是,如果我使用相同的XG Boost参数、相同的折叠、相同的度量和相同的数据集进行自定义交叉验证,我的最佳分数为0.70,最大深度为4。。。如果我使用xgb.cv例程获得的最佳最大深度,我的分数将降至0.65。。。我只是不明白发生了什么

我最好的猜测是xgb.cv使用了不同的折叠(即在分区之前洗牌数据),但我也认为我将折叠作为输入提交给xgb.cv(选项Shuffle=False)。。。所以,这可能是完全不同的

以下是正向功能选择的代码(使用xgb.cv):

下面是我的“自定义”交叉验证:

mean_error_rate = 0
for train, test in k_fold.split(ds):
    dtrain =  xgb.DMatrix(pd.DataFrame(ds.iloc[train]), dc.iloc[train]["bin_spread"], missing = None)
    gbm = xgb.train(params, dtrain, 30)
    dtest =  xgb.DMatrix(pd.DataFrame(ds.iloc[test]), dc.iloc[test]["bin_spread"], missing = None)
    res.ix[test,"pred"] = gbm.predict(dtest)

    cv_reg = reg.fit(pd.DataFrame(ds.iloc[train]), dc.iloc[train]["bin_spread"])
    res.ix[test,"lasso"] = cv_reg.predict(pd.DataFrame(ds.iloc[test]))

    res.ix[test,"y_xgb"] = res.loc[test,"pred"] > 0.5
    res.ix[test, "xgb_right"] = (res.loc[test,"y_xgb"]==res.loc[test,"bin_spread"]) 
    print (str(100*np.sum(res.loc[test, "xgb_right"])/(N/13)))
    mean_error_rate += 100*(np.sum(res.loc[test, "xgb_right"])/(N/13))
print("mean_error_rate is : " + str(mean_error_rate/13))  
使用以下参数:

params = {"objective": "binary:logistic", 
          "booster":"gbtree",
          "max_depth":4, 
          "eval_metric" : "error",
          "eta" : 0.15}
res = pd.DataFrame(dc["bin_spread"]) 
k_fold = KFold(n_splits=13)
N = dc.shape[0]
num_trees = 30
最后,调用我的正向功能选择:

selfeat = Forward_Feature_Selection(dc, 
                                    dc["bin_spread"], 
                                    params, 
                                    num_round = num_trees,
                                    threshold = 0,
                                    initial_score=999,
                                    to_exclude = [0,1,5,30,31],
                                    nfold = 13)

任何有助于了解正在发生的事情都将不胜感激!提前感谢您的任何提示

这是正常的。我也有同样的经历。首先,Kfold每次的拆分方式不同。您已经在XGBoost中指定了折叠,但KFold没有一致地拆分,这是正常的。 其次,模型的初始状态每次都不同。
XGBoost中存在内部随机状态,这也可能导致这种情况,请尝试更改评估指标,以查看方差是否减小。如果某个特定指标适合您的需要,请尝试平均最佳参数,并将其用作您的最佳参数。

感谢阿披实的回答,但我不同意。Kfold的默认参数是训练集的无洗牌+无随机状态,这是我使用的参数。此外,我给xgb.cv的折叠完全相同,我的结果非常不同(使用xgb.cv的分类分数为78%,使用自定义交叉验证函数的分类分数为65%),因此这不能用XGBoost的随机性甚至KFold来解释。。。所以,还有别的事情。。。
selfeat = Forward_Feature_Selection(dc, 
                                    dc["bin_spread"], 
                                    params, 
                                    num_round = num_trees,
                                    threshold = 0,
                                    initial_score=999,
                                    to_exclude = [0,1,5,30,31],
                                    nfold = 13)