<jupyter_start><jupyter_text>Classificação com dados desbalanceados  Carregamento da base de dados<jupyter_code>import pandas as pd
import random
import numpy as np
dataset = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/Bases de dados/credit_data.csv')
dataset.shape
dataset.head()
dataset.dropna(inplace=True)
dataset.shape
import seaborn as sns
sns.countplot(dataset['c#default']);
X = dataset.iloc[:, 1:4].values
X.shape
X
y = dataset.iloc[:, 4].values
y.shape
y<jupyter_output><empty_output><jupyter_text>Base de treinamento e teste<jupyter_code>from sklearn.model_selection import train_test_split
X_treinamento, X_teste, y_treinamento, y_teste = train_test_split(X, y, test_size = 0.2, stratify = y)<jupyter_output><empty_output><jupyter_text>Teste amostragem estratificada<jupyter_code>X_treinamento.shape, y_treinamento.shape<jupyter_output><empty_output><jupyter_text>Devem possui um número igual de registros<jupyter_code>X_teste.shape, y_teste.shape
np.unique(y, return_counts=True)
1714 / len(dataset), 283 / len(dataset)
np.unique(y_treinamento, return_counts=True)
1371 / len(y_treinamento), 226 / len(y_treinamento)<jupyter_output><empty_output><jupyter_text>Possuem a mesma proporção (amostra estratificada feita corretamente).<jupyter_code>np.unique(y_teste, return_counts=True)
57 / len(y_teste)<jupyter_output><empty_output><jupyter_text>Amostra estratificada feita corretamente.  Classificação com Naive Bayes<jupyter_code>from sklearn.naive_bayes import GaussianNB<jupyter_output><empty_output><jupyter_text>Treinando o algoritmo:<jupyter_code>modelo = GaussianNB()
modelo.fit(X_treinamento, y_treinamento)<jupyter_output><empty_output><jupyter_text>Fazendo as previsões:<jupyter_code>previsoes = modelo.predict(X_teste)
previsoes
y_teste<jupyter_output><empty_output><jupyter_text>Comparando o quanto foi bem o algoritmo<jupyter_code>from sklearn.metrics import accuracy_score
accuracy_score(y_teste,previsoes)
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_teste, previsoes)
cm
sns.heatmap(cm, annot=True)
(336 + 33)/ (336 + 24 + 7 + 33)
# Percentual de acerto para pessoas que pagaram
336 / (336 + 7)
# Mais registro, faz com ele classifica melhor
# Percentual de acerto para pessoas que não pagaram
33 / (33 + 24)
# Perdas: 5000
# Clientes não pagadores: 1000
1000 * 43 / 100
430 * 5000     # Dá o prejuízo<jupyter_output><empty_output><jupyter_text>Subamostragem (undersampling) - Tomek links- https://imbalanced-learn.readthedocs.io/en/stable/user_guide.html Importando a biblioteca que possui a técnica TomekLinks<jupyter_code>from imblearn.under_sampling import TomekLinks<jupyter_output><empty_output><jupyter_text>Vai apagar apenas registros da classe majoritária, quando um registro encontra-se em TomekLinks<jupyter_code>tl = TomekLinks(sampling_strategy='majority')
X_under, y_under = tl.fit_resample(X, y)
X_under.shape, y_under.shape
np.unique(y, return_counts=True)<jupyter_output><empty_output><jupyter_text>Diminuiu apenas os registros da classe 0.<jupyter_code>np.unique(y_under, return_counts=True)<jupyter_output><empty_output><jupyter_text>Separação da base de dados (depois do undersampling). A maior parte para treinamento e a menor para testes.<jupyter_code>X_treinamento_u, X_teste_u, y_treinamento_u, y_teste_u = train_test_split(X_under, y_under, test_size=0.2, stratify=y_under)
X_treinamento_u.shape, X_teste_u.shape
modelo_u = GaussianNB()  # Carrega o modelo
modelo_u.fit(X_treinamento_u, y_treinamento_u)   # Treina o modelo
previsoes_u = modelo_u.predict(X_teste_u)   # Damos a base teste e ele criaria previria um y_teste<jupyter_output><empty_output><jupyter_text>Depois comparamos os resultados<jupyter_code>accuracy_score(previsoes_u, y_teste_u)
cm_u = confusion_matrix(y_teste_u, previsoes_u)
cm_u
315 / (315 + 8)
32 / (25 + 32)<jupyter_output><empty_output><jupyter_text>Sobreamostragem (oversampling) - SMOTE<jupyter_code>from imblearn.over_sampling import SMOTE
smote = SMOTE(sampling_strategy='minority')
X_over, y_over = smote.fit_resample(X, y)
X_over.shape, y_over.shape<jupyter_output><empty_output><jupyter_text>Com essa técnica, foram gerados mais registros da classe minoritária (1) de modo que o número fosse igual ao da classe majoritária (0).<jupyter_code>np.unique(y, return_counts=True), np.unique(y_over, return_counts=True)
X_treinamento_o, X_teste_o, y_treinamento_o, y_teste_o = train_test_split(X_over, y_over, test_size=0.2, stratify=y_over)
X_treinamento_o.shape, X_teste_o.shape
modelo_o = GaussianNB()
modelo_o.fit(X_treinamento_o, y_treinamento_o)
previsoes_o = modelo_o.predict(X_teste_o)
accuracy_score(y_teste_o, previsoes_o)
cm_o = confusion_matrix(y_teste_o, previsoes_o)
cm_o
296 / (296 + 47)
325 / (18 + 325)
# Perdas: 5000
# Clientes não pagadores: 1000
1000 * 6 / 100
60 * 5000
2150000 - 300000  # O quanto o prejuízo diminuiu<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09569672131147541, 'fraction_numerical': 0.029098360655737704, 'mean_word_length': 8.157598499061914, 'pattern_counts': {'":': 0, '<': 65, '<?xml version=': 0, '>': 65, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '291673', 'license': 'MIT', 'n_tokens_mistral': 2078, 'n_tokens_neox': 1924, 'n_words': 368, 'path': 'populacaoeamostra/probability_sampling/NaiveBayes.ipynb', 'repo_name': 'renankalfa/Estatistica-DataS-MachineL', 'size': '4880'}