1
resposta

Minha solução do desfaio de machine learning completa

# Importações
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler, LabelEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.dummy import DummyClassifier
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import pickle

# Carregamento dos dados
dados = pd.read_csv('churn.csv')
dados.drop(columns='id_cliente', inplace=True)

# Visualizações categóricas
variaveis_categoricas = ['pais', 'sexo_biologico', 'tem_cartao_credito', 'membro_ativo']
for var in variaveis_categoricas:
    sns.countplot(data=dados, x=var, hue='churn')
    plt.title(f'Distribuição de {var}')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()

# Visualizações numéricas
variaveis_numericas = ['score_credito', 'idade', 'anos_de_cliente', 'saldo', 'servicos_adquiridos', 'salario_estimado']
for var in variaveis_numericas:
    sns.histplot(data=dados, x=var, kde=True, bins=30)
    plt.title(f'Distribuição: {var}')
    plt.tight_layout()
    plt.show()

# Separação de X e y
x = dados.drop('churn', axis=1)
y = LabelEncoder().fit_transform(dados['churn'])

# Pré-processador
col_cat = x.select_dtypes(include='object').columns.tolist()
col_num = x.select_dtypes(exclude='object').columns.tolist()

preprocessador = ColumnTransformer(transformers=[
    ('onehot', OneHotEncoder(drop='if_binary', sparse_output=False), col_cat),
    ('scaler', MinMaxScaler(), col_num)
])

# Divisão dos dados
x_treino, x_teste, y_treino, y_teste = train_test_split(x, y, test_size=0.2, stratify=y, random_state=42)

# Dummy Classifier (modelo base)
dummy = DummyClassifier(strategy='most_frequent', random_state=42)
dummy_pipe = Pipeline([('pre', preprocessador), ('modelo', dummy)])
dummy_pipe.fit(x_treino, y_treino)
acc_dummy = dummy_pipe.score(x_teste, y_teste)

# Árvore de Decisão
arvore = DecisionTreeClassifier(max_depth=4, random_state=42)
arvore_pipe = Pipeline([('pre', preprocessador), ('modelo', arvore)])
arvore_pipe.fit(x_treino, y_treino)
acc_tree = arvore_pipe.score(x_teste, y_teste)

# KNN
knn = KNeighborsClassifier()
knn_pipe = Pipeline([('pre', preprocessador), ('modelo', knn)])
knn_pipe.fit(x_treino, y_treino)
acc_knn = knn_pipe.score(x_teste, y_teste)

# Avaliação
print(f"Acurácia Dummy: {acc_dummy:.4f}")
print(f"Acurácia Árvore: {acc_tree:.4f}")
print(f"Acurácia KNN: {acc_knn:.4f}")

# Escolha do melhor modelo
if acc_knn > acc_tree and acc_knn > acc_dummy:
    melhor_pipe, nome_arquivo = knn_pipe, 'modelo_knn.pkl'
elif acc_tree > acc_dummy:
    melhor_pipe, nome_arquivo = arvore_pipe, 'modelo_arvore.pkl'
else:
    melhor_pipe, nome_arquivo = dummy_pipe, 'modelo_dummy.pkl'

# Salvando modelo
with open(nome_arquivo, 'wb') as f:
    pickle.dump(melhor_pipe, f)

print(f"Modelo salvo como: {nome_arquivo}")

# Carrega o modelo salvo
with open(nome_arquivo, 'rb') as f:
    modelo_carregado = pickle.load(f)

# Novo dado
novo_dado = pd.DataFrame([{
    'score_credito': 850,
    'pais': 'França',
    'sexo_biologico': 'Homem',
    'idade': 27,
    'anos_de_cliente': 3,
    'saldo': 56000,
    'servicos_adquiridos': 1,
    'tem_cartao_credito': 'sim',
    'membro_ativo': 'sim',
    'salario_estimado': 85270.00
}])

# Previsão
previsao = modelo_carregado.predict(novo_dado)
print("Previsão [0=Não, 1=Sim]:", previsao[0])
1 resposta

Bom dia, Paulo! Tudo bom?

Excelente! Siga praticando com os desafios e sempre compartilhe conosco.

Você soube aplicar pipelines de forma eficiente, aproveitou o ColumnTransformer para preparar os dados de maneira estruturada e entendeu como o processamento dos dados é essencial para o desempenho dos modelos de machine learning.

Como dica adicional, experimente utilizar o método .predict_proba() quando quiser entender o grau de confiança da previsão de um modelo. Assim:

modelo_carregado.predict_proba(novo_dado)

Com isso, você poderá interpretar quão confiante o modelo está em relação à saída prevista.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!