我已经使用带有嵌套交叉验证的网格搜索优化了随机森林。之后,我知道在对样本外数据进行预测之前,必须使用最佳参数训练整个数据集。
我需要拟合模型两次吗?一次是为了通过嵌套交叉验证找到准确性估计,另一次是使用样本外数据?
请检查我的代码:
#加载数据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()
方法。
你可以查看我的回答,了解更多关于带有网格搜索的嵌套交叉验证的信息。