Divisã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.
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.
123456789101112131415161718192021from 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))
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.
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 correctly+predicted incorrectlypredicted correctlyApó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=5accuracy1+accuracy2+...+accuracy5É 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:
12345678910111213141516171819from 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())
A métrica utilizada por padrão para classificação é a acurácia.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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
Divisã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.
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.
123456789101112131415161718192021from 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))
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.
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 correctly+predicted incorrectlypredicted correctlyApó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=5accuracy1+accuracy2+...+accuracy5É 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:
12345678910111213141516171819from 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())
A métrica utilizada por padrão para classificação é a acurácia.
Obrigado pelo seu feedback!