GridSearchCV参数不会改善分类

时间:2016-12-05 18:09:55

标签: machine-learning scikit-learn cross-validation xgboost grid-search

我有一个目标数据集,我将其划分为5个非重叠的折叠。 在每次迭代(总迭代== 5)时,我使用1倍(让我们称之为fold_for_tuning)来进行参数调整,我使用4倍进行测试。

这样做的原因是我想进行域自适应,在调优之前,我将源数据拟合到分类器,我正在使用小的目标数据子集进行调整。

我调用GridSearchCV并适合fold_for_tuning,并且还传递了一堆我想调整的参数:

param_test1 = {
            'max_depth': [5, 7],
            'min_child_weight': [0.5, 1, 2],
            'gamma': [0.1, 1],
            'subsample': [0.6, 0.7],
            'colsample_bytree': [0.6, 0.7],
            'reg_alpha': [0.01, 0.1]
        }

gsearch = GridSearchCV(estimator=classifierXGB,
                                param_grid=param_test1,
                                scoring='accuracy',
                                n_jobs=4, iid=False, cv=2)

gsearch.fit(fold_for_tuning_data, fold_for_tuning_labels)

每次迭代后,我得到gsearch.best_params_,然后将它们设置为classifierXGB(因为根据我的理解,它们应该提供更好的预测)。 然后,当我打电话 test_y_predicted = classifierXGB.predict(4_unseen_folds) 我没有改进:

prediction before tuning:
acc: 0.690658872245
auc: 0.700764301397
f1: 0.679211922203
prediction after tuning:
acc: 0.691382460414
auc: 0.701595887248
f1: 0.680132554837

但是,如果我致电 gsearch.predict(4_unseen_folds) 我获得了更好的表现:

prediction grid search :
acc: 0.933313032887
auc: 0.930058979926
f1: 0.920623414281

所以我很困惑:网格搜索中发生了什么?它不应该仅仅优化我在param_grid传递的参数吗?如果是这样,那么为什么在classifierXGB中设置相同的参数不会带来更好的效果呢?

2 个答案:

答案 0 :(得分:0)

您的gsearch.predict(...)电话 是对最佳分类器的预测。

我不确定在ClassifierXGB的背景下发生了什么,但如果您创建 classifierXGB

classifierXGB = ClassifierXGB(**gsearch.best_params_)` 

然后致电classifierXGB.predict(4_unseen_folds)您应该看到与gsearch.predict(4_unseen_folds)类似的内容。

可能是在事件发生之后将更改应用于classifierXGB可能不符合您的预期。创建ClassifierXGB的新实例应该会有所帮助。

答案 1 :(得分:0)

将参数设置为classifierXGB后,您需要使其适合整个列车数据然后,用它来预测事物

网格搜索找到了“正确的”参数,你把它们交给你的分类器以便它有效地学习,但你没有给他模型的实际树木/权重。它仍然是一个空壳。