Introduzindo a separação em conjuntos
Vamos continuar a segunda parte. Já separamos os dois primeiros conjuntos, nos quais definimos as variáveis explicativas e a variável target (alvo), x e y. Agora, vamos separar em mais conjuntos.
Precisamos explicar essa etapa de separação dos conjuntos. Já compreendemos que separam os dados em treino e teste. Aqui, utilizaremos um método um pouco diferente: treino, validação e teste. O que são esses conjuntos?
Vamos usar uma analogia. Imagine que vamos fazer o vestibular ou o Enem no final do ano. Nesse período, utilizamos apostila, livro, internet e videoaula: estamos treinando. Essa é a situação do conjunto de treino. Depois, realizamos simulados semanalmente, quinzenalmente ou mensalmente, conforme possível: estamos no ambiente de validação, verificando o que precisa ser ajustado. Por exemplo, identificamos dificuldades em questões de Brasil Colônia ou em modelos morfoclimáticos de Geografia e ajustamos o que precisamos estudar. No final do ano, fazemos o vestibular ou o Enem: essa é a situação do conjunto de teste. Portanto, temos treino, validação e teste.
Qual é o ponto? Quando treinamos o modelo, verificamos se ele está acertando utilizando o conjunto de validação e vamos ajustando o modelo, realizando um ajuste fino. Ajustamos os hiperparâmetros e verificamos quais parâmetros funcionam para maximizar as métricas de interesse do modelo. Assim, treinamos o modelo para melhorar o desempenho no conjunto de validação.
Precisamos, então, reservar um conjunto de teste e deixá-lo intocado. O modelo não terá acesso a esse conjunto durante o treinamento; vamos treiná-lo para obter bom desempenho no conjunto de validação. Depois que o treinamento e os ajustes estiverem concluídos, verificaremos se, com esse conjunto de dados que o modelo nunca viu, ele consegue generalizar e obter bons resultados. Esse é o objetivo.
Vamos criar esses conjuntos agora e, depois, eles ficarão intocados; não vamos mais mexer neles.
Criando os conjuntos com train_test_split
Mostraremos como criar esses conjuntos. A função train_test_split separa apenas em dois conjuntos. Portanto, faremos em etapas. Primeiro, vamos separar em x_treino_validacao e x_teste, e em seguida em y_treino_validacao e y_teste. Em seguida, usaremos novamente a lógica de separação para obter os subconjuntos desejados. Faremos isso com train_test_split, passando as variáveis necessárias, como x.
Ajustamos a convenção de nomes das variáveis: utilizamos X em maiúsculo para as variáveis explicativas e y em minúsculo para a variável alvo. Para refletir essa convenção no código, definimos X e y desta forma:
X = dados.drop(columns=['id_cliente', 'inadimplente'])
y = dados['inadimplente']
Em seguida, definimos o parâmetro test_size para controlar como os dados serão divididos. Com test_size igual a 0.2 (ou 0.20), obtemos 80% dos dados em X_treino_validacao e y_treino_validacao, e 20% em X_teste e y_teste.
Incluímos o parâmetro stratify para estratificar a divisão com base na variável de interesse, inadimplente. Descobrimos que a taxa de inadimplência é de 22,12%, e queremos manter essa proporção em todos os conjuntos. Isso evita, por exemplo, ter um conjunto de treino com distribuição 50/50 e outro quase sem exemplos positivos, o que não é desejável.
Inserimos as vírgulas necessárias na chamada da função e configuramos random_state com o valor 42. Com esses parâmetros, a primeira separação fica assim:
X_treino_validacao, X_teste, y_treino_validacao, y_teste = train_test_split(
X,
y,
test_size=0.20,
stratify=y,
random_state=42,
)
Executamos o primeiro bloco para verificar possíveis erros. Um erro ocorreu devido ao argumento columns estar escrito de forma incorreta; corrigimos para columns e o bloco passou a executar corretamente.
Realizando a segunda divisão e salvando resultados
Na sequência, realizamos uma nova divisão. Já temos X_treino_validacao, X_teste, y_treino_validacao e y_teste. Agora, utilizamos X_treino_validacao como X de entrada e y_treino_validacao como y, estratificando com base em y_treino_validacao. Definimos test_size como 0.25. Como previamente separamos 80% para treino/validação, ao aplicar 25% sobre esses 80%, obtemos 20% para validação e 60% para treino em relação ao conjunto original. No código, essa segunda divisão fica assim:
X_treino, X_validacao, y_treino, y_validacao = train_test_split(
X_treino_validacao,
y_treino_validacao,
test_size=0.25,
stratify=y_treino_validacao,
random_state=42,
)
Com isso, produzimos X_treino, X_validacao, y_treino e y_validacao, além de já termos X_teste e y_teste. Na primeira divisão, utilizamos o conjunto original. Nesta etapa, utilizamos o “novo conjunto original”, isto é, o subconjunto X_treino_validacao e y_treino_validacao. Executamos essa parte e o processo ocorreu rapidamente e sem erros.
Esta etapa também serve para salvar os conjuntos resultantes. Após salvar, verificamos as proporções: 20% para teste, 20% para validação e 60% para treino. Obtivemos 18.000 linhas para treino, 6.000 linhas para validação e 6.000 linhas para teste, mantendo em todos os conjuntos a taxa de inadimplência próxima de 22,12%.
Confirmamos que tudo foi salvo corretamente. Foram geradas as bases processadas: teste, treino e validacao. É importante salvar: ao salvar, o item fica em destaque amarelo e, na parte inferior, é exibido o comando para realizar o commit, com um nome sugerido. Caso preferido, é possível alterar esse nome.
Salvando as alterações no Git e GitHub
Com os conjuntos de treino, validação e teste preparados, podemos registrar essa etapa no Git e enviar as alterações para o GitHub.
No terminal, dentro da pasta do projeto, primeiro verificamos os arquivos modificados:
Depois, adicionamos as alterações que queremos versionar. Para adicionar todos os arquivos modificados e não ignorados:
Registramos as alterações com uma mensagem que identifica o que foi desenvolvido:
git commit -m "Separa dados em treino, validacao e teste"
Por fim, enviamos o commit para o repositório remoto:
Assim, mantemos o histórico do projeto organizado e conseguimos acompanhar sua evolução no GitHub.
Nos vemos no próximo vídeo.