{"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":17000,"databundleVersionId":895292,"sourceType":"competition"}],"dockerImageVersionId":31153,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# import os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n# /kaggle/input/cat-in-the-dat-ii/sample_submission.csv\n# /kaggle/input/cat-in-the-dat-ii/train.csv\n# /kaggle/input/cat-in-the-dat-ii/test.csv\n\nimport os\nimport numpy as np\nimport polars as pl\nfrom sklearn import linear_model, metrics, preprocessing, model_selection","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-10-29T12:46:47.555470Z","iopub.execute_input":"2025-10-29T12:46:47.555861Z","iopub.status.idle":"2025-10-29T12:46:47.562047Z","shell.execute_reply.started":"2025-10-29T12:46:47.555836Z","shell.execute_reply":"2025-10-29T12:46:47.560370Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pl.read_csv('/kaggle/input/cat-in-the-dat-ii/train.csv')\ndf.shape, df.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T12:46:47.564990Z","iopub.execute_input":"2025-10-29T12:46:47.565580Z","iopub.status.idle":"2025-10-29T12:46:47.940478Z","shell.execute_reply.started":"2025-10-29T12:46:47.565545Z","shell.execute_reply":"2025-10-29T12:46:47.939143Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = df.with_columns(pl.lit(-1).alias('kfold'))\ndf = df.sample(fraction=1.0, shuffle=True)\nn = df.height\ny = df.get_column('target').to_numpy()\nkf = model_selection.StratifiedKFold(n_splits=5)\nkfold_arr = np.full(n, -1, dtype=np.int32)\nfor fold, (tr_idx, va_idx) in enumerate(kf.split(X=np.zeros((n, 1)), y=y)):\n    kfold_arr[va_idx] = fold\ndf = df.with_columns(pl.Series('kfold', kfold_arr))\ndf.shape, df.head(3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T12:46:47.942291Z","iopub.execute_input":"2025-10-29T12:46:47.942648Z","iopub.status.idle":"2025-10-29T12:46:48.282634Z","shell.execute_reply.started":"2025-10-29T12:46:47.942625Z","shell.execute_reply":"2025-10-29T12:46:48.281628Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def make_ohe():\n    try:\n        return preprocessing.OneHotEncoder(handle_unknown='ignore', sparse_output=True)\n    except TypeError:\n        return preprocessing.OneHotEncoder(handle_unknown='ignore', sparse=True)\n\n# def run_fold_polars(dfp: pl.DataFrame, fold: int):\n#     features = [c for c in dfp.columns if c not in ('id','target','kfold')]\n\n#     d = dfp.with_columns([pl.col(c).cast(pl.Utf8).fill_null('NONE').alias(c) for c in features])\n\n#     tr = d.filter(pl.col('kfold') != fold)\n#     va = d.filter(pl.col('kfold') == fold)\n\n#     full_feat = pl.concat([tr.select(features), va.select(features)], how='vertical')\n#     ohe = make_ohe()\n#     ohe.fit(full_feat.to_numpy())\n\n#     X_tr = ohe.transform(tr.select(features).to_numpy())\n#     X_va = ohe.transform(va.select(features).to_numpy())\n#     y_tr = tr.select('target').to_numpy().ravel()\n#     y_va = va.select('target').to_numpy().ravel()\n\n#     model = linear_model.LogisticRegression(max_iter=3000)\n#     model.fit(X_tr, y_tr)\n#     va_pred = model.predict_proba(X_va)[:, 1]\n#     auc = metrics.roc_auc_score(y_va, va_pred)\n#     print(f'Fold = {fold}, AUC = {auc}')\n#     return auc\n\n# folds = sorted(pl.Series(df.get_column('kfold')).unique().to_list())\n# auc_scores = [run_fold_polars(df, f) for f in folds]\n# print('CV mean AUC:', float(np.mean(auc_scores)))\n# print('CV std AUC:', float(np.std(auc_scores)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T12:46:48.283659Z","iopub.execute_input":"2025-10-29T12:46:48.284034Z","iopub.status.idle":"2025-10-29T12:46:48.290019Z","shell.execute_reply.started":"2025-10-29T12:46:48.284003Z","shell.execute_reply":"2025-10-29T12:46:48.288801Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pl.read_csv('/kaggle/input/cat-in-the-dat-ii/train.csv')\ntest_df = pl.read_csv('/kaggle/input/cat-in-the-dat-ii/test.csv')\nfeatures = [c for c in train_df.columns if c not in ('id','target')]\n\ntrain_df = train_df.with_columns([pl.col(c).cast(pl.Utf8).fill_null('NONE').alias(c) for c in features])\ntest_df = test_df.with_columns([pl.col(c).cast(pl.Utf8).fill_null('NONE').alias(c) for c in features])\n\nohe = make_ohe()\nfull_feat = pl.concat([train_df.select(features), test_df.select(features)], how='vertical')\nohe.fit(full_feat.to_numpy())\n\nX_tr = ohe.transform(train_df.select(features).to_numpy())\nX_te = ohe.transform(test_df.select(features).to_numpy())\ny_tr = train_df.select('target').to_numpy().ravel()\n\nfinal_model = linear_model.LogisticRegression(max_iter=3000)\nfinal_model.fit(X_tr, y_tr)\ntest_pred = final_model.predict_proba(X_te)[:, 1]\n\nsub = pl.DataFrame({\n    'id': test_df.get_column('id'),\n    'target': test_pred\n})\n\nsub.write_csv('ohe_logreg_submission.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T12:46:48.292305Z","iopub.execute_input":"2025-10-29T12:46:48.292664Z","iopub.status.idle":"2025-10-29T12:48:12.877309Z","shell.execute_reply.started":"2025-10-29T12:46:48.292626Z","shell.execute_reply":"2025-10-29T12:48:12.875793Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub.shape, sub.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T12:48:12.879037Z","iopub.execute_input":"2025-10-29T12:48:12.879431Z","iopub.status.idle":"2025-10-29T12:48:12.889305Z","shell.execute_reply.started":"2025-10-29T12:48:12.879403Z","shell.execute_reply":"2025-10-29T12:48:12.888227Z"}},"outputs":[],"execution_count":null}]}