1
resposta

Funcionamento do GroupKFold

Fiquei em dúvida de como o GroupKFold funciona. Se a função tem como responsabilidade a divisão em grupos dependendo do 'modelo' nesse caso, por que a variável de modelos de carro foi passada só no cross_validate? O que o GroupKFold retorna? (Li a documentação mas não entendi muito bem)

1 resposta

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:

Xygroups
00.1a1
10.2b2
22.2b1
32.4b2
42.3c2
54.55c2
65.8c3
78.8d3
89d3
910d3

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!