<jupyter_start><jupyter_text>Explicação do Modelo Trabalho de Conclusão de Curso - Geologia / IGC / UFMGAutores: [<NAME>](https://github.com/fnaghetini) e [<NAME>](https://github.com/guiasilveira) Este notebook é dividido em apenas duas partes. Na Parte I, é realizada uma recaptulação de uma parte do fluxo apresentado no [segundo notebook](https://github.com/fnaghetini/Mapa-Preditivo/blob/main/2-predictive_litho_map.ipynb), visando reconstruir o modelo de melhor performance obtido, o *XGBoost*. Já na Parte II, é desenvolvida a interpretação desse modelo a partir da utilização do framework SHAP.   Configurações iniciais  Importação de bibliotecasBibliotecas e funções utilizadas neste notebook. Leia a seção [Versões do Software](https://github.com/fnaghetini/Mapa-Preditivo) para conferir as versões das bibliotecas.<jupyter_code>import numpy as np                                                   # operações numéricas
import pandas as pd                                                  # manipulação de dataframes e series
import matplotlib.pyplot as plt                                      # visualização dos dados

from functions.Custom_Train_Test_Split import customTrainTestSplit   # separação entre treino e teste
from sklearn.preprocessing import StandardScaler                     # escalonamento dos dados
from functions.Custom_Preprocessing import MaskedPCA                 # pca customizada
from imblearn.over_sampling import SMOTE                             # superamostragem

from xgboost import XGBClassifier                                    # xgboost

import shap                                                          # explicação do modelo
shap.initjs()

import warnings                                                      # desabilitar avisos
warnings.filterwarnings("ignore")<jupyter_output><empty_output><jupyter_text>Importação do banco de dados<jupyter_code>df_original = pd.read_csv("data/data_nb3.csv",sep=",")
df = df_original.copy(deep = True)
df.head(10)<jupyter_output><empty_output><jupyter_text>Separação entre treino e teste<jupyter_code>FEAT  = ['GT','K','TH','U','U_K','TH_K','U_TH','MDT','B02','B03','B04','B06','B07']
COORD = ['X','Y']
X_train, y_train, X_test, y_test = customTrainTestSplit(df, FEAT, COORD, samp_per_class = 150, threshold = 0.7)<jupyter_output><empty_output><jupyter_text>Pré-processamento  Escalonamento das features<jupyter_code>scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)<jupyter_output><empty_output><jupyter_text>Redução da dimensionalidade<jupyter_code>mask = np.arange(8,13)
pca = MaskedPCA(n_components = 1, mask = mask)
X_train_pca = pca.fit_transform(X_train_std)
# Aualização das features
FEAT = list(FEAT[:8] + ['PC1'])<jupyter_output><empty_output><jupyter_text>Superamostragem<jupyter_code>smote = SMOTE()
X_train_smt, y_train_smt = smote.fit_resample(X_train_pca, y_train)<jupyter_output><empty_output><jupyter_text>Modelagem dos dados<jupyter_code>clf = XGBClassifier(subsample = 0.9, reg_lambda = 0.001, min_child_weight = 5, eval_metric = 'mlogloss',
                    max_depth = 25, learning_rate = 0.3, gamma = 0.05, verbosity = 0,
                    eta = 0.025, colsample_bytree = 1.0, alpha = 0.1, random_state = 42)

