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:
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.077Escolha a maior média; quando as médias estiverem próximas, o menor desvio padrão.
Desafio
MédioUm 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.
- Crie um
KFoldcom esse número de divisões,shuffle=Trueerandom_state=0. - 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.
- 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: logisticExperimente 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
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
1Seu primeiro modelo
Aprendendo com exemplosConjuntos de treino e testeAjustar e preverAvaliar um modeloRecapitulação: classificador de sementes4Regressão logística
Previsões de sim ou nãoO limiar de decisãoPesos como evidênciasVárias classesRevisão: filtro de spam2Vizinhos Mais Próximos
Como o k-NN DecideEscolhendo kLimites de DecisãoEscalonamento para VizinhosRevisão: Vizinhos do Vinho5Avaliando Classificadores
A Matriz de ConfusãoPrecisão e RevocaçãoA Pontuação F1Classes DesbalanceadasCurvas ROCRecapitulação: Teste de Triagem8Validação Cruzada
Validação K-FoldComparando Modelos de Forma JustaBusca em GradeRevisão: Consertos de Skate11Projeto: Espécies de Pinguins
Conheça os PinguinsPrepare os DadosEscolha um ModeloAjuste o VencedorColoque o Modelo em Produção3Regressão Linear
Prevendo númerosVárias característicasMedindo errosGráficos de resíduosRevisão: aluguel de bicicletas6Árvores de Decisão
Árvores fazem perguntasLendo uma árvoreProfundidade da árvoreImportância das característicasRevisão: decisões de empréstimoPratique por conta própria: Compilador de Python online