{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 1. Introdução <a name=\"1\"></a>\n\nEste trabalho constitui desafio vivencial da trilha de formação de cientista de dados na [PETROBRAS](https://petrobras.com.br).\nFoi escolhida a competição de [Santander Customer Transaction Prediction](https://www.kaggle.com/c/santander-customer-transaction-prediction/overview). Essa é uma competição encerrada em Abril de 2019 que ofereceu US$ 65.000 do 1° ao 5° lugares. Nessa competição, o objetivo é prever quais clientes irão realizar uma transação específica no futuro, independente do valor.","metadata":{}},{"cell_type":"code","source":"%time\n# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns # gráficos\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"execution":{"iopub.status.busy":"2022-07-19T02:30:59.881384Z","iopub.execute_input":"2022-07-19T02:30:59.881905Z","iopub.status.idle":"2022-07-19T02:31:00.055005Z","shell.execute_reply.started":"2022-07-19T02:30:59.881852Z","shell.execute_reply":"2022-07-19T02:31:00.054049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df= pd.read_csv(\"../input/santander-customer-transaction-prediction/train.csv\")\ntest_df = pd.read_csv('../input/santander-customer-transaction-prediction/test.csv')\nsample_submission = pd.read_csv('../input/santander-customer-transaction-prediction/sample_submission.csv')\nsample_submission.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-19T02:31:08.487828Z","iopub.execute_input":"2022-07-19T02:31:08.488172Z","iopub.status.idle":"2022-07-19T02:31:30.061959Z","shell.execute_reply.started":"2022-07-19T02:31:08.488134Z","shell.execute_reply":"2022-07-19T02:31:30.061110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Análise exploratória de dados - EDA <a name=\"2\"></a>\n\n\nReferências utilizadas:\n\n[Santander EDA and Prediction](https://www.kaggle.com/gpreda/santander-eda-and-prediction)\n\n[Pandas documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html)\n\nNa descrição dos dados. é informado que os valores disponibilizados para previsão são numéricos e anonimizados, (conforme observado em [Santander Customer Transaction - EDA](https://www.kaggle.com/allunia/santander-customer-transaction-eda)) e tem estrutura similar à disponível para a solução do probelma, o que sugere que os dados são sintéticos.\nPor se tratar de informação de transações financeiras, é compreensível que os dados sejam anonimizados, porém o fato de não saber o que cada uma das muitas colunas significa, dificulta a análise de dados e possíveis idéias de combinação de variáveis para melhorar o resultado do modelo.","metadata":{}},{"cell_type":"code","source":"train_df.describe()","metadata":{"execution":{"iopub.status.busy":"2022-05-29T00:30:59.126383Z","iopub.execute_input":"2022-05-29T00:30:59.126582Z","iopub.status.idle":"2022-05-29T00:31:01.161022Z","shell.execute_reply.started":"2022-05-29T00:30:59.126557Z","shell.execute_reply":"2022-05-29T00:31:01.160149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.figure(figsize=(16,6))\nfeatures = train_df.columns.values[2:202]\nplt.title(\"Distribuição dos valores médios por coluna nos conjuntos de treino e de teste\")\nsns.distplot(train_df[features].mean(axis=1),color=\"green\", kde=True,bins=120, label='train')\nsns.distplot(test_df[features].mean(axis=1),color=\"blue\", kde=True,bins=120, label='test')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-29T00:31:01.162285Z","iopub.execute_input":"2022-05-29T00:31:01.162492Z","iopub.status.idle":"2022-05-29T00:31:04.225193Z","shell.execute_reply.started":"2022-05-29T00:31:01.162466Z","shell.execute_reply":"2022-05-29T00:31:04.224381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"É possível observar que as médias e desvios padrão estão distribuídos em uma grande variedade de valores, o que leva a entender que esses dados não estão padronizados. Caso estivessem padronizados, a média seria, zero e o desvio padrão seria unitário. Isso pode ser um problema para modelos baseados em redes neurais(vide [Why Data should be Normalized before Training a Neural Network](https://towardsdatascience.com/why-data-should-be-normalized-before-training-a-neural-network-c626b7f66c7d)), porém é indiferente para modelos baseados em árvores de decisão(vide [Scaling/Normalization not need for tree based models](https://stats.stackexchange.com/questions/262895/scaling-normalization-not-need-for-tree-based-models)), como o que será utilizado.","metadata":{}},{"cell_type":"code","source":"train_df.info(verbose = True, show_counts = True)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:03:54.200545Z","iopub.execute_input":"2022-05-28T02:03:54.200845Z","iopub.status.idle":"2022-05-28T02:03:54.346744Z","shell.execute_reply.started":"2022-05-28T02:03:54.20081Z","shell.execute_reply":"2022-05-28T02:03:54.345744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"A partir da função info(), é possível observar que os dados de treino são compostos de um campo de texto \"ID_code\", um campo inteiro \"target\" (que pode assumir os valores de 0 ou 1) e todos os demais campos são do tipo número real. A partir dessa mesma função é possível observar que não existem valores faltantes (NaN).","metadata":{}},{"cell_type":"code","source":"sns.countplot(x = train_df.target.values)","metadata":{"execution":{"iopub.status.busy":"2022-05-29T00:31:04.226586Z","iopub.execute_input":"2022-05-29T00:31:04.227412Z","iopub.status.idle":"2022-05-29T00:31:04.419887Z","shell.execute_reply.started":"2022-05-29T00:31:04.227374Z","shell.execute_reply":"2022-05-29T00:31:04.419021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"A partir da contagem da variável \"target\" é possível observar que existe um desequilíbrio de classes uma vez que existem muito mais transações não realizadas que transações realizadas.","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\ndef plot_feature_distribution(df1, df2, label1, label2, features):\n    i = 0\n    sns.set_style('whitegrid')\n    plt.figure()\n    fig, ax = plt.subplots(10,10,figsize=(18,44))\n\n    for feature in features:\n        i += 1\n        plt.subplot(20,10,i)\n        sns.kdeplot(df1[feature],\n                    label=label1)\n        sns.kdeplot(df2[feature],\n                     label=label2)\n        plt.xlabel(feature, fontsize=9)\n        locs, labels = plt.xticks()\n        plt.tick_params(axis='x', which='major', labelsize=6, pad=-6)\n        plt.tick_params(axis='y', which='major', labelsize=6)\n    plt.show();","metadata":{"execution":{"iopub.status.busy":"2022-05-29T00:31:08.622426Z","iopub.execute_input":"2022-05-29T00:31:08.623008Z","iopub.status.idle":"2022-05-29T00:31:08.631461Z","shell.execute_reply.started":"2022-05-29T00:31:08.622957Z","shell.execute_reply":"2022-05-29T00:31:08.630394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"t0 = train_df.loc[train_df['target'] == 0]\nt1 = train_df.loc[train_df['target'] == 1]\nfeatures = train_df.columns.values[2:202]\nplot_feature_distribution(t0, t1, '0', '1', features)","metadata":{"execution":{"iopub.status.busy":"2022-05-29T00:31:41.845396Z","iopub.execute_input":"2022-05-29T00:31:41.845711Z","iopub.status.idle":"2022-05-29T00:32:00.120569Z","shell.execute_reply.started":"2022-05-29T00:31:41.845674Z","shell.execute_reply":"2022-05-29T00:32:00.119039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"É possível observar que as variáveis apresentam, via de regra, [distribuição semelhante a uma normal](https://pt.wikipedia.org/wiki/Distribui%C3%A7%C3%A3o_normal) de dados.\nÉ possível observar um relevante número de variáveis que apresentam distribuições diferentes entre as transações realizadas (saída 1 corresponde às linhas cor de laranja) e as transações não realizadas (saida 0 corresponde a linhas azuis). Esse comportamento pode ser observado nas variáveis var_0, var_1, var_2, var_5, var_9, var_13, var_106, var_139 e muitas outras.\n\nAlgumas variáveis apresentam distribuições de frequência que se assemelham a [distribuição bimodal](https://pt.wikipedia.org/wiki/Distribui%C3%A7%C3%A3o_bimodal) como var_2, var_13, var_26, var_55, var_175, var_184, var_196.\nÉ possível verificar que todas as features possuem distribuição normal conforme código emprestado do seguinte notebook:\nhttps://www.kaggle.com/code/claudiohfg/santander-lightgbm-random-over-sampler-l1-l2","metadata":{}},{"cell_type":"code","source":"from tqdm import tqdm\nfrom scipy import stats\nFEATURES = [column for column in train_df.columns if 'var' in column]\nalpha = 1e-3\nall_normal = True\nfor feature in tqdm(FEATURES):\n    if stats.normaltest(train_df[feature].values).pvalue > alpha:\n        all_normal = False\n        print(f'{feature} may not be normal')\nif all_normal:\n    print('All features are normally distributed')","metadata":{"execution":{"iopub.status.busy":"2022-07-02T01:23:07.852966Z","iopub.execute_input":"2022-07-02T01:23:07.853414Z","iopub.status.idle":"2022-07-02T01:23:08.646763Z","shell.execute_reply.started":"2022-07-02T01:23:07.853384Z","shell.execute_reply":"2022-07-02T01:23:08.645825Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Foi avaliada a correlação entre as variáveis a partir do gráfico gerado pelo código emprestado do seguinte notebook.\nhttps://www.kaggle.com/code/levorato/tp3-vivencial-cd-petro\nA partir dessa visualização é possível observar que todas as variáveis possuem correlação próxima a zero. Isso é possível observar nos pequenos valores mínimo e máximo do mapa de calor.","metadata":{}},{"cell_type":"code","source":"# Correlation matrix\ncor = train_df.drop([\"ID_code\"], axis = 1).corr()\ncorr = np.array(cor)\n#np.fill_diagonal(corr, np.nan)\nnp.fill_diagonal(corr, 0)\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\n# Plotting heatmap\nplt.figure(figsize=(15,10))\n#sns.heatmap(cor, vmin = -1, vmax = +1, cmap = 'coolwarm')  # annot = True,\nsns.heatmap(corr, annot_kws={\"fontsize\":30})  # annot = True,","metadata":{"execution":{"iopub.status.busy":"2022-07-06T02:27:30.491260Z","iopub.execute_input":"2022-07-06T02:27:30.491618Z","iopub.status.idle":"2022-07-06T02:27:54.189289Z","shell.execute_reply.started":"2022-07-06T02:27:30.491566Z","shell.execute_reply":"2022-07-06T02:27:54.188327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = train_df.columns.values[2:202]\nplot_feature_distribution(train_df, test_df, 'train', 'test', features)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:07:30.446892Z","iopub.execute_input":"2022-05-28T02:07:30.447815Z","iopub.status.idle":"2022-05-28T02:13:34.97013Z","shell.execute_reply.started":"2022-05-28T02:07:30.447756Z","shell.execute_reply":"2022-05-28T02:13:34.969071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"À primeira vista, as distribuições dos dados de treino e teste parecem idênticas. Uma avaliação minuciosa demonstra pequenas diferenças, especialmente próximo às modas, onde pequenas seções dos dados de treino (linha azul) ficam visíveis sob a distribuição dos dados de teste (linha laranja).\nA existência de diferenças de distribuições entre os dados com saída 0 e saída 1 são um bom sinal pois demonstram que existem, nos dados, informações que podem permitir a predição da variável objetivo (*target*).\nA existência de uma grande semelhança entre os dados de treino e teste também é um bom sinal, pois evidencia que o treino é representativo do teste. Em caso contrário, o modelo poderia sofrer *overfitting* nos dados de treino e ter baixo desempenho nos dados de teste.\nMais do que felizes coincidências, as observações realizadas indicam (conforme observado no notebook [Santander Customer Transaction - EDA](https://www.kaggle.com/allunia/santander-customer-transaction-eda)) que os dados da competição são simulados, ou seja, foram gerados especificamente para a competição com métricas similares aos dados reais porém sem consistir em dados reais anonimizados.","metadata":{}},{"cell_type":"code","source":"X = train_df.copy()\ny = X.pop(\"target\")\nX.pop(\"ID_code\")\ndiscrete_features = X.dtypes == int\nX.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-19T02:32:27.245639Z","iopub.execute_input":"2022-07-19T02:32:27.246309Z","iopub.status.idle":"2022-07-19T02:32:27.437034Z","shell.execute_reply.started":"2022-07-19T02:32:27.246252Z","shell.execute_reply":"2022-07-19T02:32:27.436023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Segue visualização bidimensional dos gráficos obtida com a redução de dimensionalidade obtida pelo métido PCA.\nhttps://plotly.com/python/pca-visualization/","metadata":{}},{"cell_type":"code","source":"import plotly.express as px\nfrom sklearn.decomposition import PCA\n\npca = PCA(n_components=2)\ncomponents = pca.fit_transform(X)\n\nfig = px.scatter(components,\n                 x = 0,\n                 y = 1,\n                 color = y.astype(\"string\")\n                )\nfig.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Segue visualização bidimensional dos gráficos obtida com a redução de dimensionalidade obtida pelo métido TSNE.\nhttps://plotly.com/python/t-sne-and-umap-projections/","metadata":{}},{"cell_type":"code","source":"from sklearn.manifold import TSNE\nimport plotly.express as px\n\nfeatures = X\n\ntsne = TSNE(n_components=2, random_state=0)\nprojections = tsne.fit_transform(features)\n\nfig = px.scatter(\n    projections, x = 0, y = 1,\n    color = y.astype(\"string\"),\n)\nfig.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Estratégia de validação <a name=\"3\"></a>\nFoi realizada a divisão de 30% dos dados para teste.\nNa fase de busca de hiperparâmetros foi utilizada validação cruzada com 5 folds.","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)","metadata":{"execution":{"iopub.status.busy":"2022-07-19T02:35:02.690273Z","iopub.execute_input":"2022-07-19T02:35:02.691371Z","iopub.status.idle":"2022-07-19T02:35:03.082374Z","shell.execute_reply.started":"2022-07-19T02:35:02.691317Z","shell.execute_reply":"2022-07-19T02:35:03.081276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. Ajuste de hiperparâmetros\n\nAjuste simplificado de hiperparâmetros realizado utilizando como referência a postagem no StackOverflow [Grid search with LightGBM example](https://stackoverflow.com/questions/50686645/grid-search-with-lightgbm-example).","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport lightgbm as lgb\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.model_selection import KFold\n\nnp.random.seed(1)\n\ngkf = KFold(n_splits=5, shuffle=True, random_state=42).split(X=X, y=y)\n\nparam_grid = {\n    \"max_depth\" : [15, 20, 25, 30, 35],\n    \"num_leaves\": [31, 59, 127],\n    \"learning_rate\": [0.1, 0.05, 0.01],\n    }\n\nlgb_estimator = lgb.LGBMClassifier(\n                        objective = \"binary\",\n                        is_unbalance = True,\n                        )\n\ngsearch = GridSearchCV(estimator = lgb_estimator,\n                       param_grid = param_grid,\n                       cv = gkf,\n                       scoring = \"roc_auc\",\n                      )\nlgb_model = gsearch.fit(X=X, y=y)\n\nprint(lgb_model.best_params_, lgb_model.best_score_)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:13:35.563609Z","iopub.execute_input":"2022-05-28T02:13:35.563917Z","iopub.status.idle":"2022-05-28T02:21:15.33169Z","shell.execute_reply.started":"2022-05-28T02:13:35.563881Z","shell.execute_reply":"2022-05-28T02:21:15.330845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5. Treino do modelo <a name=\"4\"></a>\n\n\nO treino do modelo foi realizado com código obtido do notebook [LightGBM Classifier in Python ](https://www.kaggle.com/code/prashant111/lightgbm-classifier-in-python/notebook). Assim como a maioria das submissões com melhor classificação no ranking da competição, nesse código é utilizado um modelo do tipo [LightGBM](https://www.kaggle.com/prashant111/lightgbm-classifier-in-python). O LightGBM é um ensemble de árvores de decisão, similar ao random forest. Ele usa gradient boost de forma similar ao Xgboost tendo sido desenvolvido pela Microsoft (vide [GitHub](https://github.com/microsoft/LightGBM)).","metadata":{}},{"cell_type":"code","source":"# build the lightgbm model\nimport lightgbm as lgb\nclf = lgb.LGBMClassifier(\n                        objective = \"binary\",\n                        is_unbalance = True,\n                        learning_rate = 0.1,\n                        num_leaves = 59,\n                        max_depth = 15,\n                        )\nclf.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2022-07-19T02:52:37.029396Z","iopub.execute_input":"2022-07-19T02:52:37.032800Z","iopub.status.idle":"2022-07-19T02:52:53.694887Z","shell.execute_reply.started":"2022-07-19T02:52:37.032711Z","shell.execute_reply":"2022-07-19T02:52:53.694032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict the results\ny_pred=clf.predict_proba(X_test)[::,1]","metadata":{"execution":{"iopub.status.busy":"2022-07-19T03:03:08.968841Z","iopub.execute_input":"2022-07-19T03:03:08.969204Z","iopub.status.idle":"2022-07-19T03:03:09.347862Z","shell.execute_reply.started":"2022-07-19T03:03:08.969168Z","shell.execute_reply":"2022-07-19T03:03:09.347127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# view accuracy\nfrom sklearn.metrics import roc_auc_score\n#accuracy=roc_auc_score(y_pred, y_test)\nprint('LightGBM Model ROC AUC score: {0:0.4f}'.format(roc_auc_score(y_test, y_pred)))","metadata":{"execution":{"iopub.status.busy":"2022-07-19T03:03:09.558711Z","iopub.execute_input":"2022-07-19T03:03:09.559215Z","iopub.status.idle":"2022-07-19T03:03:09.583596Z","shell.execute_reply.started":"2022-07-19T03:03:09.559170Z","shell.execute_reply":"2022-07-19T03:03:09.582654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn import metrics\nimport matplotlib.pyplot as plt\nfpr, tpr, _ = metrics.roc_curve(y_test,  y_pred)\nauc = metrics.roc_auc_score(y_test, y_pred)\nplt.plot(fpr,tpr,label=\"data 1, auc=\"+str(auc))\nplt.legend(loc=4)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-19T03:05:25.318159Z","iopub.execute_input":"2022-07-19T03:05:25.318877Z","iopub.status.idle":"2022-07-19T03:05:25.612549Z","shell.execute_reply.started":"2022-07-19T03:05:25.318831Z","shell.execute_reply":"2022-07-19T03:05:25.611563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_envio = test_df.copy()\nX_envio.pop(\"ID_code\")\n#unseen_predictions = clf.predict(X_envio)\nunseen_predictions = clf.predict_proba(X_envio,\n#                                      raw_score = True,\n                                      )","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:41.380222Z","iopub.execute_input":"2022-05-28T02:21:41.380868Z","iopub.status.idle":"2022-05-28T02:21:42.997547Z","shell.execute_reply.started":"2022-05-28T02:21:41.380808Z","shell.execute_reply":"2022-05-28T02:21:42.996702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_unseen_predictions = pd.DataFrame(unseen_predictions)\ndf_unseen_predictions.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:42.999142Z","iopub.execute_input":"2022-05-28T02:21:42.999719Z","iopub.status.idle":"2022-05-28T02:21:43.012355Z","shell.execute_reply.started":"2022-05-28T02:21:42.999675Z","shell.execute_reply":"2022-05-28T02:21:43.011192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 6. Submissão <a name=\"5\"></a>\nO resultado do modelo é salvo em um arquivo .CSV entitulado \"submission\".","metadata":{}},{"cell_type":"code","source":"## %time\n#pd.DataFrame({\"ID_code\":test_df[\"ID_code\"], \"target\":df_unseen_predictions[0]}).to_csv(\"submission.csv\", index=False)\ny_envio = pd.DataFrame({\"ID_code\":test_df[\"ID_code\"], \"target\":df_unseen_predictions[1]})\ny_envio.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:43.014385Z","iopub.execute_input":"2022-05-28T02:21:43.015059Z","iopub.status.idle":"2022-05-28T02:21:43.845098Z","shell.execute_reply.started":"2022-05-28T02:21:43.015003Z","shell.execute_reply":"2022-05-28T02:21:43.844271Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 7. Análise de resultados","metadata":{}},{"cell_type":"code","source":"y_envio.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:43.846616Z","iopub.execute_input":"2022-05-28T02:21:43.847183Z","iopub.status.idle":"2022-05-28T02:21:43.859834Z","shell.execute_reply.started":"2022-05-28T02:21:43.84713Z","shell.execute_reply":"2022-05-28T02:21:43.859006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_envio.describe()","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:43.861678Z","iopub.execute_input":"2022-05-28T02:21:43.861995Z","iopub.status.idle":"2022-05-28T02:21:43.895281Z","shell.execute_reply.started":"2022-05-28T02:21:43.861937Z","shell.execute_reply":"2022-05-28T02:21:43.894209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Para visualizar a distribuição das classes nos dados de teste, foi gerado um gráfico similar ao gerado anteriormente para os dados de treino. O resultado foi desequilibrado, com distribuição similar ao primeiro gráfico.","metadata":{"execution":{"iopub.status.busy":"2022-05-19T00:19:46.460274Z","iopub.execute_input":"2022-05-19T00:19:46.46069Z","iopub.status.idle":"2022-05-19T00:19:46.465979Z","shell.execute_reply.started":"2022-05-19T00:19:46.46066Z","shell.execute_reply":"2022-05-19T00:19:46.465247Z"}}},{"cell_type":"code","source":"y_envio_discreto =  np.where(df_unseen_predictions[1] > 0.5, 1, 0)\nsns.countplot(x = y_envio_discreto)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:43.896915Z","iopub.execute_input":"2022-05-28T02:21:43.897673Z","iopub.status.idle":"2022-05-28T02:21:44.140419Z","shell.execute_reply.started":"2022-05-28T02:21:43.897616Z","shell.execute_reply":"2022-05-28T02:21:44.139371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"De forma similar, é feito um gráfico com a distribuição das classes preditas nos dados de validação. É possível observar uma distribuição menos desbalanceada que as anteriores, mostrando um viés no algoritmo.","metadata":{}},{"cell_type":"code","source":"df_unseen_predictions.describe()","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.141774Z","iopub.execute_input":"2022-05-28T02:21:44.14209Z","iopub.status.idle":"2022-05-28T02:21:44.18094Z","shell.execute_reply.started":"2022-05-28T02:21:44.142053Z","shell.execute_reply":"2022-05-28T02:21:44.179895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.countplot(x = y_pred)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.18246Z","iopub.execute_input":"2022-05-28T02:21:44.182723Z","iopub.status.idle":"2022-05-28T02:21:44.392683Z","shell.execute_reply.started":"2022-05-28T02:21:44.182691Z","shell.execute_reply":"2022-05-28T02:21:44.391623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_proba=clf.predict_proba(X_test,\n#                              raw_score=True,\n                              )\ny_pred_proba\n\ndf_y_pred_proba = pd.DataFrame(y_pred_proba)\ndf_y_pred_proba[1]","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.396667Z","iopub.execute_input":"2022-05-28T02:21:44.397034Z","iopub.status.idle":"2022-05-28T02:21:44.808826Z","shell.execute_reply.started":"2022-05-28T02:21:44.396992Z","shell.execute_reply":"2022-05-28T02:21:44.80805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(y_test)","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.810425Z","iopub.execute_input":"2022-05-28T02:21:44.811042Z","iopub.status.idle":"2022-05-28T02:21:44.818856Z","shell.execute_reply.started":"2022-05-28T02:21:44.810998Z","shell.execute_reply":"2022-05-28T02:21:44.817921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_y_envio = pd.DataFrame({\"Actual\":y_test, \"Predicted\":df_y_pred_proba[1].to_numpy()})\ndf_y_envio","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.820656Z","iopub.execute_input":"2022-05-28T02:21:44.821779Z","iopub.status.idle":"2022-05-28T02:21:44.841309Z","shell.execute_reply.started":"2022-05-28T02:21:44.821715Z","shell.execute_reply":"2022-05-28T02:21:44.84008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"O código a seguir tem o objetivo de mostrar os piores erros falsos positivos.","metadata":{}},{"cell_type":"code","source":"df_y_envio.loc[df_y_envio[\"Actual\"]==0].sort_values(\"Predicted\", ascending = False).head()","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.84319Z","iopub.execute_input":"2022-05-28T02:21:44.843818Z","iopub.status.idle":"2022-05-28T02:21:44.867907Z","shell.execute_reply.started":"2022-05-28T02:21:44.843763Z","shell.execute_reply":"2022-05-28T02:21:44.867014Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"O código a seguir tem o objetivo de mostrar os piores erros falsos negativos.","metadata":{}},{"cell_type":"code","source":"df_y_envio.loc[df_y_envio[\"Actual\"] == 1].sort_values(\"Predicted\", ascending = True).head()","metadata":{"execution":{"iopub.status.busy":"2022-05-28T02:21:44.869184Z","iopub.execute_input":"2022-05-28T02:21:44.869429Z","iopub.status.idle":"2022-05-28T02:21:44.884008Z","shell.execute_reply.started":"2022-05-28T02:21:44.8694Z","shell.execute_reply":"2022-05-28T02:21:44.883216Z"},"trusted":true},"execution_count":null,"outputs":[]}]}