{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":50160,"databundleVersionId":7921029,"sourceType":"competition"}],"dockerImageVersionId":30664,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Выполнила Исхакова Эмилия, улучшала один из базовых ноутбуков.  \n\nДля этого удалила некоторые признаки,\n\nподобрала гиперпараметры\n\nиспользовала дополнительную модель\n\nпредположила использование третьей модели, но объяснила, почему третий алгоритм AdaBoost здесь не подходит для хорошего предсказания","metadata":{}},{"cell_type":"code","source":"import polars as pl\nimport numpy as np\nimport pandas as pd\nimport lightgbm as lgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import roc_auc_score \nfrom catboost import CatBoostClassifier\nimport xgboost as xgb\nfrom sklearn.model_selection import GridSearchCV\n\ndataPath = \"/kaggle/input/home-credit-credit-risk-model-stability/\" ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-18T21:20:09.112167Z","iopub.execute_input":"2024-03-18T21:20:09.113946Z","iopub.status.idle":"2024-03-18T21:20:09.128973Z","shell.execute_reply.started":"2024-03-18T21:20:09.113788Z","shell.execute_reply":"2024-03-18T21:20:09.127129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def set_table_dtypes(df: pl.DataFrame) -> pl.DataFrame:\n    for col in df.columns:\n        if col[-1] in (\"P\", \"A\"):\n            df = df.with_columns(pl.col(col).cast(pl.Float64).alias(col))\n\n    return df\n\ndef convert_strings(df: pd.DataFrame) -> pd.DataFrame:\n    for col in df.columns:  \n        if df[col].dtype.name in ['object', 'string']:\n            df[col] = df[col].astype(\"string\").astype('category')\n            current_categories = df[col].cat.categories\n            new_categories = current_categories.to_list() + [\"Unknown\"]\n            new_dtype = pd.CategoricalDtype(categories=new_categories, ordered=True)\n            df[col] = df[col].astype(new_dtype)\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:20:12.615793Z","iopub.execute_input":"2024-03-18T21:20:12.616415Z","iopub.status.idle":"2024-03-18T21:20:12.633698Z","shell.execute_reply.started":"2024-03-18T21:20:12.616376Z","shell.execute_reply":"2024-03-18T21:20:12.631817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_basetable = pl.read_csv(dataPath + \"csv_files/train/train_base.csv\").pipe(set_table_dtypes)\ntrain_static = pl.concat(\n    [\n        pl.read_csv(dataPath + \"csv_files/train/train_static_0_0.csv\").pipe(set_table_dtypes),\n        pl.read_csv(dataPath + \"csv_files/train/train_static_0_1.csv\").pipe(set_table_dtypes),\n    ],\n    how=\"vertical_relaxed\",\n)\ntrain_static_cb = pl.read_csv(dataPath + \"csv_files/train/train_static_cb_0.csv\").pipe(set_table_dtypes)\ntrain_person_1 = pl.read_csv(dataPath + \"csv_files/train/train_person_1.csv\").pipe(set_table_dtypes) \ntrain_credit_bureau_b_2 = pl.read_csv(dataPath + \"csv_files/train/train_credit_bureau_b_2.csv\").pipe(set_table_dtypes) ","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:20:14.823540Z","iopub.execute_input":"2024-03-18T21:20:14.824054Z","iopub.status.idle":"2024-03-18T21:20:36.738656Z","shell.execute_reply.started":"2024-03-18T21:20:14.823990Z","shell.execute_reply":"2024-03-18T21:20:36.737539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_basetable = pl.read_csv(dataPath + \"csv_files/test/test_base.csv\").pipe(set_table_dtypes)\ntest_static = pl.concat(\n    [\n        pl.read_csv(dataPath + \"csv_files/test/test_static_0_0.csv\").pipe(set_table_dtypes),\n        pl.read_csv(dataPath + \"csv_files/test/test_static_0_1.csv\").pipe(set_table_dtypes),\n        pl.read_csv(dataPath + \"csv_files/test/test_static_0_2.csv\").pipe(set_table_dtypes),\n    ],\n    how=\"vertical_relaxed\",\n)\ntest_static_cb = pl.read_csv(dataPath + \"csv_files/test/test_static_cb_0.csv\").pipe(set_table_dtypes)\ntest_person_1 = pl.read_csv(dataPath + \"csv_files/test/test_person_1.csv\").pipe(set_table_dtypes) \ntest_credit_bureau_b_2 = pl.read_csv(dataPath + \"csv_files/test/test_credit_bureau_b_2.csv\").pipe(set_table_dtypes) ","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:20:51.137751Z","iopub.execute_input":"2024-03-18T21:20:51.138613Z","iopub.status.idle":"2024-03-18T21:20:51.194309Z","shell.execute_reply.started":"2024-03-18T21:20:51.138557Z","shell.execute_reply":"2024-03-18T21:20:51.192325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_person_1_feats_1 = train_person_1.group_by(\"case_id\").agg(\n    pl.col(\"mainoccupationinc_384A\").max().alias(\"mainoccupationinc_384A_max\"),\n    (pl.col(\"incometype_1044T\") == \"SELFEMPLOYED\").max().alias(\"mainoccupationinc_384A_any_selfemployed\")\n)\n\n# Here num_group1=0 has special meaning, it is the person who applied for the loan.\ntrain_person_1_feats_2 = train_person_1.select([\"case_id\", \"num_group1\", \"housetype_905L\"]).filter(\n    pl.col(\"num_group1\") == 0\n).drop(\"num_group1\").rename({\"housetype_905L\": \"person_housetype\"})\n\n# Here we have num_goup1 and num_group2, so we need to aggregate again.\ntrain_credit_bureau_b_2_feats = train_credit_bureau_b_2.group_by(\"case_id\").agg(\n    pl.col(\"pmts_pmtsoverdue_635A\").max().alias(\"pmts_pmtsoverdue_635A_max\"),\n    (pl.col(\"pmts_dpdvalue_108P\") > 31).max().alias(\"pmts_dpdvalue_108P_over31\")\n)\n\n# We will process in this examples only A-type and M-type columns, so we need to select them.\nselected_static_cols = []\nfor col in train_static.columns:\n    if col[-1] in (\"A\", \"M\"):\n        selected_static_cols.append(col)\nprint(selected_static_cols)\n\nselected_static_cb_cols = []\nfor col in train_static_cb.columns:\n    if col[-1] in (\"A\", \"M\"):\n        selected_static_cb_cols.append(col)\nprint(selected_static_cb_cols)\ndata = train_basetable.join(\n    train_static.select([\"case_id\"]+selected_static_cols), how=\"left\", on=\"case_id\"\n).join(\n    train_static_cb.select([\"case_id\"]+selected_static_cb_cols), how=\"left\", on=\"case_id\"\n).join(\n    train_person_1_feats_1, how=\"left\", on=\"case_id\"\n).join(\n    train_person_1_feats_2, how=\"left\", on=\"case_id\"\n).join(\n    train_credit_bureau_b_2_feats, how=\"left\", on=\"case_id\"\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:21:43.641756Z","iopub.execute_input":"2024-03-18T21:21:43.642293Z","iopub.status.idle":"2024-03-18T21:21:46.688598Z","shell.execute_reply.started":"2024-03-18T21:21:43.642256Z","shell.execute_reply":"2024-03-18T21:21:46.687239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_person_1_feats_1 = test_person_1.group_by(\"case_id\").agg(\n    pl.col(\"mainoccupationinc_384A\").max().alias(\"mainoccupationinc_384A_max\"),\n    (pl.col(\"incometype_1044T\") == \"SELFEMPLOYED\").max().alias(\"mainoccupationinc_384A_any_selfemployed\")\n)\n\n\n\ntest_person_1_feats_2 = test_person_1.select([\"case_id\", \"num_group1\", \"housetype_905L\"]).filter(\n    pl.col(\"num_group1\") == 0\n).drop(\"num_group1\").rename({\"housetype_905L\": \"person_housetype\"})\n\n\n\ntest_credit_bureau_b_2_feats = test_credit_bureau_b_2.group_by(\"case_id\").agg(\n    pl.col(\"pmts_pmtsoverdue_635A\").max().alias(\"pmts_pmtsoverdue_635A_max\"),\n    (pl.col(\"pmts_dpdvalue_108P\") > 31).max().alias(\"pmts_dpdvalue_108P_over31\")\n)\n\n\ndata_submission = test_basetable.join(\n    test_static.select([\"case_id\"]+selected_static_cols), how=\"left\", on=\"case_id\"\n).join(\n    test_static_cb.select([\"case_id\"]+selected_static_cb_cols), how=\"left\", on=\"case_id\"\n).join(\n    test_person_1_feats_1, how=\"left\", on=\"case_id\"\n).join(\n    test_person_1_feats_2, how=\"left\", on=\"case_id\"\n).join(\n    test_credit_bureau_b_2_feats, how=\"left\", on=\"case_id\"\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:21:50.521651Z","iopub.execute_input":"2024-03-18T21:21:50.522635Z","iopub.status.idle":"2024-03-18T21:21:50.539213Z","shell.execute_reply.started":"2024-03-18T21:21:50.522585Z","shell.execute_reply":"2024-03-18T21:21:50.537657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data","metadata":{"execution":{"iopub.status.busy":"2024-03-18T17:47:35.050981Z","iopub.execute_input":"2024-03-18T17:47:35.051872Z","iopub.status.idle":"2024-03-18T17:47:35.105900Z","shell.execute_reply.started":"2024-03-18T17:47:35.051809Z","shell.execute_reply":"2024-03-18T17:47:35.103952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"case_ids = data[\"case_id\"].unique().shuffle(seed=1)\ncase_ids_train, case_ids_test = train_test_split(case_ids, train_size=0.6, random_state=1)\ncase_ids_valid, case_ids_test = train_test_split(case_ids_test, train_size=0.5, random_state=1)\n\ncols_pred = []\nfor col in data.columns:\n    if col[-1].isupper() and col[:-1].islower():\n        cols_pred.append(col)\n\nprint(cols_pred)\n\ndef from_polars_to_pandas(case_ids: pl.DataFrame) -> pl.DataFrame:\n    return (\n        data.filter(pl.col(\"case_id\").is_in(case_ids))[[\"case_id\", \"WEEK_NUM\", \"target\"]].to_pandas(),\n        data.filter(pl.col(\"case_id\").is_in(case_ids))[cols_pred].to_pandas(),\n        data.filter(pl.col(\"case_id\").is_in(case_ids))[\"target\"].to_pandas()\n    )\n","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:21:54.989102Z","iopub.execute_input":"2024-03-18T21:21:54.990108Z","iopub.status.idle":"2024-03-18T21:21:55.323765Z","shell.execute_reply.started":"2024-03-18T21:21:54.989990Z","shell.execute_reply":"2024-03-18T21:21:55.321463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_train, X_train, y_train = from_polars_to_pandas(case_ids_train)\nbase_valid, X_valid, y_valid = from_polars_to_pandas(case_ids_valid)\nbase_test, X_test, y_test = from_polars_to_pandas(case_ids_test)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:21:57.484530Z","iopub.execute_input":"2024-03-18T21:21:57.485042Z","iopub.status.idle":"2024-03-18T21:22:01.177592Z","shell.execute_reply.started":"2024-03-18T21:21:57.484988Z","shell.execute_reply":"2024-03-18T21:22:01.176383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2024-03-18T17:58:18.033766Z","iopub.execute_input":"2024-03-18T17:58:18.034233Z","iopub.status.idle":"2024-03-18T17:58:18.129973Z","shell.execute_reply.started":"2024-03-18T17:58:18.034195Z","shell.execute_reply":"2024-03-18T17:58:18.127833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train.drop(['lastotherinc_902A', 'lastotherlnsexpense_631A', 'pmtaverage_4527227A', 'pmtaverage_4955615A', 'maxannuity_4075009A'], axis = 1)\nX_valid = X_valid.drop(['lastotherinc_902A', 'lastotherlnsexpense_631A', 'pmtaverage_4527227A', 'pmtaverage_4955615A', 'maxannuity_4075009A'], axis = 1)\nX_test = X_test.drop(['lastotherinc_902A', 'lastotherlnsexpense_631A', 'pmtaverage_4527227A', 'pmtaverage_4955615A', 'maxannuity_4075009A'], axis = 1)","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:23:34.950683Z","iopub.execute_input":"2024-03-18T21:23:34.951268Z","iopub.status.idle":"2024-03-18T21:23:35.749715Z","shell.execute_reply.started":"2024-03-18T21:23:34.951228Z","shell.execute_reply":"2024-03-18T21:23:35.748137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"удалим столбцы с наибольшим количеством пустых значений, например, lastotherinc_902A, lastotherlnsexpense_631A, pmtaverage_4527227A, pmtaverage_4955615A, maxannuity_4075009A ","metadata":{}},{"cell_type":"code","source":"def select_numeric_features(df):\n    numeric_columns = df.select_dtypes(include=['number']).columns\n    numeric_df = df[numeric_columns]\n    return numeric_df\nX_grid = select_numeric_features(X_train)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:23:39.869198Z","iopub.execute_input":"2024-03-18T21:23:39.869668Z","iopub.status.idle":"2024-03-18T21:23:40.161445Z","shell.execute_reply.started":"2024-03-18T21:23:39.869634Z","shell.execute_reply":"2024-03-18T21:23:40.160075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"Train: {X_train.shape}\")\nprint(f\"Valid: {X_valid.shape}\")\nprint(f\"Test: {X_test.shape}\")","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:23:42.562118Z","iopub.execute_input":"2024-03-18T21:23:42.562574Z","iopub.status.idle":"2024-03-18T21:23:42.569036Z","shell.execute_reply.started":"2024-03-18T21:23:42.562540Z","shell.execute_reply":"2024-03-18T21:23:42.567748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for df in [X_train, X_valid, X_test]:\n    df = convert_strings(df)","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:23:45.773581Z","iopub.execute_input":"2024-03-18T21:23:45.774130Z","iopub.status.idle":"2024-03-18T21:23:48.819484Z","shell.execute_reply.started":"2024-03-18T21:23:45.774090Z","shell.execute_reply":"2024-03-18T21:23:48.818043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nparams = {\n    'max_depth': range (3, 10, 3),\n    'n_estimators': range(60, 120, 30),\n    'learning_rate': [0.1, 0.01, 0.05]\n}\n\ngrid_search = GridSearchCV(\n    estimator= xgb.XGBClassifier(objective = 'binary:logistic', tree_method = \"hist\", nthread = 4, seed = 42),\n    param_grid= params,\n    scoring = 'roc_auc',\n    n_jobs = 10,\n    cv = 10,\n    verbose=-1\n)\n\ngrid_search.fit(X_grid, y_train)\n\ngrid_search.best_params_\n'''","metadata":{"execution":{"iopub.status.busy":"2024-03-18T20:06:26.499912Z","iopub.execute_input":"2024-03-18T20:06:26.500421Z","iopub.status.idle":"2024-03-18T20:06:26.510364Z","shell.execute_reply.started":"2024-03-18T20:06:26.500384Z","shell.execute_reply":"2024-03-18T20:06:26.508679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xgbmodel = xgb.XGBClassifier(\n    objective = 'binary:logistic',  \n    tree_method = \"hist\",  \n    enable_categorical = True,  \n    eval_metric = 'auc', \n    subsample = 0.5,\n    learning_rate = 0.05,\n    colsample_bytree = 1,\n    min_child_weight = 1,\n    max_depth = 10,  \n    n_estimators = 100,  \n    random_state = 42,\n)\n\nxgbmodel.fit(\n    X_train, y_train,\n    eval_set = [(X_valid, y_valid)],\n    early_stopping_rounds = 10,\n    verbose = True, \n)","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:24:12.922548Z","iopub.execute_input":"2024-03-18T21:24:12.923062Z","iopub.status.idle":"2024-03-18T21:39:45.003809Z","shell.execute_reply.started":"2024-03-18T21:24:12.923025Z","shell.execute_reply":"2024-03-18T21:39:45.002350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for base, X in [(base_train, X_train), (base_valid, X_valid), (base_test, X_test)]:\n    y_pred = xgbmodel.predict(X, xgbmodel.best_iteration)\n    base[\"score\"] = y_pred\n\nprint(f'The AUC score on the train set is: {roc_auc_score(base_train[\"target\"], base_train[\"score\"])}') \nprint(f'The AUC score on the valid set is: {roc_auc_score(base_valid[\"target\"], base_valid[\"score\"])}') \nprint(f'The AUC score on the test set is: {roc_auc_score(base_test[\"target\"], base_test[\"score\"])}')  ","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:40:28.321213Z","iopub.execute_input":"2024-03-18T21:40:28.321674Z","iopub.status.idle":"2024-03-18T21:41:02.965627Z","shell.execute_reply.started":"2024-03-18T21:40:28.321642Z","shell.execute_reply":"2024-03-18T21:41:02.963867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Мы видим, что значения auc достаточно сильно отличаются на тренировочной, валидационной и тестовой выборках, посмотрим, какой результат дает другая метрика","metadata":{}},{"cell_type":"code","source":"def gini_stability(base, w_fallingrate=88.0, w_resstd=-0.5):\n    gini_in_time = base.loc[:, [\"WEEK_NUM\", \"target\", \"score\"]]\\\n        .sort_values(\"WEEK_NUM\")\\\n        .groupby(\"WEEK_NUM\")[[\"target\", \"score\"]]\\\n        .apply(lambda x: 2*roc_auc_score(x[\"target\"], x[\"score\"])-1).tolist()\n    \n    x = np.arange(len(gini_in_time))\n    y = gini_in_time\n    a, b = np.polyfit(x, y, 1)\n    y_hat = a*x + b\n    residuals = y - y_hat\n    res_std = np.std(residuals)\n    avg_gini = np.mean(gini_in_time)\n    return avg_gini + w_fallingrate * min(0, a) + w_resstd * res_std\n\nstability_score_train = gini_stability(base_train)\nstability_score_valid = gini_stability(base_valid)\nstability_score_test = gini_stability(base_test)\n\nprint(f'The stability score on the train set is: {stability_score_train}') \nprint(f'The stability score on the valid set is: {stability_score_valid}') \nprint(f'The stability score on the test set is: {stability_score_test}')","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:41:17.275647Z","iopub.execute_input":"2024-03-18T21:41:17.276134Z","iopub.status.idle":"2024-03-18T21:41:18.424255Z","shell.execute_reply.started":"2024-03-18T21:41:17.276100Z","shell.execute_reply":"2024-03-18T21:41:18.423004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Видим, что на тесте и валидации ситуация значительно хуже, чем на трейне. Модель переобучилась, для предотвращения этого можем использовать регуляризацию, уменьшение сложности модели, но этот алгоритм требует больше времени, поэтому воспользуемся другим методом, например, lightgbm.","metadata":{}},{"cell_type":"code","source":"'''\nparams = {\n    'max_depth': range (3, 10, 2),\n    'n_estimators': range(200, 1200, 1000),\n    'learning_rate': [0.1, 0.05, 0.01],\n    'boosting_type': ['gbdt', 'dart']\n}\n\ngrid_search = GridSearchCV(\n    estimator= lgb.LGBMClassifier(objective='binary', metric='auc', verbose=-1),\n    param_grid= params,\n    scoring = 'roc_auc',\n    n_jobs = 10,\n    cv = 10,\n    verbose=-1\n)\n\ngrid_search.fit(X_grid.head(1000), y_train.head(1000))\n\ngrid_search.best_params_\n'''","metadata":{"execution":{"iopub.status.busy":"2024-03-18T20:20:53.468434Z","iopub.execute_input":"2024-03-18T20:20:53.468867Z","iopub.status.idle":"2024-03-18T20:20:53.478262Z","shell.execute_reply.started":"2024-03-18T20:20:53.468837Z","shell.execute_reply":"2024-03-18T20:20:53.476443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgb_train = lgb.Dataset(X_train, label=y_train)\nlgb_valid = lgb.Dataset(X_valid, label=y_valid, reference=lgb_train)\n\nparams = {\n    \"boosting_type\": \"gbdt\",\n    \"objective\": \"binary\",\n    \"metric\": \"auc\",\n    \"max_depth\": 3,\n    \"num_leaves\": 15,\n    \"learning_rate\": 0.1,\n    \"feature_fraction\": 0.9,\n    \"bagging_fraction\": 0.8,\n    \"n_estimators\": 200,\n    \"verbose\": -1,\n}\n\ngbm = lgb.train(\n    params,\n    lgb_train,\n    valid_sets=lgb_valid,\n    callbacks=[lgb.log_evaluation(50), lgb.early_stopping(10)]\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:41:23.668785Z","iopub.execute_input":"2024-03-18T21:41:23.669290Z","iopub.status.idle":"2024-03-18T21:41:45.729876Z","shell.execute_reply.started":"2024-03-18T21:41:23.669244Z","shell.execute_reply":"2024-03-18T21:41:45.728252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for base, X in [(base_train, X_train), (base_valid, X_valid), (base_test, X_test)]:\n    y_pred = gbm.predict(X, num_iteration=gbm.best_iteration)\n    base[\"score\"] = y_pred\n\nprint(f'The AUC score on the train set is: {roc_auc_score(base_train[\"target\"], base_train[\"score\"])}') \nprint(f'The AUC score on the valid set is: {roc_auc_score(base_valid[\"target\"], base_valid[\"score\"])}') \nprint(f'The AUC score on the test set is: {roc_auc_score(base_test[\"target\"], base_test[\"score\"])}')  ","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:42:08.404463Z","iopub.execute_input":"2024-03-18T21:42:08.404896Z","iopub.status.idle":"2024-03-18T21:42:14.612834Z","shell.execute_reply.started":"2024-03-18T21:42:08.404865Z","shell.execute_reply":"2024-03-18T21:42:14.611236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def gini_stability(base, w_fallingrate=88.0, w_resstd=-0.5):\n    gini_in_time = base.loc[:, [\"WEEK_NUM\", \"target\", \"score\"]]\\\n        .sort_values(\"WEEK_NUM\")\\\n        .groupby(\"WEEK_NUM\")[[\"target\", \"score\"]]\\\n        .apply(lambda x: 2*roc_auc_score(x[\"target\"], x[\"score\"])-1).tolist()\n    \n    x = np.arange(len(gini_in_time))\n    y = gini_in_time\n    a, b = np.polyfit(x, y, 1)\n    y_hat = a*x + b\n    residuals = y - y_hat\n    res_std = np.std(residuals)\n    avg_gini = np.mean(gini_in_time)\n    return avg_gini + w_fallingrate * min(0, a) + w_resstd * res_std\n\nstability_score_train = gini_stability(base_train)\nstability_score_valid = gini_stability(base_valid)\nstability_score_test = gini_stability(base_test)\n\nprint(f'The stability score on the train set is: {stability_score_train}') \nprint(f'The stability score on the valid set is: {stability_score_valid}') \nprint(f'The stability score on the test set is: {stability_score_test}')","metadata":{"execution":{"iopub.status.busy":"2024-03-18T15:26:51.112103Z","iopub.execute_input":"2024-03-18T15:26:51.112569Z","iopub.status.idle":"2024-03-18T15:26:52.344401Z","shell.execute_reply.started":"2024-03-18T15:26:51.112535Z","shell.execute_reply":"2024-03-18T15:26:52.343086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Еще я хотела посмотреть, как будет работать Adaboost, но прочитала подробнее про этот алгоритм, и у него были выявлены особенности, которые делают не самым удачным выбор этой модели. Например, как правило Adaboost работает значительно медленнее, чем два прошлых использованных метода. Также его недостатком является высокая чувствительность к шуму, в связи с чем высокий шанс переобучения. На больших объемах этот алгоритм будет работать значительно хуже, чем XGboost и LightGBM","metadata":{}},{"cell_type":"code","source":"X_submission = data_submission[list(X_train.columns)].to_pandas()\nX_submission = convert_strings(X_submission)\ncategorical_cols = X_train.select_dtypes(include=['category']).columns\n\nfor col in categorical_cols:\n    train_categories = set(X_train[col].cat.categories)\n    submission_categories = set(X_submission[col].cat.categories)\n    new_categories = submission_categories - train_categories\n    X_submission.loc[X_submission[col].isin(new_categories), col] = \"Unknown\"\n    new_dtype = pd.CategoricalDtype(categories=train_categories, ordered=True)\n    X_train[col] = X_train[col].astype(new_dtype)\n    X_submission[col] = X_submission[col].astype(new_dtype)\n\ny_submission_pred = gbm.predict(X_submission, num_iteration=gbm.best_iteration)","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:42:39.182490Z","iopub.execute_input":"2024-03-18T21:42:39.183111Z","iopub.status.idle":"2024-03-18T21:42:39.317654Z","shell.execute_reply.started":"2024-03-18T21:42:39.182971Z","shell.execute_reply":"2024-03-18T21:42:39.316433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\n    \"case_id\": data_submission[\"case_id\"].to_numpy(),\n    \"score\": y_submission_pred\n}).set_index('case_id')\nsubmission.to_csv(\"./submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-03-18T21:42:41.483748Z","iopub.execute_input":"2024-03-18T21:42:41.484191Z","iopub.status.idle":"2024-03-18T21:42:41.496211Z","shell.execute_reply.started":"2024-03-18T21:42:41.484157Z","shell.execute_reply":"2024-03-18T21:42:41.494631Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}