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

时间:2017-02-21 08:20:50

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

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

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

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)
  1. 使用Kbest查找分数并对功能进行排序并尝试更高和更低分数的组合。

  2. 使用StratifiedShuffle的GridSearch使用SVM

  3. 使用best_estimator_来预测和计算精度和召回率。

  4. 问题是估算器正在吐出完美的分数,在某些情况下是1

    但是当我改编训练数据的最佳分类器然后运行测试时它给出了合理的分数。

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

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

2 个答案:

答案 0 :(得分:7)

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

  1. gcv = GridSearchCV(pipe, clf_params,cv=cv)
  2. gcv.fit(features,labels)
  3. clf_params将展开,以使用ParameterGrid分隔所有可能的组合。
  4. features现在将使用features_train分为features_testcvlabels
  5. 也是如此
  6. 现在将使用features_trainlabels_inner对gridSearch估算员(管道)进行培训,并使用features_testlabels_test进行评分。
  7. 对于步骤3中的每个可能的参数组合,{strong>步骤4和5将重复 cv_iterations。将计算cv迭代中的平均得分,其将被分配给该参数组合。可以使用gridSearch的{​​{1}}属性访问它。
  8. 对于给出最佳分数的参数,内部估算器将使用这些参数重新初始化,并重新提供提供给它的整个数据(功能和标签)。
  9. 由于上一步,您在第一和第二种方法中得分不同。因为在第一种方法中,所有数据都用于训练,并且您仅预测该数据。第二种方法预测了以前看不见的数据。

答案 1 :(得分:1)

基本上网格搜索将:

  • 尝试参数网格的每个组合
  • 对于他们每个人,它将进行K折交叉验证
  • 选择最佳可用。

所以你的第二个案例是好的。否则,您实际上是在预测您训练过的数据(在第二个选项中不是这种情况,您只保留gridsearch中的最佳参数)