sklearn&pytorch:训练测试拆分,用于管道搜索中的神经网络训练,以进行网格搜索

问题描述

我正在研究一个非常大的数据集,我们决定将其分组(因为我们在数据集中得到的测量值不应拆分,但应折叠k倍)。

然后,我们使用groupkfolded数据集以及RandomizedGridSearch或BayesenGridSearch来对sklearn模型进行网格搜索。为了在该管道中使用神经网络,我们决定将pytorch安装在sklearn接口中。为此,我们从sklearn.base导入了BaseEstimator,ClassifierMixin。

然后我们正在建立管道:

class Neural_Net_Interface(ClassifierMixin,BaseEstimator):
    def __init__(self,X_test,y_test,Max_num_epochs,Early_Stopping,and so on...):
     self.....

    def fit(self,X_train,y_train):
       ...

    def predict(self,X):
       ...

pipeline_nn = Pipeline([('std',StandardScaler()),('splitter',train_test_split(X,y,test_size=0.2,random_state=69)),('nn',Neural_Net_Interface(X_test=X,y_test=y,Max_num_epochs=3,Early_Stopping=True,... (20 more parameters))])

cv_object = GroupKFold(n_splits=np.max(group_vector) + 1)

model_grid_cv = BayesSearchCV(estimator=pipeline_nn,search_spaces=search_space,scoring=my_scorer,optimizer_kwargs={'base_estimator': 'NN','n_initial_points': 20},cv=cv_object,n_jobs=N_JOBS,verbose=100,n_iter=N_ITER,n_points=N_POINTS,iid=False,random_state=69)

model_grid_cv.fit(X,groups=groups)

问题来了: 如您所见,NeuralNetInterface(sklearn分类器)正在等待测试X和y的输入。这是因为在每个训练时期之后,我们需要评估NN的准确性。我一开始就无法训练一次测试拆分数据集,因为这会破坏kFold的意义。因此,我想做的是以一种方式将管道定义为:将火车测试拆分的输出传递到神经网络接口。这不起作用。

除了我真正的问题是:

-groupKFold将4组折叠4次,训练分为3个部分,得分估计由1个部分组成。 ->如何调整管道的方式,将kFold的4个部分中的1个传递给NeuralNetInterface,以便将该部分用于NN评估?我是否需要调整NeuralNetInterface而不使用测试集? -还是那不可能,我需要训练测试拆分GridSearch中的数据,始终将一部分传递给NeuralNetInterface?我该如何工作?

我希望我对问题的描述足够好,足以理解。 感谢您的提前帮助!

最诚挚的问候

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)