{"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":"code","source":"import numpy as np \nimport pandas as pd \nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport pickle\n\nfrom pandas.plotting import scatter_matrix\nfrom sklearn.utils.random import sample_without_replacement\n\n\nimport os\nimport warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)\nwarnings.simplefilter(action='ignore', category=UserWarning)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-17T22:34:44.515342Z","iopub.execute_input":"2022-08-17T22:34:44.516466Z","iopub.status.idle":"2022-08-17T22:34:45.124204Z","shell.execute_reply.started":"2022-08-17T22:34:44.516333Z","shell.execute_reply":"2022-08-17T22:34:45.123270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(\"../input/american/train_data_sampled.csv\")\ndf_label = pd.read_csv(\"../input/american/train_labels_sampled.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:34:45.126680Z","iopub.execute_input":"2022-08-17T22:34:45.129374Z","iopub.status.idle":"2022-08-17T22:35:00.073907Z","shell.execute_reply.started":"2022-08-17T22:34:45.129342Z","shell.execute_reply":"2022-08-17T22:35:00.072947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1. Exploración, preprocesamiento y transformación de datos","metadata":{}},{"cell_type":"markdown","source":"## a. Visualización de los datos","metadata":{}},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.075438Z","iopub.execute_input":"2022-08-17T22:35:00.075818Z","iopub.status.idle":"2022-08-17T22:35:00.113524Z","shell.execute_reply.started":"2022-08-17T22:35:00.075782Z","shell.execute_reply":"2022-08-17T22:35:00.112352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.tail()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.116625Z","iopub.execute_input":"2022-08-17T22:35:00.117320Z","iopub.status.idle":"2022-08-17T22:35:00.142100Z","shell.execute_reply.started":"2022-08-17T22:35:00.117268Z","shell.execute_reply":"2022-08-17T22:35:00.141250Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.shape","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.144018Z","iopub.execute_input":"2022-08-17T22:35:00.144946Z","iopub.status.idle":"2022-08-17T22:35:00.151295Z","shell.execute_reply.started":"2022-08-17T22:35:00.144911Z","shell.execute_reply":"2022-08-17T22:35:00.150367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* El dataset a utilizar contiene 276.573 filas y 190 columnas","metadata":{}},{"cell_type":"code","source":"def print_full(x):\n    pd.set_option('display.max_rows', len(x))\n    print(x)\n    pd.reset_option('display.max_rows')","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.152636Z","iopub.execute_input":"2022-08-17T22:35:00.153009Z","iopub.status.idle":"2022-08-17T22:35:00.161465Z","shell.execute_reply.started":"2022-08-17T22:35:00.152962Z","shell.execute_reply":"2022-08-17T22:35:00.160483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print_full(df_train.dtypes)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.163013Z","iopub.execute_input":"2022-08-17T22:35:00.163379Z","iopub.status.idle":"2022-08-17T22:35:00.171603Z","shell.execute_reply.started":"2022-08-17T22:35:00.163345Z","shell.execute_reply":"2022-08-17T22:35:00.170607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cols = df_train.columns.tolist()\n\nspend_variables, payment_variables, balance_variables, risk_variables, delinquency_variables = [], [], [], [], []\n\nfor col in cols:\n    if(col.startswith('S')): spend_variables.append(col)\n        \nfor col in cols:\n    if(col.startswith('P')): payment_variables.append(col)\n        \nfor col in cols:\n    if(col.startswith('B')): balance_variables.append(col)\n        \nfor col in cols:\n    if(col.startswith('R')): risk_variables.append(col)\n    \nfor col in cols:\n    if(col.startswith('D')): delinquency_variables.append(col)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.173399Z","iopub.execute_input":"2022-08-17T22:35:00.173901Z","iopub.status.idle":"2022-08-17T22:35:00.184153Z","shell.execute_reply.started":"2022-08-17T22:35:00.173861Z","shell.execute_reply":"2022-08-17T22:35:00.183004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len_spend = len(spend_variables)\nlen_payment = len(payment_variables)\nlen_balance = len(balance_variables)\nlen_risk = len(risk_variables)\nlen_delinquency = len(delinquency_variables)\nprint('Spend variables count: {} \\nPayment variables count: {}\\nBalance variables count: {}\\nRisk variables count: {}\\nDelinquency variables count: {}'.format(len_spend, len_payment, len_balance, len_risk, len_delinquency))","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.185727Z","iopub.execute_input":"2022-08-17T22:35:00.186119Z","iopub.status.idle":"2022-08-17T22:35:00.196743Z","shell.execute_reply.started":"2022-08-17T22:35:00.186084Z","shell.execute_reply":"2022-08-17T22:35:00.195605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scatter_matrix(df_train.loc[:,payment_variables], alpha=0.2, figsize=(15,15))\nplt.suptitle('Scatter Matrix: variables de pago', fontsize=20, y=0.9)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:00.202193Z","iopub.execute_input":"2022-08-17T22:35:00.202539Z","iopub.status.idle":"2022-08-17T22:35:07.377066Z","shell.execute_reply.started":"2022-08-17T22:35:00.202514Z","shell.execute_reply":"2022-08-17T22:35:07.376194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"random_spend = sample_without_replacement(n_population=len_spend, n_samples=5, random_state=1)\naux_spend = []\nfor i in random_spend:\n    aux_spend.append(spend_variables[i])\n    \nscatter_matrix(df_train.loc[:,aux_spend], alpha=0.2, figsize=(18,18))\nplt.suptitle('Scatter Matrix: algunas variables de gasto', fontsize=20, y=0.9)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:07.378155Z","iopub.execute_input":"2022-08-17T22:35:07.378493Z","iopub.status.idle":"2022-08-17T22:35:28.783355Z","shell.execute_reply.started":"2022-08-17T22:35:07.378455Z","shell.execute_reply":"2022-08-17T22:35:28.782276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"random_balance = sample_without_replacement(n_population=len_balance, n_samples=5, random_state=1)\naux_balance = []\nfor i in random_balance:\n    aux_balance.append(balance_variables[i])\n    \nscatter_matrix(df_train.loc[:,aux_balance], alpha=0.2, figsize=(18,18))\nplt.suptitle('Scatter Matrix: algunas variables de balance', fontsize=20, y=0.9)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:28.785260Z","iopub.execute_input":"2022-08-17T22:35:28.785949Z","iopub.status.idle":"2022-08-17T22:35:50.515154Z","shell.execute_reply.started":"2022-08-17T22:35:28.785911Z","shell.execute_reply":"2022-08-17T22:35:50.514243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"random_risk = sample_without_replacement(n_population=len_risk, n_samples=5, random_state=1)\naux_risk = []\nfor i in random_risk:\n    aux_risk.append(risk_variables[i])\n    \nscatter_matrix(df_train.loc[:,aux_risk], alpha=0.2, figsize=(18,18))\nplt.suptitle('Scatter Matrix: algunas variables de riesgo', fontsize=20, y=0.9)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:35:50.516586Z","iopub.execute_input":"2022-08-17T22:35:50.517182Z","iopub.status.idle":"2022-08-17T22:36:11.587453Z","shell.execute_reply.started":"2022-08-17T22:35:50.517132Z","shell.execute_reply":"2022-08-17T22:36:11.586350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"random_delinquency = sample_without_replacement(n_population=len_delinquency, n_samples=5, random_state=1)\naux_delinquency = []\nfor i in random_delinquency:\n    aux_delinquency.append(delinquency_variables[i])\n    \nscatter_matrix(df_train.loc[:,aux_delinquency], alpha=0.2, figsize=(18,18))\nplt.suptitle('Scatter Matrix: algunas variables de delincuencia', fontsize=20, y=0.9)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:11.589302Z","iopub.execute_input":"2022-08-17T22:36:11.589882Z","iopub.status.idle":"2022-08-17T22:36:20.496580Z","shell.execute_reply.started":"2022-08-17T22:36:11.589843Z","shell.execute_reply":"2022-08-17T22:36:20.495432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_with_label = df_train.join(df_label.set_index('customer_ID'), on='customer_ID')","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:20.498159Z","iopub.execute_input":"2022-08-17T22:36:20.498589Z","iopub.status.idle":"2022-08-17T22:36:20.799629Z","shell.execute_reply.started":"2022-08-17T22:36:20.498553Z","shell.execute_reply":"2022-08-17T22:36:20.797516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_payed = train_with_label[train_with_label['target']==1]\ndf_didnt_pay = train_with_label[train_with_label['target']==0]","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:20.802712Z","iopub.execute_input":"2022-08-17T22:36:20.803151Z","iopub.status.idle":"2022-08-17T22:36:21.403017Z","shell.execute_reply.started":"2022-08-17T22:36:20.803113Z","shell.execute_reply":"2022-08-17T22:36:21.402019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Mostramos un Pie chart para ver que tan balanceados están los datos","metadata":{}},{"cell_type":"code","source":"colors = sns.color_palette('pastel')[0:2]\nplt.pie([df_payed['target'].count(), df_didnt_pay['target'].count()], labels = ['Pagó su deuda', 'No pagó su deuda'], colors = colors, autopct='%.0f%%')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:21.404365Z","iopub.execute_input":"2022-08-17T22:36:21.404717Z","iopub.status.idle":"2022-08-17T22:36:21.506070Z","shell.execute_reply.started":"2022-08-17T22:36:21.404681Z","shell.execute_reply":"2022-08-17T22:36:21.504747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Podemos observar que el dataset no está balanceado, 3/4 del dataset corresponden a clientes que no pagaron su deuda y 1/3 sí pagaron su deuda","metadata":{}},{"cell_type":"code","source":"categorical_features = ['B_30', 'B_38', 'D_63', 'D_64', 'D_66', 'D_68', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126'] #cuenta el target no?\nquantitative_features = [ x for x in df_train.columns.tolist() if x not in categorical_features ] #deberia sacar el customer_id de ahi no?","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:21.507431Z","iopub.execute_input":"2022-08-17T22:36:21.507991Z","iopub.status.idle":"2022-08-17T22:36:21.513868Z","shell.execute_reply.started":"2022-08-17T22:36:21.507955Z","shell.execute_reply":"2022-08-17T22:36:21.512798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def makeBarplotsForCategoricalFeaturesByTarget():\n    for feature in categorical_features:\n        var_count_payed = df_payed[feature].value_counts().reset_index(name= feature + ' Count').rename(columns={'index': feature})\n        sns.barplot(x = feature, y = feature + ' Count', data = var_count_payed).set_title('Cantidad de clientes que pagaron su deuda clasificado por la variable ' + feature, fontsize = 20)\n        plt.show()\n\n        var_count_didnt_pay = df_didnt_pay[feature].value_counts().reset_index(name= feature + ' Count').rename(columns={'index': feature})\n        sns.barplot(x = feature, y = feature + ' Count', data = var_count_didnt_pay).set_title('Cantidad de clientes que no pagaron su deuda clasificado por la variable ' + feature, fontsize = 20)\n        plt.show()\n        print(\"\\n\")\n\nmakeBarplotsForCategoricalFeaturesByTarget()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:21.515156Z","iopub.execute_input":"2022-08-17T22:36:21.515750Z","iopub.status.idle":"2022-08-17T22:36:26.015907Z","shell.execute_reply.started":"2022-08-17T22:36:21.515706Z","shell.execute_reply":"2022-08-17T22:36:26.014276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## b. Ingeniería de características","metadata":{}},{"cell_type":"markdown","source":" ### Revisar los datos faltantes o mal ingresados y tomar una decisión sobre estos: reemplazo de valores, eliminación de registros incompletos, etc.","metadata":{}},{"cell_type":"code","source":"contiene_null = df_train.isna().sum()\ncontiene_null.sort_index(inplace=True)\n\nrows_count = df_train.shape[0]\ncols_muchos_nulos, cols_nulos = [], []\n\nfor k,v in contiene_null.items(): \n    porcentaje = v/rows_count*100\n    print (str(k) + \": \" + str(v) + \" (\" + str(round(porcentaje,3)) + \"%)\" ) \n    if (porcentaje > 85): \n        cols_muchos_nulos.append(k)\n    elif (porcentaje > 0):\n        cols_nulos.append(k)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:26.017570Z","iopub.execute_input":"2022-08-17T22:36:26.017893Z","iopub.status.idle":"2022-08-17T22:36:26.160264Z","shell.execute_reply.started":"2022-08-17T22:36:26.017867Z","shell.execute_reply":"2022-08-17T22:36:26.159195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def getColsWithSameAmountOfNans():\n    dict_nans = {}\n    nans_series = df_train.isna().sum()\n    seen = set()\n    repeated_amounts = [x for x in nans_series.values if x in seen or seen.add(x)]\n    repeatead_amounts_nan = set(repeated_amounts)\n    repeatead_amounts_nan.remove(0)\n    for amount in repeatead_amounts_nan:\n        cols_with_nan_amount = nans_series[nans_series == amount].index.tolist()\n        dict_nans[amount] = cols_with_nan_amount\n    return dict_nans","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:26.161736Z","iopub.execute_input":"2022-08-17T22:36:26.162229Z","iopub.status.idle":"2022-08-17T22:36:26.170418Z","shell.execute_reply.started":"2022-08-17T22:36:26.162193Z","shell.execute_reply":"2022-08-17T22:36:26.169328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def checkRelationOfColsWithSameAmountOfNans(dict_nans):\n    for amount, cols in dict_nans.items():\n        amount_rows_all_cols_nan = len(df_train[df_train[cols].isna().all(1)])\n        if (amount_rows_all_cols_nan == amount):\n            print(\"Si alguna de las columnas \" + str(cols)[1:-1] + \" es nan entonces el resto de estas también será nan\")","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:26.171705Z","iopub.execute_input":"2022-08-17T22:36:26.172122Z","iopub.status.idle":"2022-08-17T22:36:26.179314Z","shell.execute_reply.started":"2022-08-17T22:36:26.172087Z","shell.execute_reply":"2022-08-17T22:36:26.178275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dict_nans = getColsWithSameAmountOfNans()\ncheckRelationOfColsWithSameAmountOfNans(dict_nans)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:26.181102Z","iopub.execute_input":"2022-08-17T22:36:26.181510Z","iopub.status.idle":"2022-08-17T22:36:27.007333Z","shell.execute_reply.started":"2022-08-17T22:36:26.181476Z","shell.execute_reply":"2022-08-17T22:36:27.006057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Vamos a eliminar las columnas que presentan muchos nulos, aquellas donde mas del 85% de sus datos son nulos.","metadata":{}},{"cell_type":"code","source":"train_without_null = train_with_label.drop(cols_muchos_nulos, axis=1)\n\ncategorical_features = [x for x in categorical_features if x not in cols_muchos_nulos]\nquantitative_features = [ x for x in quantitative_features if x not in cols_muchos_nulos]\nquantitative_features.remove('customer_ID')\nquantitative_features.remove('S_2')","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:27.008795Z","iopub.execute_input":"2022-08-17T22:36:27.009819Z","iopub.status.idle":"2022-08-17T22:36:27.135535Z","shell.execute_reply.started":"2022-08-17T22:36:27.009773Z","shell.execute_reply":"2022-08-17T22:36:27.134498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Teniendo en cuenta que no contamos con informacion sobre los datos, consideramos que los datos faltantes son del tipo Missing completely atrandom - MCAR, ya que no podemos afirmar porque razon no se informan los datos faltantes.  \nVariables cuantitativas faltantes son reemplazadas por la media","metadata":{}},{"cell_type":"code","source":"for col in quantitative_features:\n    med = train_without_null[col].median()\n    train_without_null[col].replace(np.nan, med, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:27.137206Z","iopub.execute_input":"2022-08-17T22:36:27.137602Z","iopub.status.idle":"2022-08-17T22:36:28.002029Z","shell.execute_reply.started":"2022-08-17T22:36:27.137565Z","shell.execute_reply":"2022-08-17T22:36:28.000921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Para las variables categóricas, los datos faltantes son reemplazadas por la \"moda\" de la columna (es decir el valor más frecuente de la columna)","metadata":{}},{"cell_type":"code","source":"for col in categorical_features:\n    mod = train_without_null[col].mode().iat[0]\n    train_without_null[col].replace(np.nan, mod, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:28.003627Z","iopub.execute_input":"2022-08-17T22:36:28.004020Z","iopub.status.idle":"2022-08-17T22:36:28.093749Z","shell.execute_reply.started":"2022-08-17T22:36:28.003968Z","shell.execute_reply":"2022-08-17T22:36:28.092763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Los valores son alfabeticos, los valores -1 tambien son considerados datos faltantes. Aplicamos sustitucion por moda.","metadata":{}},{"cell_type":"code","source":"mod = train_without_null['D_64'].mode().iat[0]\ntrain_without_null['D_64'].replace('-1', mod, inplace=True)\ntrain_without_null['D_64'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:28.095361Z","iopub.execute_input":"2022-08-17T22:36:28.095757Z","iopub.status.idle":"2022-08-17T22:36:28.131464Z","shell.execute_reply.started":"2022-08-17T22:36:28.095718Z","shell.execute_reply":"2022-08-17T22:36:28.130337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Verificar columnas a descartar e identificar nuevas columnas que podrían crearse a partir de otras o añadiendo información externa.","metadata":{}},{"cell_type":"markdown","source":"La mayoria de columnas a descartar ya fueron eliminadas, estas fueran las que contenian demasiados datos nulos. Ademas de aquellas, vamos a eliminar la columna 'S_2', ya que contine fechas, las cuales a la hora de generas las variables dummies para las variables categoricas generaria demasidas columnas para procesar, la cual consideramos no ser fundamentales.","metadata":{}},{"cell_type":"code","source":"train_without_null.drop(['S_2'], inplace = True, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:28.139178Z","iopub.execute_input":"2022-08-17T22:36:28.139496Z","iopub.status.idle":"2022-08-17T22:36:28.264327Z","shell.execute_reply.started":"2022-08-17T22:36:28.139467Z","shell.execute_reply":"2022-08-17T22:36:28.263311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Generamos las variables dummies para cada variable categorica.","metadata":{}},{"cell_type":"code","source":"train_without_null = pd.get_dummies(train_without_null, columns=categorical_features)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:28.265793Z","iopub.execute_input":"2022-08-17T22:36:28.266197Z","iopub.status.idle":"2022-08-17T22:36:28.624537Z","shell.execute_reply.started":"2022-08-17T22:36:28.266158Z","shell.execute_reply":"2022-08-17T22:36:28.623513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" ### Identificación de outliers, utilizar métodos como el Z-Score y gráficos de caja. ¿Qué significan? ¿Se los elimina? ¿Se los deja?","metadata":{}},{"cell_type":"markdown","source":"Para identificar y eliminar outliers, utilizaremos Isolation Forest, ya que al analizar los outliers por columna individualmente se encuentran demasiados. Consideramos que esto sucede ya que no se tiene en cuenta come se relacionan las muestras, al analizar los outliers teniendo en cuentas mas columnas observamos una cantidad mas razonable de outliers.","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import IsolationForest","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:28.626103Z","iopub.execute_input":"2022-08-17T22:36:28.626494Z","iopub.status.idle":"2022-08-17T22:36:28.868996Z","shell.execute_reply.started":"2022-08-17T22:36:28.626457Z","shell.execute_reply":"2022-08-17T22:36:28.868102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x, y = train_without_null.drop(columns = ['customer_ID', 'target']), train_without_null['target']\nx","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:28.870298Z","iopub.execute_input":"2022-08-17T22:36:28.870682Z","iopub.status.idle":"2022-08-17T22:36:29.251571Z","shell.execute_reply.started":"2022-08-17T22:36:28.870617Z","shell.execute_reply":"2022-08-17T22:36:29.250342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"iforest = IsolationForest(n_estimators=100, max_samples='auto', \n                          contamination='auto', max_features=156,\n                          bootstrap=False, n_jobs=-1, random_state=1)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:29.253251Z","iopub.execute_input":"2022-08-17T22:36:29.253901Z","iopub.status.idle":"2022-08-17T22:36:29.260195Z","shell.execute_reply.started":"2022-08-17T22:36:29.253862Z","shell.execute_reply":"2022-08-17T22:36:29.259068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = iforest.fit_predict(x)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:36:29.261883Z","iopub.execute_input":"2022-08-17T22:36:29.262406Z","iopub.status.idle":"2022-08-17T22:37:25.684121Z","shell.execute_reply.started":"2022-08-17T22:36:29.262371Z","shell.execute_reply":"2022-08-17T22:37:25.683106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_isolation_forest = train_without_null.drop(columns = ['customer_ID', 'target'])\ndf_isolation_forest['scores']=iforest.decision_function(x)\ndf_isolation_forest['outlier_label']=pred","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:37:25.685844Z","iopub.execute_input":"2022-08-17T22:37:25.686249Z","iopub.status.idle":"2022-08-17T22:38:03.740789Z","shell.execute_reply.started":"2022-08-17T22:37:25.686212Z","shell.execute_reply":"2022-08-17T22:38:03.739733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"outliers = df_isolation_forest[df_isolation_forest.outlier_label==-1].index","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:03.742261Z","iopub.execute_input":"2022-08-17T22:38:03.742653Z","iopub.status.idle":"2022-08-17T22:38:03.985444Z","shell.execute_reply.started":"2022-08-17T22:38:03.742617Z","shell.execute_reply":"2022-08-17T22:38:03.984461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" len(df_isolation_forest[df_isolation_forest.outlier_label==-1])","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:03.986690Z","iopub.execute_input":"2022-08-17T22:38:03.987165Z","iopub.status.idle":"2022-08-17T22:38:04.009040Z","shell.execute_reply.started":"2022-08-17T22:38:03.987090Z","shell.execute_reply":"2022-08-17T22:38:04.007730Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_no_outliers = train_without_null.drop(outliers)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:04.010637Z","iopub.execute_input":"2022-08-17T22:38:04.011061Z","iopub.status.idle":"2022-08-17T22:38:04.265496Z","shell.execute_reply.started":"2022-08-17T22:38:04.011025Z","shell.execute_reply":"2022-08-17T22:38:04.264518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_no_outliers.shape","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:04.267140Z","iopub.execute_input":"2022-08-17T22:38:04.267512Z","iopub.status.idle":"2022-08-17T22:38:04.274351Z","shell.execute_reply.started":"2022-08-17T22:38:04.267473Z","shell.execute_reply":"2022-08-17T22:38:04.273341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" ### Evaluar si es posible y si se justifica una reducción en la dimensionalidad.  \n ### Determinar si es necesario normalizar o unificar valores en alguna columna.","metadata":{}},{"cell_type":"markdown","source":"Es importante reducir dimensionalidad, para optimizar el tiempo de entrenamiento  \nAdemas normalizar las columnas significa una mejora para los modelos a entrenar","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\ncols = df_no_outliers.columns.tolist()\ncols.remove('target')\ncols.remove('customer_ID')\n\nx = df_no_outliers.loc[:, cols].values\ny = df_no_outliers.loc[:, ['target']].values\n\nx = StandardScaler().fit_transform(x)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:04.629812Z","iopub.execute_input":"2022-08-17T22:38:04.630239Z","iopub.status.idle":"2022-08-17T22:38:05.589571Z","shell.execute_reply.started":"2022-08-17T22:38:04.630197Z","shell.execute_reply":"2022-08-17T22:38:05.588459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print_full(x)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:05.591168Z","iopub.execute_input":"2022-08-17T22:38:05.591823Z","iopub.status.idle":"2022-08-17T22:38:05.599274Z","shell.execute_reply.started":"2022-08-17T22:38:05.591783Z","shell.execute_reply":"2022-08-17T22:38:05.597943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.decomposition import PCA\n\npca = PCA() \npca.fit(x)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:05.600770Z","iopub.execute_input":"2022-08-17T22:38:05.601525Z","iopub.status.idle":"2022-08-17T22:38:13.694381Z","shell.execute_reply.started":"2022-08-17T22:38:05.601475Z","shell.execute_reply":"2022-08-17T22:38:13.693326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca.explained_variance_ratio_","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:13.695780Z","iopub.execute_input":"2022-08-17T22:38:13.696961Z","iopub.status.idle":"2022-08-17T22:38:13.707781Z","shell.execute_reply.started":"2022-08-17T22:38:13.696921Z","shell.execute_reply":"2022-08-17T22:38:13.706585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"var_cumu = np.cumsum(pca.explained_variance_ratio_) * 100\nk = np.argmax(var_cumu > 90)\n\nplt.figure(figsize=[10, 10])\nplt.title('Varianza acumulada explicada por componente')\nplt.ylabel('Varianza acumulada explicada')\nplt.xlabel('Componentes principales')\nplt.axvline(x=k, color=\"k\", linestyle=\"--\")\nplt.axhline(y=90, color=\"r\", linestyle=\"--\")\nax = plt.plot(var_cumu)\nplt.show()\n\nprint (\"El número mínimo de componentes para explicar el 90% de la varianza es: \" + str(k))","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:13.709528Z","iopub.execute_input":"2022-08-17T22:38:13.710779Z","iopub.status.idle":"2022-08-17T22:38:13.948468Z","shell.execute_reply.started":"2022-08-17T22:38:13.710745Z","shell.execute_reply":"2022-08-17T22:38:13.947487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca = PCA(n_components = k) \nx_transform = pca.fit_transform(x)\n\n#df_aux =  df_no_outliers[cols]\ncolumns = ['pca_comp_%i' % i for i in range(k)]\n#df_pca  = pd.DataFrame(pca.transform(df_aux), columns=columns, index=df_aux.index)\n\ndf_pca  = pd.DataFrame(data = x_transform, columns=columns, index=df_no_outliers.index)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:13.950008Z","iopub.execute_input":"2022-08-17T22:38:13.950662Z","iopub.status.idle":"2022-08-17T22:38:30.833155Z","shell.execute_reply.started":"2022-08-17T22:38:13.950625Z","shell.execute_reply":"2022-08-17T22:38:30.832096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_pca","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:30.834774Z","iopub.execute_input":"2022-08-17T22:38:30.835203Z","iopub.status.idle":"2022-08-17T22:38:30.930442Z","shell.execute_reply.started":"2022-08-17T22:38:30.835159Z","shell.execute_reply":"2022-08-17T22:38:30.929330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_pca['target'] = df_no_outliers['target']\ndf_pca.insert(0, 'customer_ID', df_no_outliers['customer_ID'])","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:30.931763Z","iopub.execute_input":"2022-08-17T22:38:30.932850Z","iopub.status.idle":"2022-08-17T22:38:30.942724Z","shell.execute_reply.started":"2022-08-17T22:38:30.932810Z","shell.execute_reply":"2022-08-17T22:38:30.941733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_pca","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:30.944535Z","iopub.execute_input":"2022-08-17T22:38:30.944991Z","iopub.status.idle":"2022-08-17T22:38:31.088503Z","shell.execute_reply.started":"2022-08-17T22:38:30.944942Z","shell.execute_reply":"2022-08-17T22:38:31.087433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* ### Balancear el conjunto de datos","metadata":{}},{"cell_type":"markdown","source":"Es importante balancear los datos para que los modelos no se aprendan mas de un caso que del otro, condicionando asi las predicciones.","metadata":{}},{"cell_type":"code","source":"colors = sns.color_palette('pastel')[0:2]\nplt.pie([df_pca[df_pca.target == 1]['target'].count(), df_pca[df_pca.target == 0]['target'].count()], labels = ['Pagó su deuda', 'No pagó su deuda'], colors = colors, autopct='%.0f%%')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:31.090090Z","iopub.execute_input":"2022-08-17T22:38:31.090888Z","iopub.status.idle":"2022-08-17T22:38:31.402224Z","shell.execute_reply.started":"2022-08-17T22:38:31.090848Z","shell.execute_reply":"2022-08-17T22:38:31.401096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Para balancear el conjunto, debemos eliminar algunas filas dentro de las que no se pagaron.","metadata":{}},{"cell_type":"code","source":"print(\"cantidad target 1: \" + str(df_pca[df_pca.target == 1]['target'].count()))\nprint(\"cantidad target 0: \" + str(df_pca[df_pca.target == 0]['target'].count()))","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:31.403824Z","iopub.execute_input":"2022-08-17T22:38:31.404561Z","iopub.status.idle":"2022-08-17T22:38:31.674563Z","shell.execute_reply.started":"2022-08-17T22:38:31.404520Z","shell.execute_reply":"2022-08-17T22:38:31.673424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_didnt_pay = df_pca[df_pca['target']==0]\ndf_payed = df_pca[df_pca['target']==1]\ntotal_target_0 = df_didnt_pay['target'].count()\ntotal_target_1 = df_payed['target'].count()\nnew_total_target_0 = (60*total_target_1)/40","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:31.676011Z","iopub.execute_input":"2022-08-17T22:38:31.677236Z","iopub.status.idle":"2022-08-17T22:38:31.910717Z","shell.execute_reply.started":"2022-08-17T22:38:31.677197Z","shell.execute_reply":"2022-08-17T22:38:31.909726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"aux_payed = df_payed.reset_index(drop=True)\naux_didnt_pay = df_didnt_pay.reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:31.912263Z","iopub.execute_input":"2022-08-17T22:38:31.912665Z","iopub.status.idle":"2022-08-17T22:38:32.003214Z","shell.execute_reply.started":"2022-08-17T22:38:31.912628Z","shell.execute_reply":"2022-08-17T22:38:32.002209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samples_target_0 = sample_without_replacement(n_samples= new_total_target_0, n_population=total_target_0, random_state = 43)\ndidnt_pay_final = aux_didnt_pay[aux_didnt_pay.index.isin(samples_target_0)]","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:32.004833Z","iopub.execute_input":"2022-08-17T22:38:32.005218Z","iopub.status.idle":"2022-08-17T22:38:32.065065Z","shell.execute_reply.started":"2022-08-17T22:38:32.005177Z","shell.execute_reply":"2022-08-17T22:38:32.064180Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_final = pd.concat([aux_payed, didnt_pay_final], ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:32.066685Z","iopub.execute_input":"2022-08-17T22:38:32.067101Z","iopub.status.idle":"2022-08-17T22:38:32.127887Z","shell.execute_reply.started":"2022-08-17T22:38:32.067064Z","shell.execute_reply":"2022-08-17T22:38:32.126761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_final","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:32.129905Z","iopub.execute_input":"2022-08-17T22:38:32.130462Z","iopub.status.idle":"2022-08-17T22:38:32.211619Z","shell.execute_reply.started":"2022-08-17T22:38:32.130412Z","shell.execute_reply":"2022-08-17T22:38:32.210372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"colors = sns.color_palette('pastel')[0:2]\nplt.pie([ds_final[ds_final.target == 1]['target'].count(), ds_final[ds_final.target == 0]['target'].count()], labels = ['Pagó su deuda', 'No pagó su deuda'], colors = colors, autopct='%.0f%%')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:32.213029Z","iopub.execute_input":"2022-08-17T22:38:32.214024Z","iopub.status.idle":"2022-08-17T22:38:32.382056Z","shell.execute_reply.started":"2022-08-17T22:38:32.213973Z","shell.execute_reply":"2022-08-17T22:38:32.380743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* ### Identificar y documentar cualquier otra tarea de limpieza de datos que considere necesaria.","metadata":{}},{"cell_type":"markdown","source":"Consideramos que no son necesarias mas transformaciones.","metadata":{}},{"cell_type":"markdown","source":"## c. Descripción de los datos","metadata":{}},{"cell_type":"markdown","source":"Llegamos a un dataset mejor balanceado, compuesto por las columnas que mayor informacion brindan. El mismo es el que vamos a usar para entrenar los modelos.  \nUn particularidad, es que existen varias filas por cada 'customer_ID', y lo que se busca predecir es si el cliente va a pagar su deuda o no, por lo debemos hacer un tratamiento de las predicciones.  \nPara entrenar los modelos, se pasaran las datos sin importar a que 'customer_ID' pertenecen, de forma que un modelo va a predecir para cada movimiento si se va a pagar o no. Luego, para obtener la prediccion final sobre el cliente, se analizan las predicciones sobre cada movimiento del cliente, si el cliente posee una relacion entre movimientos que se van a pagar sobre el total de movimientos, mayor al 60%, entonces la prediccion final del cliente es que va a pagar su deuda. En caso contrario, la prediccion final es que no va a pagar su dueda.","metadata":{}},{"cell_type":"markdown","source":"# 2. Generación y evaluación de modelos","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split, StratifiedKFold, RandomizedSearchCV\nfrom sklearn.metrics import f1_score","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:38:32.609527Z","iopub.execute_input":"2022-08-17T22:38:32.609931Z","iopub.status.idle":"2022-08-17T22:38:32.621406Z","shell.execute_reply.started":"2022-08-17T22:38:32.609897Z","shell.execute_reply":"2022-08-17T22:38:32.620029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" Separamos un 20% de los datos para usarlos como conjunto de evaluación. El conjunto restante (80%) será el de entrenamiento.","metadata":{}},{"cell_type":"code","source":"ds_final_x = ds_final.drop(['target'], axis='columns', inplace=False)\n\nds_final_y = ds_final.loc[:, ['customer_ID', 'target']]\n\nx_train, x_test, y_train, y_test = train_test_split(ds_final_x, ds_final_y, test_size=0.2, random_state=2)\n\nx_train.drop(['customer_ID'], axis='columns', inplace=True)\ny_train.drop(['customer_ID'], axis='columns', inplace=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Construimos un nuevo y_test ordenado por 'customer_ID', quedandonos con una unica fila por cada uno.","metadata":{}},{"cell_type":"code","source":"y_test_new = []\ny_test.sort_values('customer_ID', inplace = True)\ncustomer_ID = y_test['customer_ID'].unique()  #customer ID unicos\nfor c_id in customer_ID:\n    t = y_test.loc[lambda df: df['customer_ID'] == c_id , 'target']\n    y_test_new.append(t.iloc[0])  #target unico para cada customer ID","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Ademas definimos una funcion que se va a quedar con la prediccion final de cada cliente, haciendo el analisas ya explicado. El mismo se genera cumpliento el orden del nuevo y_test.","metadata":{}},{"cell_type":"code","source":"x_test = x_test.sort_values('customer_ID')\nx_test = x_test.reset_index(drop=True)  #x_test ordenado por customer ID\nx_test_customer_ID = x_test.loc[: , 'customer_ID']\n\nx_test.drop(['customer_ID'], axis='columns', inplace=True)\n\ndef get_y_pred_new(model):\n    y_pred = model.predict(x_test)  #pred para cada fila por customer ID\n\n    pred_by_id = []\n    y_pred_new = []\n    actual = 'x'\n    for i in range(len(x_test_customer_ID)):\n        nuevo = x_test_customer_ID.iloc[i]  #un customer ID\n\n        if(actual != nuevo):\n            cant_nuevo = len(x_test_customer_ID.loc[lambda c_id: c_id == nuevo])  #cantidad filas por customer ID\n\n            pred_by_id = []\n            for y in range(cant_nuevo):\n                pred_by_id.append(y_pred[i+y])  #todas las predicciones por customer ID\n\n            cant_positivos = 0\n            for y in range(len(pred_by_id)):\n                if(pred_by_id[y] == 1):\n                    cant_positivos += 1  #cantidad predicciones positivas\n\n            pred = 0\n            if (cant_positivos/len(pred_by_id) > 0.6): \n                pred = 1\n\n            y_pred_new.append(pred)  #predicciones finales\n            actual = nuevo\n            \n    return y_pred_new","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## a. Modelos","metadata":{}},{"cell_type":"markdown","source":"Para los medelos a los que aplicamos validacion cruzada, utilizaremos 5 folds, y se buscara optimizar la metrica f1.","metadata":{}},{"cell_type":"markdown","source":"* Random Forest","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rf_grid = { \"criterion\" : [\"gini\", \"entropy\"],\n               \"max_features\": [\"sqrt\", \"log2\"],\n               \"min_samples_leaf\":list(range(1,10)),\n               \"min_samples_split\": list(range(2,15)),\n               \"n_estimators\": list(range(10,50)) }\n\nrf_cv = RandomForestClassifier(random_state=2, n_jobs=-1)\n\nrandomcv = RandomizedSearchCV(estimator=rf_cv,\n                              param_distributions = rf_grid,\n                              scoring=\"f1\",\n                              cv=StratifiedKFold(n_splits=5),\n                              n_iter=15,\n                              random_state=2,\n                              n_jobs=-1) \n\n#randomcv.fit(x_train,y_train);","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:31:24.448839Z","iopub.execute_input":"2022-08-15T22:31:24.449918Z","iopub.status.idle":"2022-08-15T22:31:24.457893Z","shell.execute_reply.started":"2022-08-15T22:31:24.449831Z","shell.execute_reply":"2022-08-15T22:31:24.456937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Luego de 15 iteraciones para buscar los mejores hiperparametros, encontramos que son los siguientes:\n* n_estimators: 43  \n* min_samples_split: 12  \n* min_samples_leaf: 1  \n* max_features: sqrt  \n* criterion: gini","metadata":{}},{"cell_type":"code","source":"rf = RandomForestClassifier(random_state=2, n_jobs=-1, n_estimators=43, min_samples_split=12, min_samples_leaf= 1, max_features='sqrt', criterion='gini')\n\n#model = rf.fit(x_train,y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:31:34.143778Z","iopub.execute_input":"2022-08-17T23:31:34.144464Z","iopub.status.idle":"2022-08-17T23:31:34.149895Z","shell.execute_reply.started":"2022-08-17T23:31:34.144424Z","shell.execute_reply":"2022-08-17T23:31:34.148914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Cargamos el modelo ya entrenado:","metadata":{}},{"cell_type":"code","source":"model = pd.read_pickle('../input/american/RandomForestClassifier.pkl')","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:27:32.572660Z","iopub.execute_input":"2022-08-17T23:27:32.573247Z","iopub.status.idle":"2022-08-17T23:27:32.938481Z","shell.execute_reply.started":"2022-08-17T23:27:32.573210Z","shell.execute_reply":"2022-08-17T23:27:32.937425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:27:37.616374Z","iopub.execute_input":"2022-08-17T23:27:37.616882Z","iopub.status.idle":"2022-08-17T23:29:12.220757Z","shell.execute_reply.started":"2022-08-17T23:27:37.616833Z","shell.execute_reply":"2022-08-17T23:29:12.219385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* XGBoost","metadata":{}},{"cell_type":"code","source":"import xgboost as xgb\nfrom xgboost import XGBClassifier","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:31:42.743381Z","iopub.execute_input":"2022-08-17T23:31:42.744139Z","iopub.status.idle":"2022-08-17T23:31:42.877425Z","shell.execute_reply.started":"2022-08-17T23:31:42.744077Z","shell.execute_reply":"2022-08-17T23:31:42.876142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xgb_grid = { \"learning_rate\" : np.arange(0.1, 1, 0.1),\n               \"max_depth\": np.arange(5,26,5),\n               \"subsample\": np.arange(0.2, 1, 0.2),\n               \"colsample_bytree\": np.arange(0.2, 1, 0.2),\n               \"gamma\" : np.arange(0.2, 1, 0.2),\n               \"reg_alpha\" : np.arange(0.2, 1, 0.2),\n               \"n_estimators\": list(range(10,25)) }\n\nxgb_cv = XGBClassifier(random_state=0)\n\nrandomcv = RandomizedSearchCV(estimator=xgb_cv, \n                         param_distributions=xgb_grid, \n                         scoring='f1',\n                         cv=StratifiedKFold(n_splits=5),\n                         n_iter=15,\n                         random_state=2,\n                         n_jobs=-1)\n\n\n#randomcv.fit(x_train,y_train);","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.906800Z","iopub.status.idle":"2022-08-15T22:36:47.907385Z","shell.execute_reply.started":"2022-08-15T22:36:47.907138Z","shell.execute_reply":"2022-08-15T22:36:47.907162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Luego de 15 iteraciones para buscar los mejores hiperparametros, encontramos que son los siguientes:  \n* subsample: 0.8  \n* reg_alpha: 0.8  \n* n_estimators: 13  \n* max_depth: 15  \n* learning_rate: 0.2  \n* gamma: 0.4  \n* colsample_bytree: 0.8","metadata":{}},{"cell_type":"code","source":"xgbc = XGBClassifier(random_state=0, n_jobs=-1, subsample=0.8, reg_alpha=0.8, n_estimators=13, max_depth=15, learning_rate=0.2, gamma=0.4, colsample_bytree=0.8)\n\n#model = xgbc.fit(x_train,y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:31:45.856899Z","iopub.execute_input":"2022-08-17T23:31:45.857330Z","iopub.status.idle":"2022-08-17T23:31:45.864241Z","shell.execute_reply.started":"2022-08-17T23:31:45.857272Z","shell.execute_reply":"2022-08-17T23:31:45.862806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Cargamos el modelo ya entrenado:","metadata":{}},{"cell_type":"code","source":"model = pd.read_pickle('../input/american/XGBClassifier.pkl')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.911326Z","iopub.status.idle":"2022-08-15T22:36:47.911867Z","shell.execute_reply.started":"2022-08-15T22:36:47.911629Z","shell.execute_reply":"2022-08-15T22:36:47.911652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* SVM con kernel POLINOMICO","metadata":{}},{"cell_type":"code","source":"from sklearn.svm import SVC","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.913625Z","iopub.status.idle":"2022-08-15T22:36:47.914859Z","shell.execute_reply.started":"2022-08-15T22:36:47.914609Z","shell.execute_reply":"2022-08-15T22:36:47.914633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scv_grid = {\"kernel\" : ['poly'] ,\n            \"C\" : [1e+0,1e+1,1e+2,1e+3,1e+4,1e+5,1e+6,1e+7,1e+8,1e+9],\n            \"degree\": [1e-4,1e-3,1e-2,1e-1,1e+0,1e+1,1e+2,1e+3,1e+4],\n            \"gamma\": [1e-4,1e-3,1e-2,1e-1,1e+0,1e+1,1e+2,1e+3,1e+4],\n            \"coef0\": [1e-4,1e-3,1e-2,1e-1,1e+0,1e+1,1e+2,1e+3,1e+4] \n           }\n\nrandomcv = RandomizedSearchCV(SVC(random_state=0), \n                            scv_grid, \n                            scoring='f1',\n                             cv=StratifiedKFold(n_splits=5),\n                             n_iter=1,\n                             random_state=2,\n                             n_jobs=-1)\n\n\n#randomcv.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.916314Z","iopub.status.idle":"2022-08-15T22:36:47.917284Z","shell.execute_reply.started":"2022-08-15T22:36:47.917042Z","shell.execute_reply":"2022-08-15T22:36:47.917066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Luego de varias iteraciones para buscar los mejores hiperparametros, encontramos que son los siguientes:   \n* kernel: poly  \n* gamma: 1000.0  \n* degree:  1000.0  \n* coef0: 100.0  \n* C: 10000.0  \n  \nLos mismos no generan un modelo aceptable. Teniendo en cuenta el tiempo de entrenamiento de cada SVM, y los resultados obtenidos, concluimos que, como primera opcion, no seria una buena desicion implementar un modelo de este tipo.","metadata":{}},{"cell_type":"code","source":"svc = SVC(kernel= 'poly', gamma= 1000.0, degree= 1000.0, coef0= 100.0, C= 10000.0, random_state=0)\n\n#model = svc.fit(x_train,y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.923546Z","iopub.status.idle":"2022-08-15T22:36:47.924604Z","shell.execute_reply.started":"2022-08-15T22:36:47.924359Z","shell.execute_reply":"2022-08-15T22:36:47.924383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Cargamos el modelo ya entrenado:","metadata":{}},{"cell_type":"code","source":"model = pd.read_pickle('../input/american/SVC.pkl')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.925407Z","iopub.status.idle":"2022-08-15T22:36:47.925859Z","shell.execute_reply.started":"2022-08-15T22:36:47.925625Z","shell.execute_reply":"2022-08-15T22:36:47.925645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* Logistic Regresor","metadata":{}},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression","metadata":{"execution":{"iopub.status.busy":"2022-08-17T13:29:56.671662Z","iopub.execute_input":"2022-08-17T13:29:56.672257Z","iopub.status.idle":"2022-08-17T13:29:56.679110Z","shell.execute_reply.started":"2022-08-17T13:29:56.672217Z","shell.execute_reply":"2022-08-17T13:29:56.677803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr_grid = { \"solver\" : ['newton-cg', 'lbfgs', 'liblinear'],\n            \"penalty\": ['none', 'l1', 'l2', 'elasticnet'],\n            \"C\": [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10, 100]\n          }\n\nlr_cv = LogisticRegression(random_state=2, n_jobs=-1)\n\nrandomcv = RandomizedSearchCV(estimator=lr_cv,\n                              param_distributions = lr_grid,\n                              scoring=\"f1\",\n                              cv=StratifiedKFold(n_splits=5),\n                              n_iter=20,\n                              random_state=2,\n                              n_jobs=-1) \n\n#randomcv.fit(x_train,y_train);","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Luego de 20 iteraciones para buscar los mejores hiperparametros, encontramos que son los siguientes:  \n* solver: newton-cg \n* penalty: l2  \n* C: 0.1","metadata":{}},{"cell_type":"code","source":"lr = LogisticRegression(random_state=2, n_jobs=-1, solver='newton-cg', penalty='l2', C= 0.1)\n\n#model = lr.fit(x_train,y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T13:38:45.725511Z","iopub.execute_input":"2022-08-17T13:38:45.726032Z","iopub.status.idle":"2022-08-17T13:39:10.065326Z","shell.execute_reply.started":"2022-08-17T13:38:45.725995Z","shell.execute_reply":"2022-08-17T13:39:10.064079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Cargamos el modelo ya entrenado:","metadata":{}},{"cell_type":"code","source":"model = pd.read_pickle('../input/american/LogisticRegression.pkl')","metadata":{"execution":{"iopub.status.busy":"2022-08-17T13:39:29.082751Z","iopub.execute_input":"2022-08-17T13:39:29.083198Z","iopub.status.idle":"2022-08-17T13:39:29.088707Z","shell.execute_reply.started":"2022-08-17T13:39:29.083158Z","shell.execute_reply":"2022-08-17T13:39:29.087916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T13:39:45.814888Z","iopub.execute_input":"2022-08-17T13:39:45.815292Z","iopub.status.idle":"2022-08-17T13:41:49.973050Z","shell.execute_reply.started":"2022-08-17T13:39:45.815259Z","shell.execute_reply":"2022-08-17T13:41:49.971781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* K-Neighbors Classifier","metadata":{}},{"cell_type":"code","source":"from sklearn.neighbors import KNeighborsClassifier","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:35:51.116021Z","iopub.execute_input":"2022-08-17T23:35:51.116430Z","iopub.status.idle":"2022-08-17T23:35:51.121020Z","shell.execute_reply.started":"2022-08-17T23:35:51.116395Z","shell.execute_reply":"2022-08-17T23:35:51.119860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"kn_grid = { \"n_neighbors\" : list(range(2,30)),\n               \"weights\": [\"uniform\", \"distance\"],\n               \"metric\" : [\"manhattan\", \"euclidean\", \"mahalanobis\"] \n          }\n\nkn_cv = KNeighborsClassifier( n_jobs=-1)\n\nrandomcv = RandomizedSearchCV(estimator=kn_cv,\n                              param_distributions = kn_grid,\n                              scoring=\"f1\",\n                              cv=StratifiedKFold(n_splits=5),\n                              n_iter=8,\n                              random_state=2,\n                              n_jobs=-1) \n\n#randomcv.fit(x_train,y_train);","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.945403Z","iopub.status.idle":"2022-08-15T22:36:47.946485Z","shell.execute_reply.started":"2022-08-15T22:36:47.946241Z","shell.execute_reply":"2022-08-15T22:36:47.946264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Luego de 8 iteraciones para buscar los mejores hiperparametros, encontramos que son los siguientes:   \n* weights: distance  \n* n_neighbors: 8  \n* metric: manhattan","metadata":{}},{"cell_type":"code","source":"kn = KNeighborsClassifier(n_jobs=-1, weights='distance', n_neighbors=8, metric='manhattan')\n\n#model = kn.fit(x_train,y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:35:53.544190Z","iopub.execute_input":"2022-08-17T23:35:53.545197Z","iopub.status.idle":"2022-08-17T23:35:53.550467Z","shell.execute_reply.started":"2022-08-17T23:35:53.545159Z","shell.execute_reply":"2022-08-17T23:35:53.549201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = pd.read_pickle('../input/american/KNeighborsClassifier.pkl')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.950106Z","iopub.status.idle":"2022-08-15T22:36:47.951179Z","shell.execute_reply.started":"2022-08-15T22:36:47.950917Z","shell.execute_reply":"2022-08-15T22:36:47.950942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## b. Ensamble de modelos","metadata":{}},{"cell_type":"markdown","source":"* VotingClassifier","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import VotingClassifier","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.958870Z","iopub.status.idle":"2022-08-15T22:36:47.960111Z","shell.execute_reply.started":"2022-08-15T22:36:47.959851Z","shell.execute_reply":"2022-08-15T22:36:47.959876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"estimator = []\nestimator.append(('RF', rf ))\nestimator.append(('XGB', xgbc ))\nestimator.append(('LR', lr ))\nestimator.append(('KN', kn ))\n  \nvc = VotingClassifier(estimators = estimator, voting ='hard')","metadata":{"execution":{"iopub.status.busy":"2022-08-15T22:36:47.960902Z","iopub.status.idle":"2022-08-15T22:36:47.961442Z","shell.execute_reply.started":"2022-08-15T22:36:47.961202Z","shell.execute_reply":"2022-08-15T22:36:47.961225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Cargamos el modelo ya entrenado:","metadata":{}},{"cell_type":"code","source":"model = pd.read_pickle('../input/american/VotingClassifier.pkl')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:42:07.025235Z","iopub.execute_input":"2022-08-17T22:42:07.025980Z","iopub.status.idle":"2022-08-17T22:42:07.128598Z","shell.execute_reply.started":"2022-08-17T22:42:07.025944Z","shell.execute_reply":"2022-08-17T22:42:07.126856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## c. Redes Neuronales","metadata":{}},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense\n\ndef create_model():\n    # create model\n    model = Sequential(name='modelo_1')\n    model.add(Dense(16, input_dim=len(x_train.columns), activation='relu'))\n    model.add(Dense(1, activation='sigmoid'))\n    # Compile model\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    return model\n\n","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:42:31.077954Z","iopub.execute_input":"2022-08-17T22:42:31.078357Z","iopub.status.idle":"2022-08-17T22:42:31.084830Z","shell.execute_reply.started":"2022-08-17T22:42:31.078323Z","shell.execute_reply":"2022-08-17T22:42:31.083734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.wrappers.scikit_learn import KerasClassifier\n\nmodel = KerasClassifier(create_model, batch_size=5,epochs=50,verbose=0)\nmodel.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T22:42:31.109195Z","iopub.execute_input":"2022-08-17T22:42:31.109913Z","iopub.status.idle":"2022-08-17T23:20:56.728190Z","shell.execute_reply.started":"2022-08-17T22:42:31.109875Z","shell.execute_reply":"2022-08-17T23:20:56.727170Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:33:04.726812Z","iopub.execute_input":"2022-08-17T23:33:04.727253Z","iopub.status.idle":"2022-08-17T23:34:41.977069Z","shell.execute_reply.started":"2022-08-17T23:33:04.727215Z","shell.execute_reply":"2022-08-17T23:34:41.975797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## d. Ensamble en cascada","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.ensemble import StackingClassifier\nfrom keras.wrappers.scikit_learn import KerasClassifier\nfrom sklearn.neural_network import MLPClassifier\n\ndef create_model():\n    # create model\n    model = Sequential(name='modelo_1')\n    model.add(Dense(16, input_dim=len(x_train.columns), activation='relu'))\n    model.add(Dense(1, activation='sigmoid'))\n    # Compile model\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    return model\n\n\nnn = KerasClassifier(create_model, epochs=5, batch_size= 32)\nnn._estimator_type = \"classifier\"\n\nestimators = [('nn',nn),\n              ('kn', kn),\n              ('rf', rf)]","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:36:06.948254Z","iopub.execute_input":"2022-08-17T23:36:06.948785Z","iopub.status.idle":"2022-08-17T23:36:06.959451Z","shell.execute_reply.started":"2022-08-17T23:36:06.948742Z","shell.execute_reply":"2022-08-17T23:36:06.958269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clf = StackingClassifier(estimators=estimators, final_estimator= MLPClassifier())\nmodel = clf.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-17T23:36:12.788056Z","iopub.execute_input":"2022-08-17T23:36:12.788432Z","iopub.status.idle":"2022-08-18T01:26:01.017328Z","shell.execute_reply.started":"2022-08-17T23:36:12.788399Z","shell.execute_reply":"2022-08-18T01:26:01.015511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_new = get_y_pred_new(model)\nf1_score(y_test_new, y_pred_new)","metadata":{"execution":{"iopub.status.busy":"2022-08-18T01:59:03.096150Z","iopub.execute_input":"2022-08-18T01:59:03.096757Z","iopub.status.idle":"2022-08-18T01:59:11.609189Z","shell.execute_reply.started":"2022-08-18T01:59:03.096720Z","shell.execute_reply":"2022-08-18T01:59:11.605835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Conclusiones","metadata":{}},{"cell_type":"markdown","source":"Alizamos un poco mas como se comporto el ultimo modelo, ya que fue el mejor.","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import classification_report\nprint(classification_report(y_test_new, y_pred_new))","metadata":{"execution":{"iopub.status.busy":"2022-08-18T01:59:16.090602Z","iopub.execute_input":"2022-08-18T01:59:16.091106Z","iopub.status.idle":"2022-08-18T01:59:16.248189Z","shell.execute_reply.started":"2022-08-18T01:59:16.091066Z","shell.execute_reply":"2022-08-18T01:59:16.247241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import ConfusionMatrixDisplay\n\ncm = confusion_matrix(y_test_new, y_pred_new)\n\ncm_display = ConfusionMatrixDisplay(cm).plot()","metadata":{"execution":{"iopub.status.busy":"2022-08-18T01:59:19.050833Z","iopub.execute_input":"2022-08-18T01:59:19.051362Z","iopub.status.idle":"2022-08-18T01:59:19.501450Z","shell.execute_reply.started":"2022-08-18T01:59:19.051320Z","shell.execute_reply":"2022-08-18T01:59:19.500579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Viendo esta informacion pordemos afirmar que no llegamos a un modelo extremadamente confiable para predecir si un cliente va a pagar su deuda o no, teniendo en cuenta la importancia que una entidad bancaria le da a esto. Sin embargo, se llego a un buen modelo, que predice con alta presicion cuando algun cliente no va a pagar, el mismo prodia ser complementado con otro modelo para aumentar el recall de aquellos que no pagaran su deuda, con el fin de no dejar pasar muchos deudores. O se podria buscar mejorar el mismo, para llegar a un modelo aun mas confiable. ","metadata":{}},{"cell_type":"code","source":"d = {'customer_ID': customer_ID, 'test': y_test_new, 'pred' : y_pred_new}\naux = pd.DataFrame(data=d)\naux","metadata":{"execution":{"iopub.status.busy":"2022-08-18T01:59:29.950167Z","iopub.execute_input":"2022-08-18T01:59:29.950593Z","iopub.status.idle":"2022-08-18T01:59:30.014164Z","shell.execute_reply.started":"2022-08-18T01:59:29.950555Z","shell.execute_reply":"2022-08-18T01:59:30.013331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"true_positive = aux.loc[lambda df: (df['test'] == 1) & (df['pred'] == 1) , ['customer_ID']]\ndf_true_positive = df_train.loc[df_train.customer_ID.isin(true_positive.customer_ID)]\n\nfalse_positive = aux.loc[lambda df: (df['test'] == 0) & (df['pred'] == 1) , ['customer_ID']]\ndf_false_positive = df_train.loc[df_train.customer_ID.isin(false_positive.customer_ID)]\n\ntrue_negative = aux.loc[lambda df: (df['test'] == 0) & (df['pred'] == 0) , ['customer_ID']]\ndf_true_negative = df_train.loc[df_train.customer_ID.isin(true_negative.customer_ID)]\n\nfalse_negative = aux.loc[lambda df: (df['test'] == 1) & (df['pred'] == 0) , ['customer_ID']]\ndf_false_negative = df_train.loc[df_train.customer_ID.isin(false_negative.customer_ID)]","metadata":{"execution":{"iopub.status.busy":"2022-08-18T01:59:33.378122Z","iopub.execute_input":"2022-08-18T01:59:33.378565Z","iopub.status.idle":"2022-08-18T01:59:33.830633Z","shell.execute_reply.started":"2022-08-18T01:59:33.378524Z","shell.execute_reply":"2022-08-18T01:59:33.829572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Veamos como se diferencian las variables categorias en cada caso","metadata":{}},{"cell_type":"code","source":"for feature in categorical_features:\n   \n    fig, axs = plt.subplots(1, 4, figsize=(15, 5), sharey=True)\n    \n    sns.countplot(ax=axs[0], x = feature, data = df_true_positive).set_title('TP')\n    \n    sns.countplot(ax=axs[1], x = feature, data = df_false_positive).set_title('FP')\n    \n    sns.countplot(ax=axs[2], x = feature, data = df_true_negative).set_title('TN')\n    \n    sns.countplot(ax=axs[3], x = feature, data = df_false_negative).set_title('FN')\n    \n    ","metadata":{"execution":{"iopub.status.busy":"2022-08-18T02:00:21.266837Z","iopub.execute_input":"2022-08-18T02:00:21.267226Z","iopub.status.idle":"2022-08-18T02:00:25.881233Z","shell.execute_reply.started":"2022-08-18T02:00:21.267192Z","shell.execute_reply":"2022-08-18T02:00:25.880223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Las conclusiones que nos podemos llevar del trabajo practico es la importancia de analizar bien los datos para poder entender a donde a puntan los mismos y que tratan de decirnos. Consideramos que en este punto nos falto investigar un poco mas lo que estos representaban, sin embargo al ser los mismos tan ambiguos nos resulto un poco complicado este procedimiento.\nMirando los datos y los resultados de nuestras prediciones no podemos encontrar algun patron en el que nos permita definir cuando (o no) un cliente va a pagar su tarjeta. \nOtra cosa que nos llevamos es que los algoritmos tipo ensamble son realmente lo mejor que uno puede intentar desarrollar, ya que observamos como al combinar varios modelos el resultado mejoro notablemente.","metadata":{}}]}