python – 有没有办法在GridSearchCV中查看交叉验证的折叠?

我目前正在使用
Python中的GridSearchCV进行3倍的cv来优化超参数.我只是想知道是否有任何方法可以在GridSearchCV中使用的cv中查看训练和测试数据的索引? 最佳答案 如果你不想在CV阶段折叠之前将样品洗牌,你可以.您可以将KFold(或另一个CV类)的实例传递给GridSearchCV构造函数,并像这样访问它的折叠:

import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold

params = {'penalty' : ['l1', 'l2'], 'C' : [1,2,3]}
grid = GridSearchCV(LogisticRegression(), params, cv=KFold(n_splits=3))

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [5, 6], [7, 8]])

for train, test in grid.cv.split(X):
    print('TRAIN: ', train, ' TEST: ', test)

打印:

TRAIN:  [2 3 4 5]  TEST:  [0 1]
TRAIN:  [0 1 4 5]  TEST:  [2 3]
TRAIN:  [0 1 2 3]  TEST:  [4 5]

对于非混洗的CV,折叠总是相同的,因此您可以确定这些是在网格搜索期间使用的折叠.

如果你想在折叠之前对样本进行混洗,那就更复杂了,因为每次调用cv.split()都会产生不同的分割.我可以想到两种方式:

>您可以为CV对象提供固定的random_state,例如KFold(n_splits = 3,shuffle = True,random_state = 42).
>在创建GridSearchCV对象之前,从KFold迭代器创建一个列表.

因此,对于第二种方法,请执行:

grid = GridSearchCV(LogisticRegression(), params, 
                    cv=list(KFold(n_splits=3, shuffle=True).split(X)))

除了迭代器之外,列表是固定对象,除非您手动操作它,否则它将在所有GridSearch迭代中保持相同的值.

点赞