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

我正在使用GridSearchCVRandomForest进行超参数调优,如下所示。

X = np.array(df[features]) #all featuresy = np.array(df['gold_standard']) #labelsx_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折交叉验证一起使用(即不仅仅是将调优后的参数应用到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]

或者

由于GridSearchCV使用交叉验证,我们是否可以使用所有的Xy,并将最佳结果作为最终结果?

如果需要,我很乐意提供更多细节。


回答:

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

在内部,GridSearchCV将提供给它的数据集分割成各种训练验证子集,并使用提供给它的超参数网格,找到在验证子集上得分最高的单一超参数集

然后,训练-测试分割的目的是在完成这个过程后,对模型之前未知的测试数据进行一次最终评分,以查看您的超参数是否过度拟合了验证子集。如果表现良好,那么下一步就是将模型投入生产/部署。

如果您在交叉验证内部进行网格搜索,那么您将得到多个超参数集,每个集都在其网格搜索验证子集上表现最佳。您无法将这些集组合成一个连贯的超参数规格,因此无法部署您的模型。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注