Menu
CoddyTech

Comparando Modelos de Forma Justa

Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 38 de 58.

Comparar modelos em uma única divisão é como jogar cara ou coroa: um deles pode acabar com um conjunto de teste favorável por sorte. Use as mesmas cinco partições para todos os modelos. Para 150 cédulas, verdadeiras ou falsas:

Pontuações das cinco partições por modelo, mostradas como pontos, com uma linha preta em cada média. Os pontos de k-NN ficam próximos uns dos outros em torno de 0.867; os da regressão logística se espalham de 0.73 a 0.93 em torno de 0.873; a árvore fica atrás, com 0.807

k-NN e a regressão logística empatam dentro da margem de variação, e o k-NN é mais estável. A árvore fica atrás.

Um separador KFold embaralha as linhas uma vez e fornece a cada modelo os mesmos folds:

from sklearn.model_selection import KFold

folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
    scores = cross_val_score(model, X, y, cv=folds)
    print(f"{scores.mean():.3f} {scores.std():.3f}")

Ele imprime os números no gráfico:

0.867 0.042
0.873 0.074
0.807 0.077

Escolha a maior média; quando as médias estiverem próximas, o menor desvio padrão.

challenge icon

Desafio

Médio

Um site de culinária prevê quais visitantes preparam uma receita que abrem. O código inicial avalia três modelos em uma única divisão, e a árvore vence. Avalie de forma justa; o programa lê o número de divisões.

  1. Crie um KFold com esse número de divisões, shuffle=True e random_state=0.
  2. Faça a validação cruzada de cada modelo nessas divisões; imprima a média e o desvio padrão, com 3 casas decimais.
  3. Imprima o modelo com a maior média.

Para outros visitantes e 5:

One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logistic

Experimente você mesmo

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

n_folds = int(input())

# Não altere as linhas abaixo: 300 visitantes, 6 hábitos de navegação; o rótulo 1 significa que prepararam a receita
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
                           flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
          DecisionTreeClassifier(max_depth=4, random_state=0)]

# Uma única divisão elege um vencedor
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
    model.fit(X_train, y_train)
    single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado supervisionado

Pratique por conta própria: Compilador de Python online