Após realizar a predição com a árvore e analisar o gráfico, como eu faço para adicionar a classificação aos dados originais, e saber exatamente quem foi classificado com Sim ou Não ??
Após realizar a predição com a árvore e analisar o gráfico, como eu faço para adicionar a classificação aos dados originais, e saber exatamente quem foi classificado com Sim ou Não ??
Olá Rafael! Tudo tranquilo?
Há algumas abordagens para o problema apresentado por você, vou fazer uma dessas abordagens. Caso não seja exatamente o que você procura, nos retorne informando mais alguns detalhes acerca do problema para te ajudarmos da melhor forma possível, tudo bem?
import numpy as np
import graphviz
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
SEED = 5
np.random.seed(SEED)
raw_treino_x, raw_teste_x, treino_y, teste_y = train_test_split(x, y, test_size=0.25, stratify=y)
scaler = StandardScaler()
scaler.fit(treino_x)
treino_x = scaler.transform(raw_treino_x)
teste_x = scaler.transform(raw_teste_x)
modelo = DecisionTreeClassifier(max_depth=3)
modelo.fit(raw_treino_x, treino_y)
previsoes = modelo.predict(teste_x)
taxa_de_acerto = accuracy_score(teste_y, previsoes)
print(f"A acurácia foi de {taxa_de_acerto*100}%")
print(f"Treinaremos com {len(treino_x)} elementos e testaremos com {len(teste_x)} elementos")
Saída:
A acurácia foi de 79.28%
Treinaremos com 7500 elementos e testaremos com 2500 elementos
Nesse trecho de código apresentado em aula, foi feita a separação do conjunto de dados que serão usados para treino e para teste. Nosso algoritmo aprende com os dados de treino, mas a acurácia é obtida com o conjunto de teste, que é onde realizamos nossas previsões. Então vamos adicionar uma coluna "previsao" que irá nos dizer como nossa árvore de decisão classificou nosso conjunto usado para teste. Para isso vamos usar previsoes = modelo.predict(teste_x)
, que já nos retorna a classificação da nossa árvore, essa variável ao nosso DataFrame de teste.
# Código para adicionar uma coluna com as previsões em raw_teste_x.
# Dicionário usado para fazer a troca de 1 para sim e 0 para não.
mapa = {
0: 'Não',
1: 'Sim'
}
raw_teste_x_copy = raw_teste_x.copy() # Cria uma cópia para não trabalharmos com o DataFrame original.
raw_teste_x_copy['previsoes'] = previsoes # Adiciona a coluna com as previsões.
raw_teste_x_copy['previsoes'] = raw_teste_x_copy['previsoes'].map(mapa) # Faz o mapeamento com o variável mapa. Ou seja, onde 1 fica com 'Sim' e onde 0 fica com 'Não'.
raw_teste_x_copy.head() # Imprime as 5 primeiras linhas do DataFrame.
Saída:
preco | idade_do_modelo | km_por_ano | previsoes | |
---|---|---|---|---|
756 | 83821.7 | 19 | 21219.1 | Não |
4715 | 46327.9 | 23 | 12255.1 | Sim |
8604 | 39847 | 20 | 18991.8 | Sim |
8226 | 88881.9 | 12 | 13872.5 | Não |
4148 | 79948.4 | 18 | 17710.8 | Não |
Essas previsões são exatamente como nossa árvore de decisão classificou os dados de teste. Observe que se comparar essas previsões com os dados já conhecidos de como deveria ser a classificação, que são os dados de teste_y, teremos alguns valores diferentes, que faz com que nossa acurácia seja diferente de 100%. Caso queira conferir se realmente está correto, basta comparar os resultados da acurácia no primeiro trecho de código aqui da resposta com esse:
sum(previsoes == teste_y)/len(previsoes)*100
Saída:
79.28
Como foram correspondentes os valores, significa que nossa coluna previsoes está correta.
Espero ter ajudado, mas se tiver alguma dúvida estou sempre à disposição.
:)