Scikit learn sklearn&;pytorch:用于网格搜索的神经网络管道训练的训练测试拆分

Scikit learn sklearn&;pytorch:用于网格搜索的神经网络管道训练的训练测试拆分,scikit-learn,neural-network,pytorch,pipeline,gridsearchcv,Scikit Learn,Neural Network,Pytorch,Pipeline,Gridsearchcv,我正在处理一个相当大的数据集,我们决定将其分组折叠(因为我们在数据集中得到的测量值不应该被拆分,而是折叠了k次) 然后,我们使用groupkfolded数据集和RandomizedGridSearch或BayesenGridSearch对sklearn模型进行网格搜索。为了在这个管道中使用神经网络,我们决定在sklearn接口中安装Pytork。为此,我们使用sklearn.base导入BaseEstimator,ClassifierMixin 然后我们正在建立一条管道: class Neura

我正在处理一个相当大的数据集,我们决定将其分组折叠(因为我们在数据集中得到的测量值不应该被拆分,而是折叠了k次)

然后,我们使用groupkfolded数据集和RandomizedGridSearch或BayesenGridSearch对sklearn模型进行网格搜索。为了在这个管道中使用神经网络,我们决定在sklearn接口中安装Pytork。为此,我们使用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, y, groups=groups)
问题来了: 如上所示,NeuralNetInterface(sklearn分类器)正在等待测试X&y的输入。这是因为在每个训练阶段之后,我们需要评估神经网络的准确性。我不能一开始就对数据集进行一次训练测试分割,因为这会破坏kFold的感觉。所以我想做的是以一种方式定义管道,将列车测试分割的输出传递给神经网络接口。这是行不通的

此外,我真正的问题是:

-groupKFold将4组折叠4次,其中3部分用于培训,一部分用于评分。-->我如何调整管道,使kFold的4个部分中的1个传递到NeuralNetInterface,以便将该部分用于NN评估?我是否需要在不进行测试集的情况下调整NeuralNetInterface?? -或者这是不可能的,我需要在GridSearch中训练测试分割数据,始终将一部分传递给NeuralNetInterface?我怎样才能让它工作呢

我希望我对我的问题描述得足够好,能够理解。 提前谢谢你的帮助


致以最诚挚的问候

嗨,Pierre,如果我没弄错的话,问题是管道的这一部分
train\u test\u split(X,y,test\u size=0.2,random\u state=69))
,因为它不关心来自管道的内容,而是始终使用相同的参数。您是否已经尝试过将
train\u test\u split
封装在一个对象中,该对象“像管道一样说话”(理解
fit
和predict之类的方法),并从管道中获取输入?