如何处理从嵌套交叉验证中获得的网格搜索的最佳得分?

我已经使用带有嵌套交叉验证的网格搜索优化了随机森林。之后,我知道在对样本外数据进行预测之前,必须使用最佳参数训练整个数据集。

我需要拟合模型两次吗?一次是为了通过嵌套交叉验证找到准确性估计,另一次是使用样本外数据?

请检查我的代码:

#加载数据for name in ["AWA"]:for el in ['Fp1']:    X=sio.loadmat('/home/TrainVal/{}_{}.mat'.format(name, el))['x']    s_y=sio.loadmat('/home/TrainVal/{}_{}.mat'.format(name, el))['y']    y=np.ravel(s_y)    print(name, el, x.shape, y.shape)     print("")#管道clf = Pipeline([('rcl', RobustScaler()),                ('clf', RandomForestClassifier())])   #优化#外部循环sss_outer = StratifiedShuffleSplit(n_splits=2, test_size=0.1, random_state=1)#内部循环sss_inner = StratifiedShuffleSplit(n_splits=2, test_size=0.1, random_state=1)#使用所有参数的完整网格param_grid = {'clf__n_estimators': [10, 12, 15],              'clf__max_features': [3, 5, 10],             }#运行网格搜索grid_search = GridSearchCV(clf, param_grid=param_grid, cv=sss_inner, n_jobs=-1)#第一次拟合!!!!!grid_search.fit(X, y)scores=cross_val_score(grid_search, X, y, cv=sss_outer)#显示内部循环中的最佳参数print(grid_search.best_params_)#显示所有外部循环的平均准确性print(scores.mean())#第二次拟合!!!y_score = grid_search.fit(X, y).score(out-of-sample, y)print(y_score)

回答:

有几件事你需要理解。

当你进行“第一次拟合”时,它会根据sss_inner的cv来拟合网格搜索模型,并将结果存储在grid_search.best_estimator_中(即根据sss_inner折叠的测试数据得分确定的最佳估计器)。

现在你在cross_val_score中使用这个grid_search(嵌套)。你从“第一次拟合”中得到的拟合模型在这里没有用处。cross_val_score克隆估计器,在sss_outer的折叠上调用grid_search.fit()(这意味着sss_outer的训练数据将被呈现给grid_search,它将再次根据sss_inner进行分割)并在sss_outer的测试数据上呈现得分。从cross_val_score得到的模型并未拟合。

现在在你的“第二次拟合”中,你再次像“第一次拟合”那样进行拟合。没有必要这样做,因为它已经拟合过了。只需调用grid_search.score()。它会内部调用best_estimator_score()方法。

你可以查看我的回答,了解更多关于带有网格搜索的嵌套交叉验证的信息。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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