Olá Fernando! Tudo bem por aí?
Primeiramente gostaria de pedir desculpas pela demora em te responder.
O GroupKFold possui a função de dividir nosso conjunto de treino e teste em k-dobras (k-fold) de forma que as amostras com mesmo grupo não sejam representadas nos conjuntos de teste e teste simultaneamente. Fazendo isso nós temos uma melhor aproximação de como o nosso modelo funcionará no mundo real, pois ele está sempre sendo treinado com dados de alguns grupos, e quando vamos testar colocamos um grupo que o nosso modelo nunca viu, e essas características podem ser algo totalmente diferentes das demais, pois amostras de grupos diferentes tendem a ter características diferentes também. Então o GroupKFold nos dá a resposta se nosso modelo é generalista ou não.
Acredito que a forma como esse método trabalha ficará mais clara com um exemplo:
# Entendendo o GroupKFold
from sklearn.model_selection import GroupKFold
X = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10] # Variável X, representando a característica da amostra
y = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"]
groups = [1, 2, 1, 2, 2, 2, 3, 3, 3, 3] # Grupos das amostras
gkf = GroupKFold(n_splits=3)
for treino, teste in gkf.split(X, y, groups=groups):
print("treino = %s, teste = %s" % (treino, teste))
Saída:
treino = [0 1 2 3 4 5], teste = [6 7 8 9]
treino = [0 2 6 7 8 9], teste = [1 3 4 5]
treino = [1 3 4 5 6 7 8 9], teste = [0 2]
Esses valores de saída representam os índices das amostras.
Talvez olhando separado assim fique complicado de visualizar, vou deixar aqui a visualização em forma de DataFrame dos dados que estamos trabalhando:
| X | y | groups |
---|
0 | 0.1 | a | 1 |
1 | 0.2 | b | 2 |
2 | 2.2 | b | 1 |
3 | 2.4 | b | 2 |
4 | 2.3 | c | 2 |
5 | 4.55 | c | 2 |
6 | 5.8 | c | 3 |
7 | 8.8 | d | 3 |
8 | 9 | d | 3 |
9 | 10 | d | 3 |
Estamos trabalhando com os grupos: 1, 2, 3. Os índices de onde cada grupos da amostra esta é:
- Grupo 1 -> índices: 0, 2
- Grupo 2 -> Índices: 1, 3, 4, 5
- Grupo 3 -> 6, 7, 8, 9
Então quando executarmos o GroupKFold ele irá garantir que o as amostras do grupos não estejam simultaneamente nos treino e teste, e comprovamos isso na saída do nosso algoritmo. Como nossa divisão é para 3 separações (n_splits=3)
então cada um dos nossos 3 grupos serão utilizados para teste de cada vez.
Quando consultamos a documentação há o titulo: class sklearn.model_selection.GroupKFold(n_splits=5)
, percebemos então que se trata de uma classe, portanto quando fazemos gkf = GroupKFold(n_splits=3)
estamos instanciando um objeto dessa classe. Caso não possua familiaridade com o POO (Programação orientada a objetos), deixo como recomendação esse artigo.
O motivo dele está sendo passado somente no cross_validate é porque nesse método você pode fazer essa divisão entre os grupos (feita no nosso exemplo) internamente através do parâmetro groups, esse método é utilizado quando o parâmetro cv (que é a estratégia de validação cruzada a ser utilizada) possui também um parâmetro groups, que é o caso GroupKFold em que os métodos responsáveis por essa divisão possui o parâmetro groups.
Espero ter ajudado, mas se ainda persistir alguma dúvida estou sempre à disposição.
:)
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!