Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Divisão Treino-Teste e Validação Cruzada | Seção
Practice
Projects
Quizzes & Challenges
Questionários
Challenges
/
Fundamentos do Aprendizado Supervisionado

bookDivisão Treino-Teste e Validação Cruzada

Nos capítulos anteriores, construímos os modelos e previmos novos valores. Porém, não sabemos o quão bem o modelo está performando e se essas previsões são confiáveis.

Divisão em Treino e Teste

Para medir o desempenho do modelo, é necessário um subconjunto de dados rotulados que o modelo não tenha visto. Portanto, dividimos aleatoriamente todos os dados rotulados em conjunto de treino e conjunto de teste.

Isso pode ser feito utilizando a função train_test_split() do sklearn.

Argumentos:

  • X — um array de valores das variáveis preditoras;
  • y — um array de valores do alvo;
  • test_size — proporção do conjunto de teste;

Retornos:

  • X_train, X_test, y_train, y_test — arrays dos mesmos tipos de dados de X e y.

Normalmente, a divisão do modelo é de cerca de 70-90% para o conjunto de treinamento e 10-30% para o conjunto de teste.

Note
Nota

Quando o seu conjunto de dados possui milhões de instâncias, utilizar apenas alguns milhares para teste geralmente é mais do que suficiente. Nesses casos, é possível reservar até menos de 10% dos dados para teste.

Agora, é possível treinar o modelo utilizando o conjunto de treinamento e avaliar sua acurácia no conjunto de teste.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Mas essa abordagem apresenta algumas falhas:

  • Nem todos os dados disponíveis são utilizados para o treinamento, o que poderia melhorar o modelo;
  • Como a avaliação da acurácia do modelo é feita em uma pequena parte dos dados (conjunto de teste), essa métrica pode ser pouco confiável em conjuntos de dados pequenos. É possível executar o código acima várias vezes e observar como a acurácia muda a cada nova amostra do conjunto de teste.

Validação Cruzada

A validação cruzada é projetada para lidar com o problema de overfitting e garantir que o modelo consiga generalizar bem para novos dados não vistos. Pode-se pensar nela como um treinamento em sala de aula para o modelo — ajuda o modelo a aprender de forma mais equilibrada antes de enfrentar o teste final real.

A ideia é embaralhar todo o conjunto de dados e dividi-lo em n partes iguais, chamadas de folds. Em seguida, o modelo passa por n iterações. Em cada iteração, n-1 folds são usados para treinamento e 1 fold é usado para validação. Dessa forma, cada parte dos dados é utilizada para validação uma vez, proporcionando uma estimativa mais confiável do desempenho do modelo.

Vale lembrar que a validação cruzada não substitui o conjunto de teste. Após utilizar a validação cruzada para escolher e ajustar o modelo, é necessário avaliá-lo em um conjunto de teste separado para obter uma avaliação imparcial de seu desempenho no mundo real.

Note
Nota

Uma escolha comum para o número de divisões é 5. Nesse caso, uma divisão será usada como o conjunto de teste, e as 4 divisões restantes serão usadas para o treinamento.

Treinamos cinco modelos com subconjuntos ligeiramente diferentes. Para cada modelo, calculamos a acurácia do conjunto de teste:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Após isso, podemos calcular a média dessas 5 pontuações de acurácia, que será nossa pontuação de acurácia de validação cruzada:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

É mais confiável porque calculamos a pontuação de acurácia usando todos os nossos dados – apenas divididos de forma diferente em cinco iterações.

Agora que sabemos o quão bem o modelo se comporta, podemos reajustá-lo utilizando o conjunto de dados completo.

Felizmente, o sklearn fornece a função cross_val_score() para avaliar o modelo usando validação cruzada, então você não precisa implementá-la manualmente:

Argumentos:

  • estimator — o objeto do modelo;
  • X — um array com os valores das variáveis preditoras;
  • y — um array com os valores do alvo;
  • cv — o número de divisões (5 por padrão);
  • scoring — a métrica (acurácia por padrão);

Retorno:

  • scores — um array com as pontuações de cada iteração.

Veja um exemplo de como utilizar a validação cruzada com um modelo k-NN treinado no conjunto de dados de avaliações de Star Wars:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

A métrica utilizada por padrão para classificação é a acurácia.

question mark

