Scikit learn sklearn&;pytorch:用于网格搜索的神经网络管道训练的训练测试拆分
我正在处理一个相当大的数据集,我们决定将其分组折叠(因为我们在数据集中得到的测量值不应该被拆分,而是折叠了k次) 然后,我们使用groupkfolded数据集和RandomizedGridSearch或BayesenGridSearch对sklearn模型进行网格搜索。为了在这个管道中使用神经网络,我们决定在sklearn接口中安装Pytork。为此,我们使用sklearn.base导入BaseEstimator,ClassifierMixin 然后我们正在建立一条管道: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
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之类的方法),并从管道中获取输入?