{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":35332,"databundleVersionId":3723648,"sourceType":"competition"},{"sourceId":3696790,"sourceType":"datasetVersion","datasetId":2211601}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip3 install -U lightautoml > null","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:15:58.936848Z","iopub.execute_input":"2025-12-13T10:15:58.937159Z","iopub.status.idle":"2025-12-13T10:17:47.687445Z","shell.execute_reply.started":"2025-12-13T10:15:58.937135Z","shell.execute_reply":"2025-12-13T10:17:47.685383Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport warnings\nfrom sklearn.model_selection import train_test_split\nfrom lightautoml.automl.presets.tabular_presets import TabularAutoML\nfrom lightautoml.tasks import Task\nimport torch\nimport gc\n\nwarnings.filterwarnings('ignore')\n\n# Константы\nRANDOM_STATE = 42\nN_FOLDS = 5\nTIMEOUT = 4 * 3600 # 4 часа на каждую нофигурацию + 4 часа на все остальное\nN_THREADS = 4\nTARGET_NAME = 'target'\n\nnp.random.seed(RANDOM_STATE)\ntorch.set_num_threads(N_THREADS)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:17:47.691152Z","iopub.execute_input":"2025-12-13T10:17:47.691576Z","iopub.status.idle":"2025-12-13T10:18:11.702092Z","shell.execute_reply.started":"2025-12-13T10:17:47.691537Z","shell.execute_reply":"2025-12-13T10:18:11.701312Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# COMPETITION METRIC FROM Konstantin Yakovlev\n# https://www.kaggle.com/kyakovlev\n# https://www.kaggle.com/competitions/amex-default-prediction/discussion/327534\ndef amex_metric_mod(y_true, y_pred):\n\n    labels     = np.transpose(np.array([y_true, y_pred]))\n    labels     = labels[labels[:, 1].argsort()[::-1]]\n    weights    = np.where(labels[:,0]==0, 20, 1)\n    cut_vals   = labels[np.cumsum(weights) <= int(0.04 * np.sum(weights))]\n    top_four   = np.sum(cut_vals[:,0]) / np.sum(labels[:,0])\n\n    gini = [0,0]\n    for i in [1,0]:\n        labels         = np.transpose(np.array([y_true, y_pred]))\n        labels         = labels[labels[:, i].argsort()[::-1]]\n        weight         = np.where(labels[:,0]==0, 20, 1)\n        weight_random  = np.cumsum(weight / np.sum(weight))\n        total_pos      = np.sum(labels[:, 0] *  weight)\n        cum_pos_found  = np.cumsum(labels[:, 0] * weight)\n        lorentz        = cum_pos_found / total_pos\n        gini[i]        = np.sum((lorentz - weight_random) * weight)\n\n    return 0.5 * (gini[1]/gini[0] + top_four)\n\ndef group_stratify_train_test_split(data, test_size=0.2, random_state=RANDOM_STATE):\n    customers_target = data.groupby('customer_ID')[TARGET_NAME].first().reset_index()\n    \n    train_customers, test_customers = train_test_split(\n        customers_target['customer_ID'], \n        test_size=test_size, \n        random_state=random_state,\n        stratify=customers_target[TARGET_NAME]\n    )\n    \n    train_mask = data['customer_ID'].isin(train_customers)\n    test_mask = data['customer_ID'].isin(test_customers)\n    \n    train_set = data[train_mask].copy()\n    test_set = data[test_mask].copy()\n    \n    print(f\"Train размер: {train_set.shape}\")\n    print(f\"Test размер: {test_set.shape}\")\n    \n    return train_set, test_set","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:18:11.702812Z","iopub.execute_input":"2025-12-13T10:18:11.703754Z","iopub.status.idle":"2025-12-13T10:18:11.716438Z","shell.execute_reply.started":"2025-12-13T10:18:11.703726Z","shell.execute_reply":"2025-12-13T10:18:11.715769Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = pd.read_parquet('/kaggle/input/amex-parquet/train_data.parquet')\nprint(f\"Размер train данных: {train_data.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:18:11.719850Z","iopub.execute_input":"2025-12-13T10:18:11.720514Z","iopub.status.idle":"2025-12-13T10:18:40.928303Z","shell.execute_reply.started":"2025-12-13T10:18:11.720486Z","shell.execute_reply":"2025-12-13T10:18:40.927168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data, val_data = group_stratify_train_test_split( # Так как в тесте новые юзеры, то в треин и вал тоже не должно быть пересечений по юзерам + стратификация\n    train_data, \n    test_size=0.2,\n    random_state=RANDOM_STATE\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:18:40.929319Z","iopub.execute_input":"2025-12-13T10:18:40.929654Z","iopub.status.idle":"2025-12-13T10:18:48.772903Z","shell.execute_reply.started":"2025-12-13T10:18:40.929603Z","shell.execute_reply":"2025-12-13T10:18:48.771784Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 1 Конфигурация","metadata":{}},{"cell_type":"code","source":"task = Task('binary')\nroles = {\n    'target': TARGET_NAME,\n    'drop': ['customer_ID']\n}\nautoml_basic = TabularAutoML(\n    task=task,\n    timeout=TIMEOUT,\n    cpu_limit=N_THREADS,\n    general_params={'use_algos': [['linear_l2', 'lgb', 'cb']]},\n    reader_params={\n        'n_jobs': 4,\n        'cv': N_FOLDS,\n        'random_state': RANDOM_STATE,\n        'advanced_roles': False\n    }\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:18:48.773961Z","iopub.execute_input":"2025-12-13T10:18:48.774294Z","iopub.status.idle":"2025-12-13T10:18:48.818294Z","shell.execute_reply.started":"2025-12-13T10:18:48.774270Z","shell.execute_reply":"2025-12-13T10:18:48.817121Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oof_pred_basic = automl_basic.fit_predict(\n    train_data, \n    roles=roles, \n    verbose=3\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:18:48.819458Z","iopub.execute_input":"2025-12-13T10:18:48.820439Z","iopub.status.idle":"2025-12-13T10:23:31.804539Z","shell.execute_reply.started":"2025-12-13T10:18:48.820408Z","shell.execute_reply":"2025-12-13T10:23:31.803337Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"val_pred_basic = automl_basic.predict(val_data)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:23:31.805871Z","iopub.execute_input":"2025-12-13T10:23:31.806204Z","iopub.status.idle":"2025-12-13T10:23:42.566975Z","shell.execute_reply.started":"2025-12-13T10:23:31.806175Z","shell.execute_reply":"2025-12-13T10:23:42.566030Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"val_score_basic = amex_metric_mod(\n    val_data[TARGET_NAME].values, \n    val_pred_basic.data[:, 0]\n)\n\nprint(f\"\\nРезультаты конфигурации 1:\")\nprint(f\"Validation score: {val_score_basic:.6f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T10:23:42.568190Z","iopub.execute_input":"2025-12-13T10:23:42.568529Z","iopub.status.idle":"2025-12-13T10:23:44.966007Z","shell.execute_reply.started":"2025-12-13T10:23:42.568500Z","shell.execute_reply":"2025-12-13T10:23:44.963655Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"del oof_pred_basic, val_pred_basic\ngc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T07:18:12.582248Z","iopub.execute_input":"2025-12-11T07:18:12.584032Z","iopub.status.idle":"2025-12-11T07:18:13.203502Z","shell.execute_reply.started":"2025-12-11T07:18:12.583995Z","shell.execute_reply":"2025-12-11T07:18:13.202659Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2 Конфигурация","metadata":{}},{"cell_type":"code","source":"automl_advanced = TabularAutoML(\n    task=task,\n    timeout=TIMEOUT,\n    cpu_limit=N_THREADS,\n    general_params={\n        'use_algos': [['xgb', 'lgb_tuned', 'cb_tuned'], ['mlp']],\n    },\n    reader_params={\n        'n_jobs': N_THREADS,\n        'cv': N_FOLDS,\n        'random_state': 2 * RANDOM_STATE,\n        'advanced_roles': True,\n    },\n    tuning_params={'max_tuning_iter': \"auto\", 'max_tuning_time': 300},\n    selection_params={'mode': 1}\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T07:18:13.204411Z","iopub.execute_input":"2025-12-11T07:18:13.204802Z","iopub.status.idle":"2025-12-11T07:18:13.261973Z","shell.execute_reply.started":"2025-12-11T07:18:13.204776Z","shell.execute_reply":"2025-12-11T07:18:13.260877Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oof_pred_advanced = automl_advanced.fit_predict(\n    train_data, \n    roles=roles, \n    verbose=3\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T07:18:13.263134Z","iopub.execute_input":"2025-12-11T07:18:13.263514Z","iopub.status.idle":"2025-12-11T09:35:49.570501Z","shell.execute_reply.started":"2025-12-11T07:18:13.263485Z","shell.execute_reply":"2025-12-11T09:35:49.567338Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"val_pred_advanced = automl_advanced.predict(val_data)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T09:35:49.577140Z","iopub.execute_input":"2025-12-11T09:35:49.578045Z","iopub.status.idle":"2025-12-11T09:39:20.603095Z","shell.execute_reply.started":"2025-12-11T09:35:49.577992Z","shell.execute_reply":"2025-12-11T09:39:20.602260Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"val_score_advanced = amex_metric_mod(\n    val_data[TARGET_NAME].values, \n    val_pred_advanced.data[:, 0]\n)\n\nprint(f\"\\nРезультаты конфигурации 2:\")\nprint(f\"Validation score: {val_score_advanced:.6f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T09:39:20.604254Z","iopub.execute_input":"2025-12-11T09:39:20.605206Z","iopub.status.idle":"2025-12-11T09:39:22.524048Z","shell.execute_reply.started":"2025-12-11T09:39:20.605178Z","shell.execute_reply":"2025-12-11T09:39:22.522655Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"del oof_pred_advanced, val_pred_advanced, val_data, train_data\ngc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T09:39:22.524895Z","iopub.execute_input":"2025-12-11T09:39:22.525120Z","iopub.status.idle":"2025-12-11T09:39:25.410219Z","shell.execute_reply.started":"2025-12-11T09:39:22.525101Z","shell.execute_reply":"2025-12-11T09:39:25.409387Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Выбор модели и предсказание","metadata":{}},{"cell_type":"code","source":"if val_score_basic > val_score_advanced:\n    best_model = automl_basic\n    best_val_score = val_score_basic\n    best_config = \"Конфигурация 1\"\nelse:\n    best_model = automl_advanced\n    best_val_score = val_score_advanced\n    best_config = \"Конфигурация 2\"\n\nprint(f\"ЛУЧШАЯ МОДЕЛЬ: {best_config}\")\nprint(f\"Лучший validation score: {best_val_score:.6f}\")\n\ndel automl_basic, automl_advanced\ngc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T09:39:25.411251Z","iopub.execute_input":"2025-12-11T09:39:25.412050Z","iopub.status.idle":"2025-12-11T09:39:25.744428Z","shell.execute_reply.started":"2025-12-11T09:39:25.412014Z","shell.execute_reply":"2025-12-11T09:39:25.743575Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.auto import tqdm\n\nbatch_size = 1000000\nresults = []\n\nfor chunk in tqdm(pd.read_csv('/kaggle/input/amex-default-prediction/test_data.csv', chunksize=batch_size), total=(11000000 // batch_size) + 1):\n    customer_ids = chunk['customer_ID']\n    chunk_for_pred = chunk.drop('customer_ID', axis=1)\n    preds = best_model.predict(chunk_for_pred)\n    \n    results.append(pd.DataFrame({\n        'customer_ID': customer_ids,\n        'prediction': preds.data[:, 0] if hasattr(preds, 'data') else preds[:, 0]\n    }))\n\nsubmission = pd.concat(results, ignore_index=True)\nsubmission.groupby([\"customer_ID\"]).agg(\"mean\").reset_index().to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-11T10:40:58.354796Z","iopub.execute_input":"2025-12-11T10:40:58.355737Z","execution_failed":"2025-12-11T10:55:51.488Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}