<jupyter_start><jupyter_text>Naive Bayes Aplicando modelo Naive Bayes para determinar os continentes de diversos países baseados em fatos demográficos e econômicos Dataset obtido no Kaggle (https://www.kaggle.com/fernandol/countries-of-the-world/version/1)<jupyter_code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
dados = pd.read_csv('countries_of_the_world.csv')
dados.head()<jupyter_output><empty_output><jupyter_text>Observações importantes:1) Os continentes de cada país estão muito detalhados e devem ser simplicados para facilitar a convergência do modelo2) Os valores estão separados por vírgula devendo ser substituídos por ponto<jupyter_code>colunas = dados.columns
colunas = colunas.drop(['Country','Region'])
colunas
dados['Pop. Density (per sq. mi.)'] = dados['Pop. Density (per sq. mi.)'].str.replace(",",".").astype(float)
dados['Coastline (coast/area ratio)'] = dados['Coastline (coast/area ratio)'].str.replace(",",".").astype(float)
dados['Net migration'] = dados['Net migration'].str.replace(",",".").astype(float)
dados['Infant mortality (per 1000 births)'] = dados['Infant mortality (per 1000 births)'].str.replace(",",".").astype(float)
dados['Literacy (%)'] = dados['Literacy (%)'].str.replace(",",".").astype(float)
dados['Phones (per 1000)'] = dados['Phones (per 1000)'].str.replace(",",".").astype(float)
dados['Arable (%)'] = dados['Arable (%)'].str.replace(",",".").astype(float)
dados['Crops (%)'] = dados['Crops (%)'].str.replace(",",".").astype(float)
dados['Other (%)'] = dados['Other (%)'].str.replace(",",".").astype(float)
dados['Birthrate'] = dados['Birthrate'].str.replace(",",".").astype(float)
dados['Deathrate'] = dados['Deathrate'].str.replace(",",".").astype(float)
dados['Agriculture'] = dados['Agriculture'].str.replace(",",".").astype(float)
dados['Industry'] = dados['Industry'].str.replace(",",".").astype(float)
dados['Service'] = dados['Service'].str.replace(",",".").astype(float)
dados['Climate'] = dados['Climate'].str.replace(",",".").astype(float)
dados.head()<jupyter_output><empty_output><jupyter_text>Determinando os nomes de todos os continentes presentes na amostra<jupyter_code>dados['Region'].unique()
dados = dados.replace({'Region':{'ASIA (EX. NEAR EAST)         ': 'Asia',
                                   'C.W. OF IND. STATES': 'Asia',
                                   'C.W. OF IND. STATES ': 'Asia',
                                   'ASIA (EX. NEAR EAST)         ': 'Asia',
                                   'NEAR EAST                          ': 'Asia',
                                   'EASTERN EUROPE                     ': 'Europe',
                                   'WESTERN EUROPE                     ': 'Europe',
                                   'BALTICS                            ':'Europe',
                                   'LATIN AMER. & CARIB    ': 'S. America',
                                   'NORTHERN AFRICA                    ': 'Africa',
                                   'SUB-SAHARAN AFRICA                 ': 'Africa',
                                   'OCEANIA                            ': 'Oceania',
                                   'NORTHERN AMERICA                   ': 'N. America'
                                   
    
}})
dados.head()<jupyter_output><empty_output><jupyter_text>Determinando a quantidade de NaNs<jupyter_code>dados.isna().sum()<jupyter_output><empty_output><jupyter_text>Observamos que existem valores do tipo NaN na amostra e os mesmos serão removidos<jupyter_code>dados = dados.dropna()<jupyter_output><empty_output><jupyter_text>Nesta amostra existem várias características para cada país. Demos nos perguntar se todas as variáveis são necessárias para o modelo Normalizando os dados<jupyter_code>from sklearn.preprocessing import MinMaxScaler
normalizador = MinMaxScaler(feature_range=(0,1)) 
for col in colunas:
    dados[col] = normalizador.fit_transform(dados[col].values.reshape(-1, 1))
