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 | Classificador K-NN
Classificação com Python

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á desempenhando e se essas previsões são confiáveis.

Divisão em Treinamento 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 treinamento e conjunto de teste.

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

Normalmente, divide-se o modelo em cerca de 70-90% para o conjunto de treinamento e 10-30% para o conjunto de teste.

Note
Nota

Quando o 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 = scaler.fit_transform(X_train) X_test = 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), esse valor pode ser pouco confiável em conjuntos de dados menores. É 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 foi desenvolvida para lidar com o problema de overfitting e garantir que o modelo consiga generalizar bem para novos dados não vistos anteriormente. 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 ressaltar 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 conjunto de teste, e as 4 divisões restantes serão usadas para 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 desempenho do modelo, podemos reajustá-lo utilizando todo o conjunto de dados.

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

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 the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 6

Pergunte à IA

expand

Pergunte à IA

ChatGPT

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

Suggested prompts:

Can you explain the difference between train-test split and cross-validation?

How do I choose the right number of folds for cross-validation?

What are some common pitfalls when using cross-validation?

Awesome!

Completion rate improved to 4.17

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á desempenhando e se essas previsões são confiáveis.

Divisão em Treinamento 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 treinamento e conjunto de teste.

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

Normalmente, divide-se o modelo em cerca de 70-90% para o conjunto de treinamento e 10-30% para o conjunto de teste.

Note
Nota

Quando o 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 = scaler.fit_transform(X_train) X_test = 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), esse valor pode ser pouco confiável em conjuntos de dados menores. É 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 foi desenvolvida para lidar com o problema de overfitting e garantir que o modelo consiga generalizar bem para novos dados não vistos anteriormente. 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 ressaltar 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 conjunto de teste, e as 4 divisões restantes serão usadas para 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 desempenho do modelo, podemos reajustá-lo utilizando todo o conjunto de dados.

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

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 the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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