使用 GridSearch 时使用 Scikit-learn 的模型帮助

Posted

技术标签:

【中文标题】使用 GridSearch 时使用 Scikit-learn 的模型帮助【英文标题】:Model help using Scikit-learn when using GridSearch 【发布时间】:2017-07-10 18:19:06 【问题描述】:

作为安然项目的一部分,构建了附加模型,以下是步骤摘要,

以下模型给出了非常完美的分数

cv = StratifiedShuffleSplit(n_splits = 100, test_size = 0.2, random_state = 42)
gcv = GridSearchCV(pipe, clf_params,cv=cv)

gcv.fit(features,labels) ---> with the full dataset

for train_ind, test_ind in cv.split(features,labels):
    x_train, x_test = features[train_ind], features[test_ind]
    y_train, y_test = labels[train_ind],labels[test_ind]

    gcv.best_estimator_.predict(x_test)

以下模型给出的分数更合理但分数较低

cv = StratifiedShuffleSplit(n_splits = 100, test_size = 0.2, random_state = 42)
gcv = GridSearchCV(pipe, clf_params,cv=cv)

gcv.fit(features,labels) ---> with the full dataset

for train_ind, test_ind in cv.split(features,labels):
     x_train, x_test = features[train_ind], features[test_ind]
     y_train, y_test = labels[train_ind],labels[test_ind]

     gcv.best_estimator_.fit(x_train,y_train)
     gcv.best_estimator_.predict(x_test)

    使用 Kbest 找出分数并对特征进行排序并尝试高低分数的组合。

    将 SVM 与使用 StratifiedShuffle 的 GridSearch 结合使用

    使用 best_estimator_ 预测和计算准确率和召回率。

问题是估算器给出了完美的分数,在某些情况下是 1

但是,当我根据训练数据重新拟合最佳分类器然后运行测试时,它会给出合理的分数。

我的疑问/问题是 GridSearch 在使用我们发送给它的 Shuffle 拆分对象拆分后对测试数据做了什么。我认为它不适合测试数据,如果这是真的,那么当我预测使用相同的测试数据时,它不应该给出这么高的分数。?因为我使用了 random_state 值,所以 shufflesplit 应该为网格拟合和预测创建了相同的副本。

那么,对两个错误使用相同的 Shufflesplit 吗?

【问题讨论】:

【参考方案1】:

GridSearchCV 正如@Gauthier Feuillen 所说,用于搜索给定数据的估计器的最佳参数。 GridSearchCV 说明:-

    gcv = GridSearchCV(pipe, clf_params,cv=cv) gcv.fit(features,labels) clf_params 将扩展为使用 ParameterGrid 将所有可能的组合分开。 features 现在将使用 cv 拆分为 features_trainfeatures_testlabels 相同 现在,gridSearch 估计器(管道)将使用features_trainlabels_inner 进行训练,并使用features_testlabels_test 进行评分。 对于步骤 3 中的每个可能的参数组合,对于cv_iterations步骤 4 和 5 将重复。将计算 cv 迭代的平均得分,并将其分配给该参数组合。这可以使用 gridSearch 的cv_results_ 属性访问。 对于给出最佳分数的参数,内部估计器将使用这些参数重新初始化并重新拟合提供给它的整个数据(特征和标签)。

由于最后一步,您在第一种方法和第二种方法中得到不同的分数。因为在第一种方法中,所有数据都用于训练,而您仅对这些数据进行预测。第二种方法对以前看不见的数据进行预测。

【讨论】:

感谢您的详细解释。真的很感激。只是两件小事,我认为您的意思是第 4 步和第 5 步将在第 6 步中重复。第 7 步仅在 GridSearch 对象中的 refit = True 时完成。? 是的,当refit=True时执行第7步。默认情况下 refit=True 在 GridSearchCV() 中。而且你在你的代码中也没有指定refit参数,这就是我没有使用它的原因。 这是一个很棒且非常详细的答案! @VivekKumar +1 以获得很好的解释。在第二种方法中,他再次将训练数据拟合到最终模型 (由 best_estimator 发现)_ 。需要这一步吗? @Md.SabbirAhmed 最初使用refit 参数在GridSearchCV 中,best_estimator_ 将在GridSearchCV.fit() 中提供的整个数据上进行训练。对于交叉验证,这不是我们想要的。所以在他的第二种方法中,他只是通过在每个折叠的训练数据上再次训练best_estimator_ 来计算交叉验证折叠中最佳找到参数的性能。这是正确的,但不是必需的,因为GridSearchCV 将计算每个参数组合的每个折叠的分数。【参考方案2】:

基本上网格搜索会:

尝试参数网格的每种组合 它将对每个人进行 K 折交叉验证 选择最好的。

所以你的第二种情况是好的。否则,您实际上是在预测您训练时使用的数据(第二个选项不是这种情况,您只保留网格搜索中的最佳参数)

【讨论】:

感谢您的澄清。现在说得通了。我认为网格搜索实际上只是在测试数据上运行测试,根本不将其用于训练。非常感谢您的回复。

以上是关于使用 GridSearch 时使用 Scikit-learn 的模型帮助的主要内容,如果未能解决你的问题,请参考以下文章

Keras GridSearch scikit 学习冻结

来自 SCIKIT 学习用户指南的 GridSearch 示例尝试给出错误

GridSearch用于Scikit-learn中的多标签分类

使用 Gridsearch 进行超参数搜索,给出不起作用的参数值

火炉炼AI机器学习017-使用GridSearch搜索最佳参数组合

使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证