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á 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.
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.
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_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))
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.
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 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 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:
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
Incrível!
Completion taxa melhorada para 3.33
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á 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.
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.
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_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))
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.
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 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 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:
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!