如何解决使用带有sklearn的GroupKFold进行嵌套交叉验证
在我的数据中,有多个条目对应于一个主题,我不会在训练和测试集之间混合这些条目。因此,我查看了GroupKFold
折叠迭代器,根据sklearn
文档,这是“具有不重叠组的K折叠迭代器变体。”
因此,我想使用GroupKFold
来实现嵌套交叉验证,以拆分测试和训练集。
我从this question中给出的模板开始。但是,我在调用网格实例上的fit
方法时遇到错误,说groups
的形状与X
和y
不同。为了解决这个问题,我也使用火车索引对groups
进行了切片。
此实现正确吗?我最关心的是不要在训练和测试集之间混合来自同一组的数据。
inner_cv = GroupKFold(n_splits=inner_fold)
outer_cv = GroupKFold(n_splits=out_fold)
for train_index,test_index in outer_cv.split(x,y,groups=groups):
x_train,x_test = x[train_index],x[test_index]
y_train,y_test = y[train_index],y[test_index]
grid = RandomizedSearchCV(estimator=model,param_distributions=parameters_grid,cv=inner_cv,scoring=get_scoring(),refit='roc_auc_scorer',return_train_score=True,verbose=1,n_jobs=jobs)
grid.fit(x_train,y_train,groups=groups[train_index])
prediction = grid.predict(x_test)
解决方法
可以确认代码正在按预期方式运行(即不在组之间混合数据)的一种方法是,不能传递GroupKFold
对象,而可以传递GroupKFold.split
的输出(索引)到RandomizedSearchCV。例如
grid = RandomizedSearchCV(estimator=model,param_distributions=parameters_grid,cv=inner_cv.split(
x_train,y_train,groups=groups[train_index]),scoring=get_scoring(),refit='roc_auc_scorer',return_train_score=True,verbose=1,n_jobs=jobs)
grid.fit(x_train,y_train)
我相信这会导致相同的拟合结果,在这里,您已经明确给出了交叉验证每一折的训练/验证索引。
据我所知,这两种方式是等效的,但是我认为编写示例的方式更加优雅,因为您没有两次提供x_train
和y_train
。
使用groups
切片train_index
似乎是正确的,因为您只将切片的x
和y
变量传递给fit
方法。我必须提醒自己,内部交叉验证将在外部交叉验证操作的训练子集上进行交叉验证。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。