如何在python中使用交叉验证执行GridSearchCV

时间:2019-04-10 04:16:33

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

我正在使用RandomForestGridSearchCV进行超参数调整。

X = np.array(df[features]) #all features
y = np.array(df['gold_standard']) #labels

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

param_grid = { 
    'n_estimators': [200, 500],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [4,5,6,7,8],
    'criterion' :['gini', 'entropy']
}
CV_rfc = GridSearchCV(estimator=rfc, param_grid=param_grid, cv= 5)
CV_rfc.fit(x_train, y_train)
print(CV_rfc.best_params_)

我得到的结果如下。

{'criterion': 'gini', 'max_depth': 6, 'max_features': 'auto', 'n_estimators': 200}

然后,我将调整后的参数重新应用于x_test,如下所示。

rfc=RandomForestClassifier(random_state=42, criterion ='gini', max_depth= 6, max_features = 'auto', n_estimators = 200, class_weight = 'balanced')
rfc.fit(x_train, y_train)
pred=rfc.predict(x_test)
print(precision_recall_fscore_support(y_test,pred))
print(roc_auc_score(y_test,pred))

但是,我仍然不清楚如何将GridSearchCV10-fold cross validation一起使用(即,不仅将调整后的参数应用于x_test)。即如下所示。

kf = StratifiedKFold(n_splits=10)
for fold, (train_index, test_index) in enumerate(kf.split(X, y), 1):
    X_train = X[train_index]
    y_train = y[train_index]
    X_test = X[test_index]
    y_test = y[test_index]

OR

由于GridSearchCV使用crossvalidation,我们可以同时使用所有Xy并获得最佳结果作为最终结果吗?

很高兴在需要时提供更多详细信息。

2 个答案:

答案 0 :(得分:3)

在这种情况下,您不应执行网格搜索。

在内部,GridSearchCV将分配给它的数据集分为多个 training validation 子集,然后使用提供给它的超参数网格,找到< em>一组在验证子集上得分最高的超参数。

然后,在完成此过程后,对训练数据进行一个最终评分,以了解模型是否为目前为止未知的结果。您的超参数已经过拟合验证子集。如果效果良好,那么下一步就是将模型投入生产/部署。

如果您在内部交叉验证中执行网格搜索,那么您将拥有多个超参数集,每组超参数在其网格搜索验证子项中表现最佳-交叉验证拆分的子集。您无法将这些集合组合为单个一致的超参数规范,因此无法部署模型。

答案 1 :(得分:2)

  

sinceGridSearchCV使用交叉验证,我们可以使用所有X和y并获得最佳结果作为最终结果吗?

否,您不应该调整超级参数(通过GridSearchCV或单个gridSearch()进行调整,因为模型会选择对测试数据也最有效的超级参数。这种方法失去了测试数据的真正目的。这种模型的性能无法一概而论,因为它已经在超参数调整期间看到了这些数据。

请参阅this文档,以更好地了解超参数调整和交叉验证。

文档中的一些图片:

enter image description here