Selecione todas as afirmações corretas.

Select all correct answers

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 19

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

bookDivisão Treino-Teste e Validação Cruzada

Deslize para mostrar o menu

Nos capítulos anteriores, construímos os modelos e previmos novos valores. Porém, não sabemos o quão bem o modelo está performando e se essas previsões são confiáveis.

Divisão em Treino e Teste

Para medir o desempenho do modelo, é necessário um subconjunto de dados rotulados que o modelo não tenha visto. Portanto, dividimos aleatoriamente todos os dados rotulados em conjunto de treino e conjunto de teste.

Isso pode ser feito utilizando a função train_test_split() do sklearn.

Argumentos:

  • X — um array de valores das variáveis preditoras;
  • y — um array de valores do alvo;
  • test_size — proporção do conjunto de teste;

Retornos:

  • X_train, X_test, y_train, y_test — arrays dos mesmos tipos de dados de X e y.

Normalmente, a divisão do modelo é de cerca de 70-90% para o conjunto de treinamento e 10-30% para o conjunto de teste.

Note
Nota

Quando o seu conjunto de dados possui milhões de instâncias, utilizar apenas alguns milhares para teste geralmente é mais do que suficiente. Nesses casos, é possível reservar até menos de 10% dos dados para teste.

Agora, é possível treinar o modelo utilizando o conjunto de treinamento e avaliar sua acurácia no conjunto de teste.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Mas essa abordagem apresenta algumas falhas:

  • Nem todos os dados disponíveis são utilizados para o treinamento, o que poderia melhorar o modelo;
  • Como a avaliação da acurácia do modelo é feita em uma pequena parte dos dados (conjunto de teste), essa métrica pode ser pouco confiável em conjuntos de dados pequenos. É possível executar o código acima várias vezes e observar como a acurácia muda a cada nova amostra do conjunto de teste.

Validação Cruzada

A validação cruzada é projetada para lidar com o problema de overfitting e garantir que o modelo consiga generalizar bem para novos dados não vistos. Pode-se pensar nela como um treinamento em sala de aula para o modelo — ajuda o modelo a aprender de forma mais equilibrada antes de enfrentar o teste final real.

A ideia é embaralhar todo o conjunto de dados e dividi-lo em n partes iguais, chamadas de folds. Em seguida, o modelo passa por n iterações. Em cada iteração, n-1 folds são usados para treinamento e 1 fold é usado para validação. Dessa forma, cada parte dos dados é utilizada para validação uma vez, proporcionando uma estimativa mais confiável do desempenho do modelo.

Vale lembrar que a validação cruzada não substitui o conjunto de teste. Após utilizar a validação cruzada para escolher e ajustar o modelo, é necessário avaliá-lo em um conjunto de teste separado para obter uma avaliação imparcial de seu desempenho no mundo real.

Note
Nota

Uma escolha comum para o número de divisões é 5. Nesse caso, uma divisão será usada como o conjunto de teste, e as 4 divisões restantes serão usadas para o treinamento.

Treinamos cinco modelos com subconjuntos ligeiramente diferentes. Para cada modelo, calculamos a acurácia do conjunto de teste:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Após isso, podemos calcular a média dessas 5 pontuações de acurácia, que será nossa pontuação de acurácia de validação cruzada:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

É mais confiável porque calculamos a pontuação de acurácia usando todos os nossos dados – apenas divididos de forma diferente em cinco iterações.

Agora que sabemos o quão bem o modelo se comporta, podemos reajustá-lo utilizando o conjunto de dados completo.

Felizmente, o sklearn fornece a função cross_val_score() para avaliar o modelo usando validação cruzada, então você não precisa implementá-la manualmente:

Argumentos:

  • estimator — o objeto do modelo;
  • X — um array com os valores das variáveis preditoras;
  • y — um array com os valores do alvo;
  • cv — o número de divisões (5 por padrão);
  • scoring — a métrica (acurácia por padrão);

Retorno:

  • scores — um array com as pontuações de cada iteração.

Veja um exemplo de como utilizar a validação cruzada com um modelo k-NN treinado no conjunto de dados de avaliações de Star Wars:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

A métrica utilizada por padrão para classificação é a acurácia.

question mark

Selecione todas as afirmações corretas.

Select all correct answers

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 19
some-alt