我应该如何拆分我的数据以进行交叉验证和网格搜索?

Posted

技术标签:

【中文标题】我应该如何拆分我的数据以进行交叉验证和网格搜索?【英文标题】:How should I split my data for cross validation and grid search? 【发布时间】:2020-02-19 05:54:18 【问题描述】:

我应该将我的数据分成大小相似的两部分,以便将每一半用于 eaxh 任务,还是我应该对我的整个数据进行网格搜索,然后对我的整个数据再次进行交叉验证以检查我的准确性?

【问题讨论】:

警告:如果您的数据集是时间序列,您可能希望按顺序拆分它,而不是随机拆分。 这不是一个编程的问题,因此这里离题了;有关 ML 理论和方法的问题应发送至 Cross Validated(尽管我认为即使对他们来说也太模糊和宽泛了) 【参考方案1】:

您需要将数据拆分为测试和训练 (20:80)(例如 sklearn 中的 test_train_split),然后使用训练数据运行模型并检查准确性。如果它不是您所期望的,那么您可以尝试应用超参数调整。

您可以通过 GridSearchCV 执行此操作,您需要在其中拟合所需的估计器(取决于问题的类型)和参数值。

附上示例代码:

from sklearn.model_selection import GridSearchCV
# Create the parameter grid based on the results of random search 
param_grid = 
    'bootstrap': [True],
    'max_depth': [50, 55, 60, 65],
    'max_features': ["auto","sqrt", 2, 3],
    'min_samples_leaf': [1, 2, 3],
    'min_samples_split': [2, 3, 4],
    'n_estimators': [60, 65, 70, 75]



grid_search = GridSearchCV(estimator = rfcv, param_grid = param_grid, cv = 3, n_jobs = -1, verbose = 2)

grid_search.fit(X_train, Y_train)
grid_search.best_params_

基于最佳参数结果,您可以微调网格搜索。

例如,如果 n_estimators 的最佳参数值接近 60,那么您需要将值更改为 60,如 [50,55,60,60]。找出确切的值。

然后根据最佳参数值构建机器学习模型。评估训练数据的准确性,然后使用测试数据值预测结果。

rf = rgf(n_estimators = 70, random_state=0, min_samples_split = 2, min_samples_leaf=1, max_features = 'sqrt',bootstrap='True', max_depth=65)
regressor = rf.fit(X_train,Y_train)
pred_tuned = regressor.predict(X_test)

你会发现你的准确性有所提高!!

【讨论】:

以上是关于我应该如何拆分我的数据以进行交叉验证和网格搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如果我在 python 管道中有自定义的集成模型,如何进行交叉验证和网格搜索

我是不是需要同时执行网格搜索(使用交叉验证)和交叉验证方法?

对网格搜索中的所有组合使用交叉验证

如何在没有交叉验证的情况下运行网格搜索?

如何在python中从头开始获取kfold拆分以进行交叉验证?

应该对原始数据还是拆分数据执行交叉验证分数?