clf.fit(X_train_smt, y_train_smt);<jupyter_output><empty_output><jupyter_text>Explicação do modeloRecentemente, foram desenvolvidos métodos que auxiliam na interpretação das predições fornecidas por modelos complexos, tais como [LIME](https://github.com/marcotcr/lime), [DeepLIFT](https://github.com/kundajelab/deeplift) e [SHAP](https://github.com/slundberg/shap).O **SHAP** é um framework unificado baseado na teoria dos jogos que assinala um valor de importância à cada feature para uma predição específica. Os valores de importância, denominados valores de Shapley, foram originalmente propostos por Shapley, na década de 1950, com o intuito de estimar a importância de cada jogador em uma equipe colaborativa.<jupyter_code>X_train_with_col_names = pd.DataFrame(X_train_smt, columns=FEAT)
explainer = shap.TreeExplainer(clf)
shap_values = explainer.shap_values(X_train_with_col_names)
dic_lith = {0 : 'MAcgg',
            1 : 'PP3csbg',
            2 : 'PP34b',
            3 : 'PP4esjc',
            4 : 'PP4esb',
            5 : 'PP4egm'}<jupyter_output><empty_output><jupyter_text>Impacto das variáveis nas prediçõesA *Figura 01* descreve a importância das variáveis independentes nas predições das classes realizadas pelo modelo *XGBoost*. O eixo vertical é representado pelas features, ao passo que o eixo horizontal representa a média dos valores de Shapley, de modo que as variáveis preditoras são apresentadas em ordem crescente de importância (de baixo para cima).<jupyter_code>shap.summary_plot(shap_values, X_train_with_col_names, plot_type="bar", class_names = dic_lith, show=False)

plt.savefig("figures/notebook3/Figura_01.png", dpi = 300);<jupyter_output><empty_output><jupyter_text>Figura 01: Impacto das variáveis independentes nas predições do modelo XGBoost. > Nota-se que, no geral, as features mais importantes são os canais radiométricos (i.e. `U`, `K` e `TH`) e a razão `U_TH`, enquanto `GT` e `PC1` exercem os menores impactos nas classificações.> As variáveis independentes de maior impacto nas predições da unidade Complexo Granito-Gnáissico (MAcgg) foram `U` e `Th`.> No caso da Formação Barão de Guaicuí (PP3csbg), `K` foi a feature mais importante.> As predições das formações Bandeirinha (PP34b) e São João da Chapada (PP4esjc) foram mais influenciadas por `MDT` e pela razão `U_TH`, respectivamente.> Nota-se que `U` é a variável de maior impacto nas predições das formações Sopa-Brumadinho (PP4esb) e Galho do Miguel (PP4egm).  Summary plotOs **summary plots** por unidade litoestratigráfica apresentados a seguir relacionam os valores das features (altos ou baixos) aos impactos (positivos ou negativos) nas predições realizadas pelo modelo *XGBoost*.Valores de Shapley fortemente negativos indicam uma tendência maior de o modelo não predizer a classe em questão, ao passo que valores fortemente positivos favorecem a predição dessa unidade.Assim como na *Figura 01*, as variáveis preditoras também são apresentadas em ordem crescente de importância (de baixo para cima).  Complexo Granito-Gnáissico (MAcgg)A *Figura 02* apresenta o summary plot do Complexo Granito-Gnáissico.<jupyter_code>shap.summary_plot(shap_values[0],X_train_with_col_names, show=False)
    
plt.savefig("figures/notebook3/Figura_02.png", dpi = 300);<jupyter_output><empty_output><jupyter_text>Figura 02: Summary plot do Complexo Granito-Gnáissico. > Valores altos de `U` e `TH` impactam positivamente na predição da unidade Complexo Granito-Gnáissico.> As razões `U_K` e `TH_K` pouco contribuem para a classificação dessa unidade.  Formação Barão de Guaicuí (PP3csbg)A *Figura 03* apresenta o summary plot da Formação Barão de Guaicuí.<jupyter_code>shap.summary_plot(shap_values[1],X_train_with_col_names, show=False)
    
plt.savefig("figures/notebook3/Figura_03.png", dpi = 300);<jupyter_output><empty_output><jupyter_text>Figura 03: Summary plot da Formação Barão de Guaicuí. > `K` é a variável de maior importância na predição da Formação Barão de Guaicuí.> Valores elevados de `K` favorecem a predição dessa unidade, enquanto valores baixos levam o modelo a não predizê-la.> Valores elevados de `MDT` desfavorecem a predição dessa unidade.  Formação Bandeirinha (PP34b)A *Figura 04* apresenta o summary plot da Formação Bandeirinha.<jupyter_code>shap.summary_plot(shap_values[2],X_train_with_col_names, show=False)
    
plt.savefig("figures/notebook3/Figura_04.png", dpi = 300);<jupyter_output><empty_output><jupyter_text>Figura 04: Summary plot da Formação Bandeirinha. > Altos valores de `MDT` impactam positivamente na predição da Formação Bandeirinha, enquanto valores baixos levam o modelo a não predizer essa unidade.> `TH` e `U_TH` são as variáveis que menos influenciam na predição dessa classe.  Formação São João da Chapada (PP4esjc)A *Figura 05* apresenta o summary plot da Formação São João da Chapada.<jupyter_code>shap.summary_plot(shap_values[3],X_train_with_col_names, show=False)
    
plt.savefig("figures/notebook3/Figura_05.png", dpi = 300);<jupyter_output><empty_output><jupyter_text>Figura 05: Summary plot da Formação São João da Chapada. > Elevados valores de `U_TH`, `MDT` e `U` favorecem a predição da Formação São João da Chapada, sendo a razão radiométrica a feature de maior impacto.> Ao contrário do observado para a Formação Barão de Guaicuí, `K` é a variável de menor importância.  Formação Sopa-Brumadinho (PP4esb)A *Figura 06* apresenta o summary plot da Formação Sopa-Brumadinho.<jupyter_code>shap.summary_plot(shap_values[4],X_train_with_col_names, show=False)
    
plt.savefig("figures/notebook3/Figura_06.png", dpi = 300);<jupyter_output><empty_output><jupyter_text>Figura 06: Summary plot da Formação Sopa-Brumadinho. > Valores baixos de `U` e `U_TH` levam o modelo a predizer a Formação Sopa-Brumadinho, ao passo que valores elevados dessas variáveis desfavorecem a classificação dessa unidade.  Formação Galho do Miguel (PP4egm)A *Figura 07* apresenta o summary plot da Formação Galho do Miguel.<jupyter_code>shap.summary_plot(shap_values[5],X_train_with_col_names, show=False)
    
plt.savefig("figures/notebook3/Figura_07.png", dpi = 300);<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08484525080042689, 'fraction_numerical': 0.016542155816435433, 'mean_word_length': 4.770320197044335, 'pattern_counts': {'":': 0, '<': 63, '<?xml version=': 0, '>': 78, 'https://': 7, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 11, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '238455', 'license': 'MIT', 'n_tokens_mistral': 3406, 'n_tokens_neox': 3242, 'n_words': 897, 'path': '3-model_explanation.ipynb', 'repo_name': 'fnaghetini/Mapa-Preditivo', 'size': '9392'}