dados.head()<jupyter_output><empty_output><jupyter_text>Convertendo a variável categórica Region para numérica<jupyter_code>from sklearn.preprocessing import LabelEncoder, label_binarize
enconder = LabelEncoder()
dados['Region'] = enconder.fit_transform(dados['Region'])
lista_region = dados['Region'].unique()
n_classes = len(lista_region)
dados.head()
X = dados.drop(['Country','Region'],axis=1).values
Y = dados['Region'].values<jupyter_output><empty_output><jupyter_text>Separando em amostra de treino e teste<jupyter_code>from sklearn.model_selection import train_test_split
X_treino,X_teste,Y_treino,Y_teste=train_test_split(X,Y,test_size=0.25,random_state=0)<jupyter_output><empty_output><jupyter_text>Aplicando modelo Naive-Bayes<jupyter_code>from sklearn.naive_bayes import GaussianNB, BernoulliNB,MultinomialNB<jupyter_output><empty_output><jupyter_text>Modelo Gaussiano<jupyter_code>modelo1 = GaussianNB()
modelo1.fit(X_treino,Y_treino)<jupyter_output><empty_output><jupyter_text>Realizando previsões na amostra de teste<jupyter_code>Y_previsto = modelo1.predict(X_teste)<jupyter_output><empty_output><jupyter_text>Gerando matriz de confusão<jupyter_code>from sklearn.metrics import confusion_matrix
cm1=confusion_matrix(Y_teste,Y_previsto)
sns.heatmap(cm1,annot=True, fmt="d")
modelo1.score(X_treino,Y_treino)
modelo1.score(X_teste,Y_teste)<jupyter_output><empty_output><jupyter_text>Modelo Bernoulli<jupyter_code>modelo2 = BernoulliNB()
modelo2.fit(X_treino,Y_treino)
Y_previsto2 = modelo2.predict(X_teste)
cm2=confusion_matrix(Y_teste,Y_previsto2)
sns.heatmap(cm2,annot=True, fmt="d")
modelo2.score(X_treino,Y_treino)
modelo2.score(X_teste,Y_teste)<jupyter_output><empty_output><jupyter_text>Modelo Multinomial<jupyter_code>modelo3 = MultinomialNB()
modelo3.fit(X_treino,Y_treino)
Y_previsto3 = modelo3.predict(X_teste)
cm3=confusion_matrix(Y_teste,Y_previsto3)
sns.heatmap(cm3,annot=True, fmt="d")
modelo3.score(X_treino,Y_treino)
modelo3.score(X_teste,Y_teste)<jupyter_output><empty_output><jupyter_text>Métricas de classificação para modelo Gaussiano<jupyter_code>from sklearn.metrics import classification_report,f1_score,precision_score,average_precision_score,recall_score,accuracy_score<jupyter_output><empty_output><jupyter_text>Relatório de classificação<jupyter_code>cr = classification_report(Y_teste,Y_previsto,labels=lista_region)
print(cr)<jupyter_output>precision    recall  f1-score   support

           1       0.67      0.36      0.47        11
           2       1.00      1.00      1.00         7
           0       0.73      1.00      0.85        11
           5       0.69      0.75      0.72        12
           4       0.75      0.75      0.75         4
           3       0.00      0.00      0.00         0

   micro avg       0.76      0.76      0.76        45
   macro avg       0.64      0.64      0.63        45
weighted avg       0.75      0.76      0.74        45<jupyter_text>F1-score<jupyter_code>f1 = f1_score(Y_teste,Y_previsto,average='macro')
print("F1 score = {:0.2f}%".format(f1*100))<jupyter_output>F1 score = 75.73%<jupyter_text>Precision score<jupyter_code>precisao = precision_score(Y_teste,Y_previsto,average='macro')
print("Precision score = {:0.2f}%".format(precisao*100))<jupyter_output>Precision score = 76.85%<jupyter_text>Recall score<jupyter_code>rec = recall_score(Y_teste,Y_previsto,average='macro')
print("Recall score = {:0.2f}%".format(rec*100))<jupyter_output>Recall score = 77.27%<jupyter_text>Accuracy score<jupyter_code>acc = accuracy_score(Y_teste,Y_previsto)
print("Accuracy score = {:0.2f}%".format(acc*100))<jupyter_output>Accuracy score = 75.56%
{'fraction_non_alphanumeric': 0.1374457451006182, 'fraction_numerical': 0.026173878732079443, 'mean_word_length': 3.72591671845867, 'pattern_counts': {'":': 0, '<': 76, '<?xml version=': 0, '>': 76, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 21, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '20', 'dir': 'jupyter-structured-clean-dedup', 'id': '218252', 'license': 'MIT', 'n_tokens_mistral': 2879, 'n_tokens_neox': 2677, 'n_words': 418, 'path': 'Data_Science/Classificacao/Naive_Bayes/Naiva_Bayes_Countries.ipynb', 'repo_name': 'maledicente/cursos', 'size': '7603'}