{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":50160,"databundleVersionId":7921029,"sourceType":"competition"},{"sourceId":10329481,"sourceType":"datasetVersion","datasetId":6395866},{"sourceId":10331423,"sourceType":"datasetVersion","datasetId":6397011}],"dockerImageVersionId":30822,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from sklearn.model_selection import RandomizedSearchCV\nfrom scipy.stats import uniform, randint\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.impute import SimpleImputer\nfrom xgboost import XGBClassifier\nfrom sklearn.compose import ColumnTransformer\nimport pandas as pd\nimport numpy as np\nimport polars as pl\nimport os","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2024-12-30T06:05:42.352957Z","iopub.execute_input":"2024-12-30T06:05:42.353369Z","iopub.status.idle":"2024-12-30T06:05:42.927824Z","shell.execute_reply.started":"2024-12-30T06:05:42.353333Z","shell.execute_reply":"2024-12-30T06:05:42.926750Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Importador:\n    # Clase que importa datos\n    def __init__(self, directory, dataframes_nombres):\n        #directory: directorio de datos\n        #dataframes_nombres: diccionario con los nombres de los data frames\n        self.directory = directory\n        self.dataframes_nombres = dataframes_nombres\n        self.dataframes = {}\n\n    def from_csv(self):\n        # Lectura de archivos utilizando csv\n        for df_name, file_names in self.dataframes_nombres.items():\n            try:\n                if len(file_names) > 1:\n                    dfs = []\n                    for file_name in file_names:\n                        file_path = os.path.join(self.directory, file_name+'.csv')\n                        dfs.append(pl.read_csv(file_path))\n                    self.dataframes[df_name] = pl.concat(dfs, how='vertical_relaxed')\n                else:\n                    file_path = os.path.join(self.directory, file_names[0]+'.csv')\n                    self.dataframes[df_name] = pl.read_csv(file_path)\n            except FileNotFoundError:\n                print(f\"Error: No se pudo encontrar el arcivo con nombre {df_name}\")\n            except Exception as e:\n              print(f\"Ocurrio un error al procesar {df_name}: {e}\")\n        return self.dataframes\n\n    def from_parquet(self):\n        # Lectura de archivos optimizada para el uso de Parquets\n        depth0 = ['train_static_0', 'train_static_cb','base','test_static_0','test_static_cb'] #tablas con profundidad cero\n        for df_name, file_names in self.dataframes_nombres.items():\n            try:\n                if len(file_names) > 1:\n                    dfs = []\n                    for file_name in file_names:\n                        file_path = os.path.join(self.directory, file_name+'.parquet')\n                        temp = pl.read_parquet(file_path)\n                        temp = Preprocesamiento.casteo_columnas(temp)\n                        if df_name not in depth0:\n                            temp = temp.group_by(\"case_id\").agg(Agregaciones.get_exprs(temp))\n                        dfs.append(temp)\n                    self.dataframes[df_name] = pl.concat(dfs, how='vertical_relaxed')\n                else:\n                    file_path = os.path.join(self.directory, file_names[0]+'.parquet')\n                    temp = pl.read_parquet(file_path)\n                    temp =Preprocesamiento.casteo_columnas(temp)\n                    if df_name not in depth0:\n                        temp = temp.group_by(\"case_id\").agg(Agregaciones.get_exprs(temp))\n                    self.dataframes[df_name] = temp\n            except FileNotFoundError:\n                print(f\"Error: No se pudo encontrar el arcivo con nombre {df_name}\")\n            except Exception as e:\n              print(f\"Ocurrio un error al procesar {df_name}: {e}\")\n        return self.dataframes\n\n    def from_csv_optim(self):\n        # Lectura de archivos optimizada para csv\n        depth0 = ['train_static_0', 'train_static_cb','base','test_static_0','test_static_cb'] #tablas con profundidad cero\n        for df_name, file_names in self.dataframes_nombres.items():\n            try:\n                if len(file_names) > 1:\n                    dfs = []\n                    for file_name in file_names:\n                        file_path = os.path.join(self.directory, file_name+'.csv')\n                        temp = pl.read_csv(file_path)\n                        temp = Preprocesamiento.casteo_columnas(temp)\n                        if df_name not in depth0:\n                           temp = temp.group_by(\"case_id\").agg(Agregaciones.get_exprs(temp))\n                        dfs.append(temp)\n                    self.dataframes[df_name] = pl.concat(dfs, how='vertical_relaxed')\n                else:\n                    file_path = os.path.join(self.directory, file_names[0]+'.csv')\n                    temp = pl.read_csv(file_path)\n                    temp =Preprocesamiento.casteo_columnas(temp)\n                    if df_name not in depth0:\n                        temp = temp.group_by(\"case_id\").agg(Agregaciones.get_exprs(temp))\n                    self.dataframes[df_name] = temp\n            except FileNotFoundError:\n                print(f\"Error: No se pudo encontrar el arcivo con nombre {df_name}\")\n            except Exception as e:\n              print(f\"Ocurrio un error al procesar {df_name}: {e}\")\n        return self.dataframes","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:42.929223Z","iopub.execute_input":"2024-12-30T06:05:42.929572Z","iopub.status.idle":"2024-12-30T06:05:42.946143Z","shell.execute_reply.started":"2024-12-30T06:05:42.929538Z","shell.execute_reply":"2024-12-30T06:05:42.944774Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Preprocesamiento:\n    # Clase con funciones para el preprocesamiento\n    def casteo_columnas(df):\n      # basandonos en la documentacion de kaggle\n      # utilizamos las etiquetas para castear los datos\n      for col in df.columns:\n          # columnas especiales para la base\n          if col in [\"case_id\", \"WEEK_NUM\", \"num_group1\", \"num_group2\"]:\n              df = df.with_columns(pl.col(col).cast(pl.Int64))\n          elif col in [\"date_decision\"]:\n              df = df.with_columns(pl.col(col).cast(pl.Date))\n          # P representa dias\n          # A representa ganancias\n          elif col[-1] in (\"P\", \"A\"):\n              df = df.with_columns(pl.col(col).cast(pl.Float64))\n          # M representan categorias\n          elif col[-1] in (\"M\",):\n              df = df.with_columns(pl.col(col).cast(pl.String))\n          # D es para fechas\n          elif col[-1] in (\"D\",):\n              df = df.with_columns(pl.col(col).cast(pl.Date))\n      return df\n\n    def convertir_fechas(df):\n      # Convertimos las fechas a dias utilizano date_decision\n      for col in df.columns:\n          if col[-1] in (\"D\",):\n              df = df.with_columns(pl.col(col) - pl.col(\"date_decision\"))\n              df = df.with_columns(pl.col(col).dt.total_days())\n      df = df.drop(\"date_decision\", \"MONTH\",'WEEK_NUM')\n      return df\n\n    def filtrar_fijos(df):\n      # Filtramos los fijos y aquellas columnas con mas del 99% de nulos\n      for col in df.columns:\n          if col not in [\"target\", \"case_id\", \"WEEK_NUM\",'MONTH','date_decision']:\n              isnull = df[col].is_null().mean()\n              if isnull >0.99 or df[col].n_unique() == 1:\n                  df = df.drop(col)\n      return df\n\n\n    def filtrar_categoricas(df):\n        # Elimina variables categoricas amplias\n        for col in df.columns:\n            if df[col].dtype == pl.Categorical or df[col].dtype == pl.String:\n                if df[col].n_unique() > 150:\n                    df = df.drop(col)\n        return df\n    \n    def filtrar_valores_atipicos(df):\n      # Eliminamos valores atipicos\n      for col in df.columns:\n        if df[col].dtype not in (pl.String,pl.Categorical,pl.Boolean,pl.Date) and not df[col].is_null().all():\n          Q1 = df[col].quantile(0.25)\n          Q3 = df[col].quantile(0.75)\n          IQR = Q3 - Q1\n          lower = Q1 - 1.5*IQR\n          upper = Q3 + 1.5*IQR\n\n          # Arreglo que indica los outliers\n          upper_array = np.where(df[col] >= upper)[0]\n          lower_array = np.where(df[col] <= lower)[0]\n\n          df = df.with_columns(\n              pl.when((pl.col(col) < lower) | (pl.col(col) > upper))\n              .then(None)\n              .otherwise(pl.col(col)).alias(col))\n      return df\n","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:42.948311Z","iopub.execute_input":"2024-12-30T06:05:42.948768Z","iopub.status.idle":"2024-12-30T06:05:42.971143Z","shell.execute_reply.started":"2024-12-30T06:05:42.948726Z","shell.execute_reply":"2024-12-30T06:05:42.969952Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Pipeline_preprocesamiento:\n\n  def casteo_datos(self,dfs):\n    # Se castean todas las columnas\n    for df_name,df in dfs.items():\n      dfs[df_name] = Preprocesamiento.casteo_columnas(df)\n    return dfs\n\n  def filtracion_datos(self,dfs):\n    # Se filtran las columnas\n    for df_name,df in dfs.items():\n      dfs[df_name] = Preprocesamiento.filtrar_fijos(df)\n      dfs[df_name] = Preprocesamiento.filtrar_categoricas(df)\n    return dfs\n\n  def convertir_fechas_datos(self,dfs):\n    # Se hace un join con la base, necesario para convertir las fechas\n    base = dfs['base'][['case_id',\"date_decision\", \"MONTH\",'WEEK_NUM']]\n    for df_name,df in dfs.items():\n        if df_name == 'base':\n          continue\n        dfs[df_name] = dfs[df_name].join(base,on='case_id',how='left')\n        dfs[df_name] = Preprocesamiento.convertir_fechas(dfs[df_name])\n    return dfs\n\n  def agregacion(self,dfs):\n    # Se agregaon los datos con depth>0\n    depth0 = ['train_static_0', 'train_static_cb','base','test_static_0','test_static_cb'] #tablas con profundidad cero\n    for df_name,df in dfs.items():\n      if df_name not in depth0:\n        dfs[df_name] = dfs[df_name].group_by(\"case_id\").agg(Agregaciones.get_exprs(df))\n    return dfs\n\n  def concat_datos(self,dfs):\n    # Se concatenan los datos\n    # Este valor sirve para formar los cojuntos X_train y y_train\n    base = dfs['base'].drop(\"date_decision\", \"MONTH\",'WEEK_NUM')\n    for df_name,df in dfs.items():\n      if df_name == 'base':\n        continue\n      base = base.join(df,on='case_id',how='left')\n    return base\n\n  def to_pandas(self, df_data, cat_cols=None):\n    # El modelo XGBClassifier solo funcionar con objetivos tipo pd.DataFrame\n    # Por lo tanto el casteo es necesario\n    df_data = df_data.to_pandas()\n    print('tranformacion correcta')\n    print(type(df_data))\n    if cat_cols is None:\n        cat_cols = list(df_data.select_dtypes(\"object\").columns)\n    df_data[cat_cols] = df_data[cat_cols].astype(\"category\") #tipo categorias, importante para el modelo XGB\n    return df_data\n\n  def __call__(self,dict_df):\n    dfs = {df_name: df.clone() for df_name, df in dict_df.items()}\n\n    dfs = self.filtracion_datos(dfs)\n    dfs = self.convertir_fechas_datos(dfs)\n    dfs = self.concat_datos(dfs)\n    dfs = self.to_pandas(dfs)\n    dfs.drop(columns='case_id',inplace=True)\n    dfs.replace([np.inf, -np.inf], np.nan, inplace=True)\n    dfs = liberar_memoria(dfs)\n    return dfs\n","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:42.972852Z","iopub.execute_input":"2024-12-30T06:05:42.973273Z","iopub.status.idle":"2024-12-30T06:05:42.999153Z","shell.execute_reply.started":"2024-12-30T06:05:42.973233Z","shell.execute_reply":"2024-12-30T06:05:42.998111Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def liberar_memoria(df):\n    # Funcion para liberar memoria\n    start_mem = df.memory_usage().sum() / 1024**2  # Memoria utilizada\n    print('La memoria utilizada es {:.2f} MB'.format(start_mem))\n\n    for col in df.columns:\n        col_type = df[col].dtype\n        if str(col_type)==\"category\":\n            continue\n\n        if col_type != object:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)\n            else:\n                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)\n        else:\n            continue\n    end_mem = df.memory_usage().sum() / 1024**2\n    #print('La memoria optimizada es: {:.2f} MB'.format(end_mem))\n    print('Se optimizó en {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.000315Z","iopub.execute_input":"2024-12-30T06:05:43.000654Z","iopub.status.idle":"2024-12-30T06:05:43.016841Z","shell.execute_reply.started":"2024-12-30T06:05:43.000624Z","shell.execute_reply":"2024-12-30T06:05:43.015824Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Agregaciones:\n    def num_expr(df):\n        # Agregaciones para numeros\n        cols = [col for col in df.columns if col[-1] in (\"P\", \"A\")]\n        expr_mean = [pl.mean(col).alias(f\"mean_{col}\") for col in cols]\n        expr_median = [pl.median(col).alias(f\"median_{col}\") for col in cols]\n        return expr_mean + expr_median\n\n    def date_expr(df):\n        # Agregaciones para fechas\n        cols = [col for col in df.columns if col[-1] in (\"D\")]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_median = [pl.median(col).alias(f\"median_{col}\") for col in cols]\n        return expr_last #expr_max  expr_last  expr_mean\n\n    def str_expr(df):\n        # transofrmaciones para categorias\n        cols = [col for col in df.columns if col[-1] in (\"M\",)]\n        expr_mode = [pl.col(col).mode().first().name.prefix(\"mode_\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        return expr_mode + expr_last\n\n    def other_expr(df):\n        # otro tipo de datos\n        cols = [col for col in df.columns if col[-1] in (\"T\", \"L\")]\n        #expr_mode =  [pl.col(col).mode().first().name.prefix(\"mode_\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        return expr_last#expr_mode + expr_last\n\n    def get_exprs(df):\n        exprs = Agregaciones.num_expr(df) + \\\n                Agregaciones.date_expr(df) + \\\n                Agregaciones.str_expr(df) + \\\n                Agregaciones.other_expr(df)\n        return exprs","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.017751Z","iopub.execute_input":"2024-12-30T06:05:43.018052Z","iopub.status.idle":"2024-12-30T06:05:43.038617Z","shell.execute_reply.started":"2024-12-30T06:05:43.018028Z","shell.execute_reply":"2024-12-30T06:05:43.037577Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class ModeloXGB:\n    # Definicion, tuneo de hiperparametros y entrenamiento del modelo\n\n    def __init__(self, cv: int = 5, n_iter: int = 10):\n        # Parametros de tuneo\n        self.cv = cv #Cantidad de particiones para el Cross-validation\n        self.n_iter = n_iter #Cantidad de combinaciones de parametros testeados\n\n        # Variables que utliza el modelo\n        self.features = None\n\n        # Modelo\n        self.model = None\n\n        # Parametros fijos del modelos XGBoost\n        self.xgb_params = {\n            'objective':'binary:logistic',\n            'enable_categorical':True,\n            'eval_metric':\"auc\",\n            'random_state':42\n        }\n\n        # Hiperparametros para tuneo\n        self.param_dist = {\n            \"n_estimators\": randint(600, 850),\n            \"max_depth\": randint(3, 10),\n            \"learning_rate\": uniform(0.01, 0.3),\n            \"subsample\": uniform(0.5, 1.0),\n            \"colsample_bytree\": uniform(0.5, 1.0),\n            \"gamma\": uniform(0, 5),\n            \"reg_alpha\": uniform(0, 0.5)#Parametro de regularizacion L1\n\n        }\n\n    def train_model(self, data: pd.DataFrame):\n\n        # Separamos variables del target\n        if self.features == None:\n          self.features = [col for col in data.columns if col != 'target']\n        y_train = data['target']\n        X_train = data[self.features]\n\n        # RandomizedSearchCV\n        random_search = RandomizedSearchCV(\n                                              estimator=XGBClassifier(**self.xgb_params),\n                                              n_iter=self.n_iter,\n                                              scoring=\"roc_auc\",\n                                              cv=self.cv,\n                                              verbose=2,\n                                              random_state=42,\n                                              n_jobs=-1,\n                                              param_distributions=self.param_dist\n                                          )\n\n\n        # Entrenamos la búsqueda\n        random_search.fit(X_train, y_train)\n\n        # Mejor modelo y evaluación\n        best_model = random_search.best_estimator_\n        print(\"Mejores parámetros:\", random_search.best_params_)\n        print(\"Mejor score en validación:\", random_search.best_score_)\n\n        self.model = best_model\n        # Regresamos el modelo entrenado\n        return self.model\n\n    def predict_proba(self, X):\n\n        X = X[self.features]\n\n        y_pred_proba = self.model.predict_proba(X)[:, 1]\n\n        return y_pred_proba\n\n    def predict(self, X):\n\n        y_pred = (self.predict_proba(X) >= 0.25).astype(int)\n        return y_pred","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.039695Z","iopub.execute_input":"2024-12-30T06:05:43.039976Z","iopub.status.idle":"2024-12-30T06:05:43.060895Z","shell.execute_reply.started":"2024-12-30T06:05:43.039946Z","shell.execute_reply":"2024-12-30T06:05:43.059873Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# directorio\ndirectory_test = '//kaggle//input//home-credit-credit-risk-model-stability//parquet_files//test//'\n# diccionario con dataframes\ndataframes_nombres_test = {'test_applprev_1':['test_applprev_1_0',\n                                  'test_applprev_1_1','test_applprev_1_2'],\n              'test_applprev_2':['test_applprev_2'],\n              'base':['test_base'],\n              'test_credit_bureau_a_1':['test_credit_bureau_a_1_0',\n                                        'test_credit_bureau_a_1_1',\n                                        'test_credit_bureau_a_1_2',\n                                        'test_credit_bureau_a_1_3',\n                                        'test_credit_bureau_a_1_4'],\n              'test_credit_bureau_a_2':['test_credit_bureau_a_2_0',\n                                        'test_credit_bureau_a_2_1',\n                                        'test_credit_bureau_a_2_2',\n                                        'test_credit_bureau_a_2_3',\n                                        'test_credit_bureau_a_2_4',\n                                        'test_credit_bureau_a_2_5',\n                                        'test_credit_bureau_a_2_6',\n                                        'test_credit_bureau_a_2_7',\n                                        'test_credit_bureau_a_2_8',\n                                        'test_credit_bureau_a_2_9',\n                                        'test_credit_bureau_a_2_10',\n                                        'test_credit_bureau_a_2_11'],\n              'test_credit_bureau_b_1':['test_credit_bureau_b_1'],\n              'test_credit_bureau_b_2':['test_credit_bureau_b_2'],\n              'test_debitcard_1':['test_debitcard_1'],\n              'test_other_1':['test_other_1'],\n              'test_deposit_1':['test_deposit_1'],\n              'test_person_1':['test_person_1'],\n              'test_person_2':['test_person_2'],\n              'test_static_0':['test_static_0_0','test_static_0_1','test_static_0_2'],\n              'test_static_cb':['test_static_cb_0'],\n              'test_tax_registry_a_1':['test_tax_registry_a_1'],\n              'test_tax_registry_b_1':['test_tax_registry_b_1'],\n              'test_tax_registry_c_1':['test_tax_registry_c_1']\n              }","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.064228Z","iopub.execute_input":"2024-12-30T06:05:43.064499Z","iopub.status.idle":"2024-12-30T06:05:43.083487Z","shell.execute_reply.started":"2024-12-30T06:05:43.064477Z","shell.execute_reply":"2024-12-30T06:05:43.082413Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_test = Importador(directory_test,dataframes_nombres_test).from_parquet()","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.085036Z","iopub.execute_input":"2024-12-30T06:05:43.085313Z","iopub.status.idle":"2024-12-30T06:05:43.702128Z","shell.execute_reply.started":"2024-12-30T06:05:43.085282Z","shell.execute_reply":"2024-12-30T06:05:43.701108Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_test['base']","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.703236Z","iopub.execute_input":"2024-12-30T06:05:43.703618Z","iopub.status.idle":"2024-12-30T06:05:43.714910Z","shell.execute_reply.started":"2024-12-30T06:05:43.703580Z","shell.execute_reply":"2024-12-30T06:05:43.713820Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pipe2 = Pipeline_preprocesamiento()","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.715922Z","iopub.execute_input":"2024-12-30T06:05:43.716321Z","iopub.status.idle":"2024-12-30T06:05:43.730500Z","shell.execute_reply.started":"2024-12-30T06:05:43.716287Z","shell.execute_reply":"2024-12-30T06:05:43.729501Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_test = pipe2.convertir_fechas_datos(base_test)\nbase_test = pipe2.concat_datos(base_test)\nbase_test = pipe2.to_pandas(base_test)\nbase_test = liberar_memoria(base_test)\nbase_test","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:43.731513Z","iopub.execute_input":"2024-12-30T06:05:43.731808Z","iopub.status.idle":"2024-12-30T06:05:44.178352Z","shell.execute_reply.started":"2024-12-30T06:05:43.731784Z","shell.execute_reply":"2024-12-30T06:05:44.177192Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cargamos los features del modelo\nloaded_features = pd.read_csv('/kaggle/input/resultado1/Resultados1/model_features.csv', header=None)\nloaded_features = loaded_features.iloc[:, 0].tolist()","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.179305Z","iopub.execute_input":"2024-12-30T06:05:44.179574Z","iopub.status.idle":"2024-12-30T06:05:44.188129Z","shell.execute_reply.started":"2024-12-30T06:05:44.179550Z","shell.execute_reply":"2024-12-30T06:05:44.187160Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Importamos el modelo entrenado\nimport pickle\n\n# cargamos el modelo\nwith open('/kaggle/input/resultado1/Resultados1/best_xgb_model.pkl', 'rb') as file:\n  model = pickle.load(file)","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.188998Z","iopub.execute_input":"2024-12-30T06:05:44.189311Z","iopub.status.idle":"2024-12-30T06:05:44.223143Z","shell.execute_reply.started":"2024-12-30T06:05:44.189285Z","shell.execute_reply":"2024-12-30T06:05:44.222027Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"xgboost = ModeloXGB()\nxgboost.model = model\nxgboost.features = loaded_features","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.224196Z","iopub.execute_input":"2024-12-30T06:05:44.224518Z","iopub.status.idle":"2024-12-30T06:05:44.234382Z","shell.execute_reply.started":"2024-12-30T06:05:44.224490Z","shell.execute_reply":"2024-12-30T06:05:44.233370Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_pred=xgboost.predict_proba(base_test)","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.235383Z","iopub.execute_input":"2024-12-30T06:05:44.235709Z","iopub.status.idle":"2024-12-30T06:05:44.357394Z","shell.execute_reply.started":"2024-12-30T06:05:44.235680Z","shell.execute_reply":"2024-12-30T06:05:44.356443Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_test.columns","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.358342Z","iopub.execute_input":"2024-12-30T06:05:44.358622Z","iopub.status.idle":"2024-12-30T06:05:44.364828Z","shell.execute_reply.started":"2024-12-30T06:05:44.358597Z","shell.execute_reply":"2024-12-30T06:05:44.363829Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(xgboost.features)","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.365656Z","iopub.execute_input":"2024-12-30T06:05:44.366030Z","iopub.status.idle":"2024-12-30T06:05:44.382647Z","shell.execute_reply.started":"2024-12-30T06:05:44.366002Z","shell.execute_reply":"2024-12-30T06:05:44.381504Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submit=pd.DataFrame({'score':y_pred}).set_index(base_test['case_id'])","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.383757Z","iopub.execute_input":"2024-12-30T06:05:44.384123Z","iopub.status.idle":"2024-12-30T06:05:44.398525Z","shell.execute_reply.started":"2024-12-30T06:05:44.384092Z","shell.execute_reply":"2024-12-30T06:05:44.397484Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submit","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.399519Z","iopub.execute_input":"2024-12-30T06:05:44.399898Z","iopub.status.idle":"2024-12-30T06:05:44.419821Z","shell.execute_reply.started":"2024-12-30T06:05:44.399858Z","shell.execute_reply":"2024-12-30T06:05:44.418726Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submit.to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2024-12-30T06:05:44.420787Z","iopub.execute_input":"2024-12-30T06:05:44.421141Z","iopub.status.idle":"2024-12-30T06:05:44.438843Z","shell.execute_reply.started":"2024-12-30T06:05:44.421105Z","shell.execute_reply":"2024-12-30T06:05:44.437861Z"},"trusted":true},"outputs":[],"execution_count":null}]}