From d353133b313cd4a957a11560fc6cc966e44a1b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Thu, 30 Apr 2026 16:54:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=BC=BA=E5=8C=96?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E9=A1=B9=E7=9B=AE=E6=8A=A5=E5=91=8A=E5=8F=8A?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=AF=BE=E7=A8=8B=E4=BD=9C=E4=B8=9A=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增强化学习个人项目报告,包含基于PyTorch从零实现的PPO算法 - 重构课程作业报告代码结构,提取运行时路径管理和notebook执行逻辑到独立模块 - 更新依赖文件requirements.txt,添加强化学习相关依赖 - 简化模型比较结果表格,仅保留基线逻辑回归模型数据 --- .../notebooks/insurance_premium_risk.ipynb | 677 +++++++++++++++++- .../outputs/figures/baseline_confusion_matrix.png | Bin 53328 -> 53004 bytes .../outputs/figures/bureau_risk_boxplot.png | Bin 38370 -> 38345 bytes .../outputs/figures/missing_values.png | Bin 60169 -> 59972 bytes .../outputs/figures/target_distribution.png | Bin 50268 -> 50223 bytes .../outputs/tables/model_comparison_summary.csv | 7 +- 强化学习个人课程作业报告/run_notebook.py | 57 +- 强化学习个人课程作业报告/src/__init__.py | 0 .../src/notebook_runner.py | 55 ++ 强化学习个人课程作业报告/src/run_remaining.py | 74 +- 强化学习个人课程作业报告/src/runtime_paths.py | 31 + 强化学习个人项目报告/README.md | 57 ++ 强化学习个人项目报告/TASK_PROGRESS.md | 136 ++++ 强化学习个人项目报告/requirements.txt | 5 + 强化学习个人项目报告/src/__init__.py | 6 + 强化学习个人项目报告/src/evaluate.py | 92 +++ 强化学习个人项目报告/src/network.py | 78 ++ 强化学习个人项目报告/src/replay_buffer.py | 64 ++ 强化学习个人项目报告/src/trainer.py | 123 ++++ 强化学习个人项目报告/src/utils.py | 87 +++ 强化学习个人项目报告/train.py | 192 +++++ 21 files changed, 1639 insertions(+), 102 deletions(-) create mode 100644 强化学习个人课程作业报告/src/__init__.py create mode 100644 强化学习个人课程作业报告/src/notebook_runner.py create mode 100644 强化学习个人课程作业报告/src/runtime_paths.py create mode 100644 强化学习个人项目报告/README.md create mode 100644 强化学习个人项目报告/TASK_PROGRESS.md create mode 100644 强化学习个人项目报告/requirements.txt create mode 100644 强化学习个人项目报告/src/__init__.py create mode 100644 强化学习个人项目报告/src/evaluate.py create mode 100644 强化学习个人项目报告/src/network.py create mode 100644 强化学习个人项目报告/src/replay_buffer.py create mode 100644 强化学习个人项目报告/src/trainer.py create mode 100644 强化学习个人项目报告/src/utils.py create mode 100644 强化学习个人项目报告/train.py diff --git a/强化学习个人课程作业报告/notebooks/insurance_premium_risk.ipynb b/强化学习个人课程作业报告/notebooks/insurance_premium_risk.ipynb index cd30a74..76dd680 100644 --- a/强化学习个人课程作业报告/notebooks/insurance_premium_risk.ipynb +++ b/强化学习个人课程作业报告/notebooks/insurance_premium_risk.ipynb @@ -43,17 +43,68 @@ "execution_count": null, "id": "a12f069a", "metadata": {}, - "outputs": [], - "source": "import xgboost as xgb\nimport optuna\noptuna.logging.set_verbosity(optuna.logging.WARNING)\n\n# GPU Fallback: 自动检测CUDA可用性,无GPU时自动切换到CPU\ntry:\n import subprocess\n result = subprocess.run(['nvidia-smi'], capture_output=True, text=True)\n USE_GPU = result.returncode == 0\nexcept:\n USE_GPU = False\n\nXGB_TREE_METHOD = 'gpu_hist' if USE_GPU else 'hist'\nXGB_DEVICE = 'cuda' if USE_GPU else 'cpu'\nprint(f'XGBoost compute method: {\"GPU (CUDA)\" if USE_GPU else \"CPU\"}')\n\nRANDOM_STATE = 42\nnp.random.seed(RANDOM_STATE)\nplt.rcParams['figure.figsize'] = (10, 6)\nplt.rcParams['font.size'] = 12\nsns.set_style('whitegrid')\nprint('All libraries imported successfully!')" + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'my_env (Python 3.10.18)' requires the ipykernel package.\n", + "\u001b[1;31mCreate a Python Environment with the required packages.\n", + "\u001b[1;31mOr install 'ipykernel' using the command: 'conda install -n my_env ipykernel --update-deps --force-reinstall'" + ] + } + ], + "source": [ + "import xgboost as xgb\n", + "import optuna\n", + "optuna.logging.set_verbosity(optuna.logging.WARNING)\n", + "\n", + "# GPU Fallback: 自动检测CUDA可用性,无GPU时自动切换到CPU\n", + "try:\n", + " import subprocess\n", + " result = subprocess.run(['nvidia-smi'], capture_output=True, text=True)\n", + " USE_GPU = result.returncode == 0\n", + "except:\n", + " USE_GPU = False\n", + "\n", + "XGB_TREE_METHOD = 'gpu_hist' if USE_GPU else 'hist'\n", + "XGB_DEVICE = 'cuda' if USE_GPU else 'cpu'\n", + "print(f'XGBoost compute method: {\"GPU (CUDA)\" if USE_GPU else \"CPU\"}')\n", + "\n", + "RANDOM_STATE = 42\n", + "np.random.seed(RANDOM_STATE)\n", + "plt.rcParams['figure.figsize'] = (10, 6)\n", + "plt.rcParams['font.size'] = 12\n", + "sns.set_style('whitegrid')\n", + "print('All libraries imported successfully!')" + ] }, { "cell_type": "code", "execution_count": null, "id": "1c4b453a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'my_env (Python 3.10.18)' requires the ipykernel package.\n", + "\u001b[1;31mCreate a Python Environment with the required packages.\n", + "\u001b[1;31mOr install 'ipykernel' using the command: 'conda install -n my_env ipykernel --update-deps --force-reinstall'" + ] + } + ], "source": [ - "DATA_DIR = r'd:\\Code\\doing_exercises\\programs\\外教作业外快\\强化学习个人课程作业报告\\dataset_final'\nOUTPUT_DIR = r'd:\\Code\\doing_exercises\\programs\\外教作业外快\\强化学习个人课程作业报告\\outputs'\n\ntrain_df = pd.read_csv(os.path.join(DATA_DIR, 'train.csv'))\nval_df = pd.read_csv(os.path.join(DATA_DIR, 'val.csv'))\ntest_df = pd.read_csv(os.path.join(DATA_DIR, 'test_features.csv'))\n\nprint(f'Train shape: {train_df.shape}')\nprint(f'Val shape: {val_df.shape}')\nprint(f'Test shape: {test_df.shape}')" + "train_df = pd.read_csv(os.path.join(DATA_DIR, 'train.csv'))\n", + "val_df = pd.read_csv(os.path.join(DATA_DIR, 'val.csv'))\n", + "test_df = pd.read_csv(os.path.join(DATA_DIR, 'test_features.csv'))\n", + "\n", + "print(f'Train shape: {train_df.shape}')\n", + "print(f'Val shape: {val_df.shape}')\n", + "print(f'Test shape: {test_df.shape}')" ] }, { @@ -71,7 +122,23 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== TARGET DISTRIBUTION (TRAIN) ===')\ntarget_counts = train_df['premium_risk'].value_counts()\nprint(target_counts)\nprint((target_counts / len(train_df) * 100).round(2))\n\nfig, ax = plt.subplots(figsize=(8, 5))\ncolors = ['#4CAF50', '#FFC107', '#F44336']\ntarget_counts.sort_index().plot(kind='bar', ax=ax, color=colors)\nax.set_title('Target Variable Distribution (Train)', fontsize=14)\nax.set_xlabel('Premium Risk')\nax.set_ylabel('Count')\nax.set_xticklabels(ax.get_xticklabels(), rotation=0)\nfor i, (idx, val) in enumerate(target_counts.sort_index().items()):\n ax.text(i, val + 300, f'{val}\\n({val/len(train_df)*100:.1f}%)', ha='center')\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'target_distribution.png'), dpi=150)\nplt.show()" + "print('=== TARGET DISTRIBUTION (TRAIN) ===')\n", + "target_counts = train_df['premium_risk'].value_counts()\n", + "print(target_counts)\n", + "print((target_counts / len(train_df) * 100).round(2))\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "colors = ['#4CAF50', '#FFC107', '#F44336']\n", + "target_counts.sort_index().plot(kind='bar', ax=ax, color=colors)\n", + "ax.set_title('Target Variable Distribution (Train)', fontsize=14)\n", + "ax.set_xlabel('Premium Risk')\n", + "ax.set_ylabel('Count')\n", + "ax.set_xticklabels(ax.get_xticklabels(), rotation=0)\n", + "for i, (idx, val) in enumerate(target_counts.sort_index().items()):\n", + " ax.text(i, val + 300, f'{val}\\n({val/len(train_df)*100:.1f}%)', ha='center')\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'target_distribution.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -81,7 +148,18 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== MISSING VALUES (TRAIN) ===')\nmissing = train_df.isnull().sum()\nmissing = missing[missing > 0].sort_values(ascending=False)\nprint(missing)\n\nfig, ax = plt.subplots(figsize=(12, 6))\nmissing.plot(kind='barh', ax=ax, color='coral')\nax.set_title('Missing Values per Column (Train)', fontsize=14)\nax.set_xlabel('Count')\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'missing_values.png'), dpi=150)\nplt.show()" + "print('=== MISSING VALUES (TRAIN) ===')\n", + "missing = train_df.isnull().sum()\n", + "missing = missing[missing > 0].sort_values(ascending=False)\n", + "print(missing)\n", + "\n", + "fig, ax = plt.subplots(figsize=(12, 6))\n", + "missing.plot(kind='barh', ax=ax, color='coral')\n", + "ax.set_title('Missing Values per Column (Train)', fontsize=14)\n", + "ax.set_xlabel('Count')\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'missing_values.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -91,7 +169,21 @@ "metadata": {}, "outputs": [], "source": [ - "noise_cols = [c for c in train_df.columns if 'noise' in c.lower()]\nprint(f'Noise features: {noise_cols}')\n\nprint('\\n=== bureau_risk_index stats ===')\nprint(train_df['bureau_risk_index'].describe())\n\nfig, ax = plt.subplots(figsize=(8, 5))\ntrain_df.boxplot(column='bureau_risk_index', by='premium_risk', ax=ax)\nax.set_title('bureau_risk_index by Premium Risk')\nax.set_xlabel('Premium Risk')\nax.set_ylabel('bureau_risk_index')\nplt.suptitle('')\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'bureau_risk_boxplot.png'), dpi=150)\nplt.show()" + "noise_cols = [c for c in train_df.columns if 'noise' in c.lower()]\n", + "print(f'Noise features: {noise_cols}')\n", + "\n", + "print('\\n=== bureau_risk_index stats ===')\n", + "print(train_df['bureau_risk_index'].describe())\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "train_df.boxplot(column='bureau_risk_index', by='premium_risk', ax=ax)\n", + "ax.set_title('bureau_risk_index by Premium Risk')\n", + "ax.set_xlabel('Premium Risk')\n", + "ax.set_ylabel('bureau_risk_index')\n", + "plt.suptitle('')\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'bureau_risk_boxplot.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -112,7 +204,28 @@ "metadata": {}, "outputs": [], "source": [ - "def screen_single_feature_leakage(df, target_col, feature_cols, scoring='f1_macro'):\n from sklearn.tree import DecisionTreeClassifier\n results = []\n for col in feature_cols:\n temp_df = df[[col, target_col]].dropna()\n X_temp = temp_df[[col]].values\n y_temp = temp_df[target_col].values\n le = LabelEncoder()\n y_enc = le.fit_transform(y_temp)\n try:\n clf = DecisionTreeClassifier(random_state=RANDOM_STATE, max_depth=3)\n scores = cross_val_score(clf, X_temp, y_enc, cv=3, scoring=scoring)\n results.append({'feature': col, 'mean_f1_macro': scores.mean(), 'std': scores.std()})\n except:\n results.append({'feature': col, 'mean_f1_macro': 0.0, 'std': 0.0})\n return pd.DataFrame(results).sort_values('mean_f1_macro', ascending=False)\n\nfeature_to_test = [c for c in train_df.columns if c not in ['applicant_id', 'customer_key', 'premium_risk']]\nprint('Screening single features for leakage detection (this may take a few minutes)...')\nleakage_results = screen_single_feature_leakage(train_df, 'premium_risk', feature_to_test)\nprint('\\n=== TOP 10 SINGLE-FEATURE F1 MACRO SCORES ===')\nprint(leakage_results.head(10))" + "def screen_single_feature_leakage(df, target_col, feature_cols, scoring='f1_macro'):\n", + " from sklearn.tree import DecisionTreeClassifier\n", + " results = []\n", + " for col in feature_cols:\n", + " temp_df = df[[col, target_col]].dropna()\n", + " X_temp = temp_df[[col]].values\n", + " y_temp = temp_df[target_col].values\n", + " le = LabelEncoder()\n", + " y_enc = le.fit_transform(y_temp)\n", + " try:\n", + " clf = DecisionTreeClassifier(random_state=RANDOM_STATE, max_depth=3)\n", + " scores = cross_val_score(clf, X_temp, y_enc, cv=3, scoring=scoring)\n", + " results.append({'feature': col, 'mean_f1_macro': scores.mean(), 'std': scores.std()})\n", + " except:\n", + " results.append({'feature': col, 'mean_f1_macro': 0.0, 'std': 0.0})\n", + " return pd.DataFrame(results).sort_values('mean_f1_macro', ascending=False)\n", + "\n", + "feature_to_test = [c for c in train_df.columns if c not in ['applicant_id', 'customer_key', 'premium_risk']]\n", + "print('Screening single features for leakage detection (this may take a few minutes)...')\n", + "leakage_results = screen_single_feature_leakage(train_df, 'premium_risk', feature_to_test)\n", + "print('\\n=== TOP 10 SINGLE-FEATURE F1 MACRO SCORES ===')\n", + "print(leakage_results.head(10))" ] }, { @@ -122,7 +235,26 @@ "metadata": {}, "outputs": [], "source": [ - "LEAKAGE_THRESHOLD = 0.85\nprint('=== LEAKAGE DETECTION RESULTS ===')\nprint(leakage_results.head(10))\n\nbureau_score = leakage_results[leakage_results['feature'] == 'bureau_risk_index']['mean_f1_macro'].values[0]\nprint(f'\\nbureau_risk_index F1 macro: {bureau_score:.4f}')\n\nif bureau_score > LEAKAGE_THRESHOLD:\n print('\\n*** ALERT: bureau_risk_index shows abnormally high predictive power! ***')\n print('*** This is consistent with a leakage feature. ***')\n print('*** ACTION: bureau_risk_index will be removed from features. ***')\n LEAKAGE_FEATURE = 'bureau_risk_index'\nelse:\n top_feat = leakage_results.iloc[0]['feature']\n top_score = leakage_results.iloc[0]['mean_f1_macro']\n print(f'\\nTop feature: {top_feat} with F1 macro = {top_score:.4f}')\n if top_score > 0.80:\n LEAKAGE_FEATURE = top_feat\n else:\n LEAKAGE_FEATURE = None" + "LEAKAGE_THRESHOLD = 0.85\n", + "print('=== LEAKAGE DETECTION RESULTS ===')\n", + "print(leakage_results.head(10))\n", + "\n", + "bureau_score = leakage_results[leakage_results['feature'] == 'bureau_risk_index']['mean_f1_macro'].values[0]\n", + "print(f'\\nbureau_risk_index F1 macro: {bureau_score:.4f}')\n", + "\n", + "if bureau_score > LEAKAGE_THRESHOLD:\n", + " print('\\n*** ALERT: bureau_risk_index shows abnormally high predictive power! ***')\n", + " print('*** This is consistent with a leakage feature. ***')\n", + " print('*** ACTION: bureau_risk_index will be removed from features. ***')\n", + " LEAKAGE_FEATURE = 'bureau_risk_index'\n", + "else:\n", + " top_feat = leakage_results.iloc[0]['feature']\n", + " top_score = leakage_results.iloc[0]['mean_f1_macro']\n", + " print(f'\\nTop feature: {top_feat} with F1 macro = {top_score:.4f}')\n", + " if top_score > 0.80:\n", + " LEAKAGE_FEATURE = top_feat\n", + " else:\n", + " LEAKAGE_FEATURE = None" ] }, { @@ -132,7 +264,18 @@ "metadata": {}, "outputs": [], "source": [ - "if LEAKAGE_FEATURE:\n print(f'Removing leakage feature: {LEAKAGE_FEATURE}')\n train_df_clean = train_df.drop(columns=[LEAKAGE_FEATURE])\n val_df_clean = val_df.drop(columns=[LEAKAGE_FEATURE])\n test_df_clean = test_df.drop(columns=[LEAKAGE_FEATURE])\nelse:\n print('No leakage feature to remove.')\n train_df_clean = train_df.copy()\n val_df_clean = val_df.copy()\n test_df_clean = test_df.copy()\n\nprint(f'After removal - Train: {train_df_clean.shape}, Val: {val_df_clean.shape}, Test: {test_df_clean.shape}')" + "if LEAKAGE_FEATURE:\n", + " print(f'Removing leakage feature: {LEAKAGE_FEATURE}')\n", + " train_df_clean = train_df.drop(columns=[LEAKAGE_FEATURE])\n", + " val_df_clean = val_df.drop(columns=[LEAKAGE_FEATURE])\n", + " test_df_clean = test_df.drop(columns=[LEAKAGE_FEATURE])\n", + "else:\n", + " print('No leakage feature to remove.')\n", + " train_df_clean = train_df.copy()\n", + " val_df_clean = val_df.copy()\n", + " test_df_clean = test_df.copy()\n", + "\n", + "print(f'After removal - Train: {train_df_clean.shape}, Val: {val_df_clean.shape}, Test: {test_df_clean.shape}')" ] }, { @@ -150,7 +293,19 @@ "metadata": {}, "outputs": [], "source": [ - "ID_COLS = ['applicant_id', 'customer_key', 'applicant_ref_code']\nNOISE_COLS = ['noise_feature_1', 'noise_feature_2', 'noise_feature_3', 'noise_feature_4', 'noise_feature_5']\nTARGET_COL = 'premium_risk'\n\nall_cols = train_df_clean.columns.tolist()\nfeature_cols_all = [c for c in all_cols if c not in ID_COLS + NOISE_COLS + [TARGET_COL]]\n\nNUMERIC_FEATURES = train_df_clean[feature_cols_all].select_dtypes(include=[np.number]).columns.tolist()\nCATEGORICAL_FEATURES = train_df_clean[feature_cols_all].select_dtypes(include=['object']).columns.tolist()\n\nprint(f'Total features: {len(feature_cols_all)}')\nprint(f'Numeric ({len(NUMERIC_FEATURES)}): {NUMERIC_FEATURES}')\nprint(f'Categorical ({len(CATEGORICAL_FEATURES)}): {CATEGORICAL_FEATURES}')" + "ID_COLS = ['applicant_id', 'customer_key', 'applicant_ref_code']\n", + "NOISE_COLS = ['noise_feature_1', 'noise_feature_2', 'noise_feature_3', 'noise_feature_4', 'noise_feature_5']\n", + "TARGET_COL = 'premium_risk'\n", + "\n", + "all_cols = train_df_clean.columns.tolist()\n", + "feature_cols_all = [c for c in all_cols if c not in ID_COLS + NOISE_COLS + [TARGET_COL]]\n", + "\n", + "NUMERIC_FEATURES = train_df_clean[feature_cols_all].select_dtypes(include=[np.number]).columns.tolist()\n", + "CATEGORICAL_FEATURES = train_df_clean[feature_cols_all].select_dtypes(include=['object']).columns.tolist()\n", + "\n", + "print(f'Total features: {len(feature_cols_all)}')\n", + "print(f'Numeric ({len(NUMERIC_FEATURES)}): {NUMERIC_FEATURES}')\n", + "print(f'Categorical ({len(CATEGORICAL_FEATURES)}): {CATEGORICAL_FEATURES}')" ] }, { @@ -160,7 +315,24 @@ "metadata": {}, "outputs": [], "source": [ - "numeric_transformer = Pipeline(steps=[\n ('imputer', SimpleImputer(strategy='median')),\n ('scaler', StandardScaler())\n])\n\ncategorical_transformer = Pipeline(steps=[\n ('imputer', SimpleImputer(strategy='most_frequent')),\n ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n])\n\npreprocessor = ColumnTransformer(\n transformers=[\n ('num', numeric_transformer, NUMERIC_FEATURES),\n ('cat', categorical_transformer, CATEGORICAL_FEATURES)\n ],\n remainder='drop'\n)\nprint('Preprocessing pipeline created!')" + "numeric_transformer = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='median')),\n", + " ('scaler', StandardScaler())\n", + "])\n", + "\n", + "categorical_transformer = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='most_frequent')),\n", + " ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n", + "])\n", + "\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', numeric_transformer, NUMERIC_FEATURES),\n", + " ('cat', categorical_transformer, CATEGORICAL_FEATURES)\n", + " ],\n", + " remainder='drop'\n", + ")\n", + "print('Preprocessing pipeline created!')" ] }, { @@ -170,7 +342,18 @@ "metadata": {}, "outputs": [], "source": [ - "X_train = train_df_clean[feature_cols_all]\ny_train = train_df_clean[TARGET_COL]\nX_val = val_df_clean[feature_cols_all]\ny_val = val_df_clean[TARGET_COL]\nX_test = test_df_clean[feature_cols_all]\n\nle_target = LabelEncoder()\ny_train_enc = le_target.fit_transform(y_train)\ny_val_enc = le_target.transform(y_val)\n\nprint(f'Classes: {le_target.classes_}')\nprint(f'X_train: {X_train.shape} | X_val: {X_val.shape} | X_test: {X_test.shape}')" + "X_train = train_df_clean[feature_cols_all]\n", + "y_train = train_df_clean[TARGET_COL]\n", + "X_val = val_df_clean[feature_cols_all]\n", + "y_val = val_df_clean[TARGET_COL]\n", + "X_test = test_df_clean[feature_cols_all]\n", + "\n", + "le_target = LabelEncoder()\n", + "y_train_enc = le_target.fit_transform(y_train)\n", + "y_val_enc = le_target.transform(y_val)\n", + "\n", + "print(f'Classes: {le_target.classes_}')\n", + "print(f'X_train: {X_train.shape} | X_val: {X_val.shape} | X_test: {X_test.shape}')" ] }, { @@ -188,7 +371,32 @@ "metadata": {}, "outputs": [], "source": [ - "def evaluate_model(pipeline, X_tr, y_tr, X_v, y_v, le, model_name='Model'):\n y_tr_pred = pipeline.predict(X_tr)\n y_v_pred = pipeline.predict(X_v)\n results = {\n 'model': model_name,\n 'train_accuracy': accuracy_score(y_tr, y_tr_pred),\n 'val_accuracy': accuracy_score(y_v, y_v_pred),\n 'train_f1_macro': f1_score(y_tr, y_tr_pred, average='macro'),\n 'val_f1_macro': f1_score(y_v, y_v_pred, average='macro'),\n }\n f1_per_class = f1_score(y_v, y_v_pred, average=None)\n for i, cls in enumerate(le.classes_):\n results[f'val_f1_{cls}'] = f1_per_class[i]\n return results\n\ndef plot_confusion_matrix(pipeline, X_v, y_v, le, title, save_path):\n y_pred = pipeline.predict(X_v)\n fig, ax = plt.subplots(figsize=(8, 6))\n cm = confusion_matrix(y_v, y_pred)\n disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=le.classes_)\n disp.plot(ax=ax, cmap='Blues', values_format='d')\n ax.set_title(title, fontsize=14)\n plt.tight_layout()\n plt.savefig(save_path, dpi=150)\n plt.show()\n return cm" + "def evaluate_model(pipeline, X_tr, y_tr, X_v, y_v, le, model_name='Model'):\n", + " y_tr_pred = pipeline.predict(X_tr)\n", + " y_v_pred = pipeline.predict(X_v)\n", + " results = {\n", + " 'model': model_name,\n", + " 'train_accuracy': accuracy_score(y_tr, y_tr_pred),\n", + " 'val_accuracy': accuracy_score(y_v, y_v_pred),\n", + " 'train_f1_macro': f1_score(y_tr, y_tr_pred, average='macro'),\n", + " 'val_f1_macro': f1_score(y_v, y_v_pred, average='macro'),\n", + " }\n", + " f1_per_class = f1_score(y_v, y_v_pred, average=None)\n", + " for i, cls in enumerate(le.classes_):\n", + " results[f'val_f1_{cls}'] = f1_per_class[i]\n", + " return results\n", + "\n", + "def plot_confusion_matrix(pipeline, X_v, y_v, le, title, save_path):\n", + " y_pred = pipeline.predict(X_v)\n", + " fig, ax = plt.subplots(figsize=(8, 6))\n", + " cm = confusion_matrix(y_v, y_pred)\n", + " disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=le.classes_)\n", + " disp.plot(ax=ax, cmap='Blues', values_format='d')\n", + " ax.set_title(title, fontsize=14)\n", + " plt.tight_layout()\n", + " plt.savefig(save_path, dpi=150)\n", + " plt.show()\n", + " return cm" ] }, { @@ -198,7 +406,19 @@ "metadata": {}, "outputs": [], "source": [ - "print('Training Baseline: Logistic Regression...')\nbaseline_pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor),\n ('classifier', LogisticRegression(class_weight='balanced', max_iter=1000, random_state=RANDOM_STATE, n_jobs=-1))\n])\nbaseline_pipeline.fit(X_train, y_train_enc)\n\nbaseline_results = evaluate_model(baseline_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'Baseline_LR')\n\nprint('\\n=== BASELINE MODEL RESULTS ===')\nfor k, v in baseline_results.items():\n if k != 'model':\n print(f'{k}: {v:.4f}')" + "print('Training Baseline: Logistic Regression...')\n", + "baseline_pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', LogisticRegression(class_weight='balanced', max_iter=1000, random_state=RANDOM_STATE, n_jobs=-1))\n", + "])\n", + "baseline_pipeline.fit(X_train, y_train_enc)\n", + "\n", + "baseline_results = evaluate_model(baseline_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'Baseline_LR')\n", + "\n", + "print('\\n=== BASELINE MODEL RESULTS ===')\n", + "for k, v in baseline_results.items():\n", + " if k != 'model':\n", + " print(f'{k}: {v:.4f}')" ] }, { @@ -208,7 +428,17 @@ "metadata": {}, "outputs": [], "source": [ - "plot_confusion_matrix(baseline_pipeline, X_val, y_val_enc, le_target,\n 'Baseline: Logistic Regression - Confusion Matrix',\n os.path.join(OUTPUT_DIR, 'figures', 'baseline_confusion_matrix.png'))\n\nprint('\\n=== CLASSIFICATION REPORT (VAL) ===')\ny_val_pred = baseline_pipeline.predict(X_val)\nprint(classification_report(y_val_enc, y_val_pred, target_names=le_target.classes_))\n\nall_results = [baseline_results]\npd.DataFrame(all_results).to_csv(\n os.path.join(OUTPUT_DIR, 'tables', 'model_comparison_summary.csv'), index=False)" + "plot_confusion_matrix(baseline_pipeline, X_val, y_val_enc, le_target,\n", + " 'Baseline: Logistic Regression - Confusion Matrix',\n", + " os.path.join(OUTPUT_DIR, 'figures', 'baseline_confusion_matrix.png'))\n", + "\n", + "print('\\n=== CLASSIFICATION REPORT (VAL) ===')\n", + "y_val_pred = baseline_pipeline.predict(X_val)\n", + "print(classification_report(y_val_enc, y_val_pred, target_names=le_target.classes_))\n", + "\n", + "all_results = [baseline_results]\n", + "pd.DataFrame(all_results).to_csv(\n", + " os.path.join(OUTPUT_DIR, 'tables', 'model_comparison_summary.csv'), index=False)" ] }, { @@ -225,7 +455,36 @@ "id": "30cd02ce", "metadata": {}, "outputs": [], - "source": "print('Training Random Forest...')\nstart = time.time()\nrf_pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor),\n ('classifier', RandomForestClassifier(n_estimators=200, class_weight='balanced', random_state=RANDOM_STATE, n_jobs=-1))\n])\nrf_pipeline.fit(X_train, y_train_enc)\nrf_time = time.time() - start\n\nrf_results = evaluate_model(rf_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'RandomForest')\nrf_results['train_time'] = rf_time\n\nprint('Training XGBoost...')\nstart = time.time()\nxgb_pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor),\n ('classifier', xgb.XGBClassifier(n_estimators=200, learning_rate=0.1, max_depth=6,\n objective='multi:softmax', num_class=3,\n tree_method=XGB_TREE_METHOD, device=XGB_DEVICE,\n random_state=RANDOM_STATE, verbosity=0))\n])\nxgb_pipeline.fit(X_train, y_train_enc)\nxgb_time = time.time() - start\n\nxgb_results = evaluate_model(xgb_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'XGBoost')\nxgb_results['train_time'] = xgb_time\n\nprint(f'RF time: {rf_time:.2f}s | XGB time: {xgb_time:.2f}s')" + "source": [ + "print('Training Random Forest...')\n", + "start = time.time()\n", + "rf_pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', RandomForestClassifier(n_estimators=200, class_weight='balanced', random_state=RANDOM_STATE, n_jobs=-1))\n", + "])\n", + "rf_pipeline.fit(X_train, y_train_enc)\n", + "rf_time = time.time() - start\n", + "\n", + "rf_results = evaluate_model(rf_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'RandomForest')\n", + "rf_results['train_time'] = rf_time\n", + "\n", + "print('Training XGBoost...')\n", + "start = time.time()\n", + "xgb_pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', xgb.XGBClassifier(n_estimators=200, learning_rate=0.1, max_depth=6,\n", + " objective='multi:softmax', num_class=3,\n", + " tree_method=XGB_TREE_METHOD, device=XGB_DEVICE,\n", + " random_state=RANDOM_STATE, verbosity=0))\n", + "])\n", + "xgb_pipeline.fit(X_train, y_train_enc)\n", + "xgb_time = time.time() - start\n", + "\n", + "xgb_results = evaluate_model(xgb_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'XGBoost')\n", + "xgb_results['train_time'] = xgb_time\n", + "\n", + "print(f'RF time: {rf_time:.2f}s | XGB time: {xgb_time:.2f}s')" + ] }, { "cell_type": "code", @@ -234,7 +493,17 @@ "metadata": {}, "outputs": [], "source": [ - "all_results.append(rf_results)\nall_results.append(xgb_results)\nresults_df = pd.DataFrame(all_results)\n\nprint('\\n=== MODEL COMPARISON SUMMARY ===')\ndisplay_cols = ['model', 'train_accuracy', 'val_accuracy', 'train_f1_macro', 'val_f1_macro', 'train_time']\nprint(results_df[display_cols].round(4).to_string(index=False))\n\nprint('\\n=== CLASS-WISE F1 (VAL) ===')\nclass_cols = [c for c in results_df.columns if c.startswith('val_f1_') and c != 'val_f1_macro']\nprint(results_df[['model'] + class_cols].round(4).to_string(index=False))" + "all_results.append(rf_results)\n", + "all_results.append(xgb_results)\n", + "results_df = pd.DataFrame(all_results)\n", + "\n", + "print('\\n=== MODEL COMPARISON SUMMARY ===')\n", + "display_cols = ['model', 'train_accuracy', 'val_accuracy', 'train_f1_macro', 'val_f1_macro', 'train_time']\n", + "print(results_df[display_cols].round(4).to_string(index=False))\n", + "\n", + "print('\\n=== CLASS-WISE F1 (VAL) ===')\n", + "class_cols = [c for c in results_df.columns if c.startswith('val_f1_') and c != 'val_f1_macro']\n", + "print(results_df[['model'] + class_cols].round(4).to_string(index=False))" ] }, { @@ -244,7 +513,28 @@ "metadata": {}, "outputs": [], "source": [ - "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\nmodels = results_df['model'].tolist()\nval_f1 = results_df['val_f1_macro'].tolist()\nval_acc = results_df['val_accuracy'].tolist()\n\nbars1 = axes[0].bar(models, val_f1, color=['#2196F3', '#4CAF50', '#FF9800'])\naxes[0].set_title('Validation Macro-F1 Comparison', fontsize=13)\naxes[0].set_ylabel('Macro-F1')\naxes[0].set_ylim(0, 1)\nfor bar, val in zip(bars1, val_f1):\n axes[0].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, f'{val:.4f}', ha='center')\n\nbars2 = axes[1].bar(models, val_acc, color=['#2196F3', '#4CAF50', '#FF9800'])\naxes[1].set_title('Validation Accuracy Comparison', fontsize=13)\naxes[1].set_ylabel('Accuracy')\naxes[1].set_ylim(0, 1)\nfor bar, val in zip(bars2, val_acc):\n axes[1].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, f'{val:.4f}', ha='center')\n\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'model_comparison.png'), dpi=150)\nplt.show()" + "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", + "models = results_df['model'].tolist()\n", + "val_f1 = results_df['val_f1_macro'].tolist()\n", + "val_acc = results_df['val_accuracy'].tolist()\n", + "\n", + "bars1 = axes[0].bar(models, val_f1, color=['#2196F3', '#4CAF50', '#FF9800'])\n", + "axes[0].set_title('Validation Macro-F1 Comparison', fontsize=13)\n", + "axes[0].set_ylabel('Macro-F1')\n", + "axes[0].set_ylim(0, 1)\n", + "for bar, val in zip(bars1, val_f1):\n", + " axes[0].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, f'{val:.4f}', ha='center')\n", + "\n", + "bars2 = axes[1].bar(models, val_acc, color=['#2196F3', '#4CAF50', '#FF9800'])\n", + "axes[1].set_title('Validation Accuracy Comparison', fontsize=13)\n", + "axes[1].set_ylabel('Accuracy')\n", + "axes[1].set_ylim(0, 1)\n", + "for bar, val in zip(bars2, val_acc):\n", + " axes[1].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, f'{val:.4f}', ha='center')\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'model_comparison.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -254,7 +544,13 @@ "metadata": {}, "outputs": [], "source": [ - "plot_confusion_matrix(rf_pipeline, X_val, y_val_enc, le_target,\n 'Random Forest - Confusion Matrix',\n os.path.join(OUTPUT_DIR, 'figures', 'rf_confusion_matrix.png'))\n\nplot_confusion_matrix(xgb_pipeline, X_val, y_val_enc, le_target,\n 'XGBoost - Confusion Matrix',\n os.path.join(OUTPUT_DIR, 'figures', 'xgb_confusion_matrix.png'))" + "plot_confusion_matrix(rf_pipeline, X_val, y_val_enc, le_target,\n", + " 'Random Forest - Confusion Matrix',\n", + " os.path.join(OUTPUT_DIR, 'figures', 'rf_confusion_matrix.png'))\n", + "\n", + "plot_confusion_matrix(xgb_pipeline, X_val, y_val_enc, le_target,\n", + " 'XGBoost - Confusion Matrix',\n", + " os.path.join(OUTPUT_DIR, 'figures', 'xgb_confusion_matrix.png'))" ] }, { @@ -272,7 +568,17 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== BAGGING VS BOOSTING ANALYSIS ===')\nrf_val_f1 = rf_results['val_f1_macro']\nrf_train_f1 = rf_results['train_f1_macro']\nrf_gap = rf_train_f1 - rf_val_f1\n\nxgb_val_f1 = xgb_results['val_f1_macro']\nxgb_train_f1 = xgb_results['train_f1_macro']\nxgb_gap = xgb_train_f1 - xgb_val_f1\n\nprint(f'Random Forest - val_f1_macro: {rf_val_f1:.4f}, overfitting gap: {rf_gap:.4f}')\nprint(f'XGBoost - val_f1_macro: {xgb_val_f1:.4f}, overfitting gap: {xgb_gap:.4f}')" + "print('=== BAGGING VS BOOSTING ANALYSIS ===')\n", + "rf_val_f1 = rf_results['val_f1_macro']\n", + "rf_train_f1 = rf_results['train_f1_macro']\n", + "rf_gap = rf_train_f1 - rf_val_f1\n", + "\n", + "xgb_val_f1 = xgb_results['val_f1_macro']\n", + "xgb_train_f1 = xgb_results['train_f1_macro']\n", + "xgb_gap = xgb_train_f1 - xgb_val_f1\n", + "\n", + "print(f'Random Forest - val_f1_macro: {rf_val_f1:.4f}, overfitting gap: {rf_gap:.4f}')\n", + "print(f'XGBoost - val_f1_macro: {xgb_val_f1:.4f}, overfitting gap: {xgb_gap:.4f}')" ] }, { @@ -289,7 +595,40 @@ "id": "e6361576", "metadata": {}, "outputs": [], - "source": "def objective(trial):\n params = {\n 'n_estimators': trial.suggest_int('n_estimators', 100, 500),\n 'max_depth': trial.suggest_int('max_depth', 3, 10),\n 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True),\n 'min_child_weight': trial.suggest_int('min_child_weight', 1, 10),\n 'subsample': trial.suggest_float('subsample', 0.5, 1.0),\n 'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1.0),\n 'gamma': trial.suggest_float('gamma', 0, 5),\n 'reg_alpha': trial.suggest_float('reg_alpha', 1e-4, 10.0, log=True),\n 'reg_lambda': trial.suggest_float('reg_lambda', 1e-4, 10.0, log=True),\n 'objective': 'multi:softmax',\n 'num_class': 3,\n 'random_state': RANDOM_STATE,\n 'tree_method': XGB_TREE_METHOD,\n 'device': XGB_DEVICE,\n 'verbosity': 0\n }\n pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor),\n ('classifier', xgb.XGBClassifier(**params))\n ])\n pipeline.fit(X_train, y_train_enc)\n y_pred = pipeline.predict(X_val)\n score = f1_score(y_val_enc, y_pred, average='macro')\n return score\n\nprint('Starting Optuna hyperparameter optimisation (30 trials)...')\nstudy = optuna.create_study(direction='maximize', sampler=optuna.samplers.TPESampler(seed=RANDOM_STATE))\nstudy.optimize(objective, n_trials=30, show_progress_bar=False)\n\nprint(f'Best trial: {study.best_trial.number} | Best macro-F1: {study.best_value:.4f}')" + "source": [ + "def objective(trial):\n", + " params = {\n", + " 'n_estimators': trial.suggest_int('n_estimators', 100, 500),\n", + " 'max_depth': trial.suggest_int('max_depth', 3, 10),\n", + " 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True),\n", + " 'min_child_weight': trial.suggest_int('min_child_weight', 1, 10),\n", + " 'subsample': trial.suggest_float('subsample', 0.5, 1.0),\n", + " 'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1.0),\n", + " 'gamma': trial.suggest_float('gamma', 0, 5),\n", + " 'reg_alpha': trial.suggest_float('reg_alpha', 1e-4, 10.0, log=True),\n", + " 'reg_lambda': trial.suggest_float('reg_lambda', 1e-4, 10.0, log=True),\n", + " 'objective': 'multi:softmax',\n", + " 'num_class': 3,\n", + " 'random_state': RANDOM_STATE,\n", + " 'tree_method': XGB_TREE_METHOD,\n", + " 'device': XGB_DEVICE,\n", + " 'verbosity': 0\n", + " }\n", + " pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', xgb.XGBClassifier(**params))\n", + " ])\n", + " pipeline.fit(X_train, y_train_enc)\n", + " y_pred = pipeline.predict(X_val)\n", + " score = f1_score(y_val_enc, y_pred, average='macro')\n", + " return score\n", + "\n", + "print('Starting Optuna hyperparameter optimisation (30 trials)...')\n", + "study = optuna.create_study(direction='maximize', sampler=optuna.samplers.TPESampler(seed=RANDOM_STATE))\n", + "study.optimize(objective, n_trials=30, show_progress_bar=False)\n", + "\n", + "print(f'Best trial: {study.best_trial.number} | Best macro-F1: {study.best_value:.4f}')" + ] }, { "cell_type": "code", @@ -298,7 +637,22 @@ "metadata": {}, "outputs": [], "source": [ - "print('\\n=== BEST HYPERPARAMETERS ===')\nbest_params = study.best_params\nfor k, v in best_params.items():\n print(f' {k}: {v}')\n\nfig = optuna.visualization.matplotlib.plot_optimization_history(study)\nplt.title('Optuna Optimization History')\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'optuna_optimization_history.png'), dpi=150)\nplt.show()\n\nfig = optuna.visualization.matplotlib.plot_param_importances(study)\nplt.title('Hyperparameter Importance')\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'optuna_param_importance.png'), dpi=150)\nplt.show()" + "print('\\n=== BEST HYPERPARAMETERS ===')\n", + "best_params = study.best_params\n", + "for k, v in best_params.items():\n", + " print(f' {k}: {v}')\n", + "\n", + "fig = optuna.visualization.matplotlib.plot_optimization_history(study)\n", + "plt.title('Optuna Optimization History')\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'optuna_optimization_history.png'), dpi=150)\n", + "plt.show()\n", + "\n", + "fig = optuna.visualization.matplotlib.plot_param_importances(study)\n", + "plt.title('Hyperparameter Importance')\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'optuna_param_importance.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -307,7 +661,37 @@ "id": "640263ea", "metadata": {}, "outputs": [], - "source": "best_xgb_params = {\n **study.best_params,\n 'objective': 'multi:softmax',\n 'num_class': 3,\n 'random_state': RANDOM_STATE,\n 'tree_method': XGB_TREE_METHOD,\n 'device': XGB_DEVICE,\n 'verbosity': 0\n}\n\nprint('Training tuned XGBoost...')\nimport time\nstart = time.time()\ntuned_xgb_pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor),\n ('classifier', xgb.XGBClassifier(**best_xgb_params))\n])\ntuned_xgb_pipeline.fit(X_train, y_train_enc)\ntuned_time = time.time() - start\n\ntuned_results = evaluate_model(tuned_xgb_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'XGBoost_Tuned')\ntuned_results['train_time'] = tuned_time\n\nprint('\\n=== TUNED XGBOOST RESULTS ===')\nfor k, v in tuned_results.items():\n if k != 'model':\n print(f'{k}: {v:.4f}')\n\nprint(f'\\nTuning improvement (macro-F1): +{tuned_results[\"val_f1_macro\"] - xgb_results[\"val_f1_macro\"]:.4f}')" + "source": [ + "best_xgb_params = {\n", + " **study.best_params,\n", + " 'objective': 'multi:softmax',\n", + " 'num_class': 3,\n", + " 'random_state': RANDOM_STATE,\n", + " 'tree_method': XGB_TREE_METHOD,\n", + " 'device': XGB_DEVICE,\n", + " 'verbosity': 0\n", + "}\n", + "\n", + "print('Training tuned XGBoost...')\n", + "import time\n", + "start = time.time()\n", + "tuned_xgb_pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', xgb.XGBClassifier(**best_xgb_params))\n", + "])\n", + "tuned_xgb_pipeline.fit(X_train, y_train_enc)\n", + "tuned_time = time.time() - start\n", + "\n", + "tuned_results = evaluate_model(tuned_xgb_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'XGBoost_Tuned')\n", + "tuned_results['train_time'] = tuned_time\n", + "\n", + "print('\\n=== TUNED XGBOOST RESULTS ===')\n", + "for k, v in tuned_results.items():\n", + " if k != 'model':\n", + " print(f'{k}: {v:.4f}')\n", + "\n", + "print(f'\\nTuning improvement (macro-F1): +{tuned_results[\"val_f1_macro\"] - xgb_results[\"val_f1_macro\"]:.4f}')" + ] }, { "cell_type": "code", @@ -316,7 +700,11 @@ "metadata": {}, "outputs": [], "source": [ - "all_results.append(tuned_results)\nresults_df = pd.DataFrame(all_results)\n\nprint('\\n=== BEFORE VS AFTER TUNING ===')\nprint(results_df[['model', 'val_f1_macro', 'val_accuracy', 'train_time']].round(4).to_string(index=False))" + "all_results.append(tuned_results)\n", + "results_df = pd.DataFrame(all_results)\n", + "\n", + "print('\\n=== BEFORE VS AFTER TUNING ===')\n", + "print(results_df[['model', 'val_f1_macro', 'val_accuracy', 'train_time']].round(4).to_string(index=False))" ] }, { @@ -339,7 +727,47 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== CATEGORY A: IMPROVED MISSING VALUE HANDLING ===')\n\nMISSING_COLS = ['net_monthly_income_gbp', 'avg_payment_delay_days', 'monthly_investment_gbp',\n 'prior_debt_products', 'account_tenure']\n\nfor col in MISSING_COLS:\n missing_col_name = f'{col}_missing'\n train_df_clean[missing_col_name] = train_df_clean[col].isnull().astype(int)\n val_df_clean[missing_col_name] = val_df_clean[col].isnull().astype(int)\n test_df_clean[missing_col_name] = test_df_clean[col].isnull().astype(int)\n print(f'Added missing indicator: {missing_col_name}')\n\nfeature_cols_catA = feature_cols_all + [f'{c}_missing' for c in MISSING_COLS]\nprint(f'\\nFeature columns after adding indicators: {len(feature_cols_catA)}')\n\nX_train_A = train_df_clean[feature_cols_catA]\nX_val_A = val_df_clean[feature_cols_catA]\nX_test_A = test_df_clean[feature_cols_catA]\n\nNUMERIC_FEATURES_A = X_train_A.select_dtypes(include=[np.number]).columns.tolist()\nCATEGORICAL_FEATURES_A = X_train_A.select_dtypes(include=['object']).columns.tolist()\n\npreprocessor_A = ColumnTransformer(\n transformers=[\n ('num', numeric_transformer, NUMERIC_FEATURES_A),\n ('cat', categorical_transformer, CATEGORICAL_FEATURES_A)\n ],\n remainder='drop'\n)\n\ncatA_pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor_A),\n ('classifier', xgb.XGBClassifier(**best_xgb_params))\n])\ncatA_pipeline.fit(X_train_A, y_train_enc)\n\ncatA_results = evaluate_model(catA_pipeline, X_train_A, y_train_enc, X_val_A, y_val_enc, le_target, 'XGB_CatA_MissingHandling')\n\nprint('\\n=== CATEGORY A RESULTS ===')\nprint(f'val_f1_macro: {catA_results[\"val_f1_macro\"]:.4f}')\nprint(f'val_accuracy: {catA_results[\"val_accuracy\"]:.4f}')" + "print('=== CATEGORY A: IMPROVED MISSING VALUE HANDLING ===')\n", + "\n", + "MISSING_COLS = ['net_monthly_income_gbp', 'avg_payment_delay_days', 'monthly_investment_gbp',\n", + " 'prior_debt_products', 'account_tenure']\n", + "\n", + "for col in MISSING_COLS:\n", + " missing_col_name = f'{col}_missing'\n", + " train_df_clean[missing_col_name] = train_df_clean[col].isnull().astype(int)\n", + " val_df_clean[missing_col_name] = val_df_clean[col].isnull().astype(int)\n", + " test_df_clean[missing_col_name] = test_df_clean[col].isnull().astype(int)\n", + " print(f'Added missing indicator: {missing_col_name}')\n", + "\n", + "feature_cols_catA = feature_cols_all + [f'{c}_missing' for c in MISSING_COLS]\n", + "print(f'\\nFeature columns after adding indicators: {len(feature_cols_catA)}')\n", + "\n", + "X_train_A = train_df_clean[feature_cols_catA]\n", + "X_val_A = val_df_clean[feature_cols_catA]\n", + "X_test_A = test_df_clean[feature_cols_catA]\n", + "\n", + "NUMERIC_FEATURES_A = X_train_A.select_dtypes(include=[np.number]).columns.tolist()\n", + "CATEGORICAL_FEATURES_A = X_train_A.select_dtypes(include=['object']).columns.tolist()\n", + "\n", + "preprocessor_A = ColumnTransformer(\n", + " transformers=[\n", + " ('num', numeric_transformer, NUMERIC_FEATURES_A),\n", + " ('cat', categorical_transformer, CATEGORICAL_FEATURES_A)\n", + " ],\n", + " remainder='drop'\n", + ")\n", + "\n", + "catA_pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor_A),\n", + " ('classifier', xgb.XGBClassifier(**best_xgb_params))\n", + "])\n", + "catA_pipeline.fit(X_train_A, y_train_enc)\n", + "\n", + "catA_results = evaluate_model(catA_pipeline, X_train_A, y_train_enc, X_val_A, y_val_enc, le_target, 'XGB_CatA_MissingHandling')\n", + "\n", + "print('\\n=== CATEGORY A RESULTS ===')\n", + "print(f'val_f1_macro: {catA_results[\"val_f1_macro\"]:.4f}')\n", + "print(f'val_accuracy: {catA_results[\"val_accuracy\"]:.4f}')" ] }, { @@ -349,7 +777,31 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== CATEGORY D: SOFT VOTING ENSEMBLE ===')\nprint('Training Soft Voting Ensemble (RF + XGBoost)...')\n\nrf_clf = RandomForestClassifier(n_estimators=200, class_weight='balanced', random_state=RANDOM_STATE, n_jobs=-1)\nxgb_clf = xgb.XGBClassifier(**best_xgb_params)\n\nvoting_clf = VotingClassifier(\n estimators=[\n ('rf', rf_clf),\n ('xgb', xgb_clf)\n ],\n voting='soft',\n n_jobs=-1\n)\n\nensemble_pipeline = Pipeline(steps=[\n ('preprocessor', preprocessor),\n ('classifier', voting_clf)\n])\nensemble_pipeline.fit(X_train, y_train_enc)\n\nensemble_results = evaluate_model(ensemble_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'Ensemble_SoftVoting')\n\nprint(f'Ensemble val_f1_macro: {ensemble_results[\"val_f1_macro\"]:.4f}')\nprint(f'Ensemble val_accuracy: {ensemble_results[\"val_accuracy\"]:.4f}')" + "print('=== CATEGORY D: SOFT VOTING ENSEMBLE ===')\n", + "print('Training Soft Voting Ensemble (RF + XGBoost)...')\n", + "\n", + "rf_clf = RandomForestClassifier(n_estimators=200, class_weight='balanced', random_state=RANDOM_STATE, n_jobs=-1)\n", + "xgb_clf = xgb.XGBClassifier(**best_xgb_params)\n", + "\n", + "voting_clf = VotingClassifier(\n", + " estimators=[\n", + " ('rf', rf_clf),\n", + " ('xgb', xgb_clf)\n", + " ],\n", + " voting='soft',\n", + " n_jobs=-1\n", + ")\n", + "\n", + "ensemble_pipeline = Pipeline(steps=[\n", + " ('preprocessor', preprocessor),\n", + " ('classifier', voting_clf)\n", + "])\n", + "ensemble_pipeline.fit(X_train, y_train_enc)\n", + "\n", + "ensemble_results = evaluate_model(ensemble_pipeline, X_train, y_train_enc, X_val, y_val_enc, le_target, 'Ensemble_SoftVoting')\n", + "\n", + "print(f'Ensemble val_f1_macro: {ensemble_results[\"val_f1_macro\"]:.4f}')\n", + "print(f'Ensemble val_accuracy: {ensemble_results[\"val_accuracy\"]:.4f}')" ] }, { @@ -359,7 +811,20 @@ "metadata": {}, "outputs": [], "source": [ - "all_results.append(catA_results)\nall_results.append(ensemble_results)\nresults_df = pd.DataFrame(all_results)\n\nprint('\\n=== PERSONALISED IMPROVEMENT SUMMARY ===')\nprint(results_df[['model', 'val_f1_macro', 'val_accuracy']].round(4).to_string(index=False))\n\nresults_df.to_csv(\n os.path.join(OUTPUT_DIR, 'tables', 'personalised_improvement_summary.csv'), index=False)\n\nimprove_A = catA_results['val_f1_macro'] - tuned_results['val_f1_macro']\nimprove_D = ensemble_results['val_f1_macro'] - tuned_results['val_f1_macro']\nprint(f'\\nCategory A improvement (vs Tuned): +{improve_A:.4f}')\nprint(f'Category D improvement (vs Tuned): +{improve_D:.4f}')" + "all_results.append(catA_results)\n", + "all_results.append(ensemble_results)\n", + "results_df = pd.DataFrame(all_results)\n", + "\n", + "print('\\n=== PERSONALISED IMPROVEMENT SUMMARY ===')\n", + "print(results_df[['model', 'val_f1_macro', 'val_accuracy']].round(4).to_string(index=False))\n", + "\n", + "results_df.to_csv(\n", + " os.path.join(OUTPUT_DIR, 'tables', 'personalised_improvement_summary.csv'), index=False)\n", + "\n", + "improve_A = catA_results['val_f1_macro'] - tuned_results['val_f1_macro']\n", + "improve_D = ensemble_results['val_f1_macro'] - tuned_results['val_f1_macro']\n", + "print(f'\\nCategory A improvement (vs Tuned): +{improve_A:.4f}')\n", + "print(f'Category D improvement (vs Tuned): +{improve_D:.4f}')" ] }, { @@ -377,7 +842,58 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== K-MEANS & GMM CLUSTERING ===')\n\npreprocessor_eval = ColumnTransformer(\n transformers=[\n ('num', numeric_transformer, NUMERIC_FEATURES),\n ('cat', categorical_transformer, CATEGORICAL_FEATURES)\n ],\n remainder='drop'\n)\n\nX_train_scaled = preprocessor_eval.fit_transform(X_train)\nprint(f'Scaled training data shape: {X_train_scaled.shape}')\n\npca = PCA(n_components=2, random_state=RANDOM_STATE)\nX_train_pca = pca.fit_transform(X_train_scaled)\nprint(f'PCA explained variance: {pca.explained_variance_ratio_.sum():.4f}')\n\nk_range = range(2, 9)\nkmeans_results = []\ngmm_results = []\n\nfor k in k_range:\n print(f' Running k={k}...')\n \n km = KMeans(n_clusters=k, random_state=RANDOM_STATE, n_init=10)\n km_labels = km.fit_predict(X_train_scaled)\n sil_km = silhouette_score(X_train_scaled, km_labels)\n \n gmm_model = GaussianMixture(n_components=k, random_state=RANDOM_STATE, n_init=5)\n gmm_labels = gmm_model.fit_predict(X_train_scaled)\n sil_gmm = silhouette_score(X_train_scaled, gmm_labels)\n \n kmeans_results.append({\n 'k': k,\n 'inertia': km.inertia_,\n 'silhouette_x': sil_km\n })\n gmm_results.append({\n 'k': k,\n 'log_likelihood': gmm_model.score(X_train_scaled) * X_train_scaled.shape[0],\n 'bic': gmm_model.bic(X_train_scaled),\n 'aic': gmm_model.aic(X_train_scaled),\n 'silhouette_y': sil_gmm\n })\n\nkm_df = pd.DataFrame(kmeans_results)\ngmm_df = pd.DataFrame(gmm_results)\ncluster_df = km_df.merge(gmm_df, on='k')\nprint('\\n=== CLUSTERING COMPARISON ===')\nprint(cluster_df.round(4).to_string(index=False))\n\ncluster_df.to_csv(os.path.join(OUTPUT_DIR, 'tables', 'clustering_comparison.csv'), index=False)" + "print('=== K-MEANS & GMM CLUSTERING ===')\n", + "\n", + "preprocessor_eval = ColumnTransformer(\n", + " transformers=[\n", + " ('num', numeric_transformer, NUMERIC_FEATURES),\n", + " ('cat', categorical_transformer, CATEGORICAL_FEATURES)\n", + " ],\n", + " remainder='drop'\n", + ")\n", + "\n", + "X_train_scaled = preprocessor_eval.fit_transform(X_train)\n", + "print(f'Scaled training data shape: {X_train_scaled.shape}')\n", + "\n", + "pca = PCA(n_components=2, random_state=RANDOM_STATE)\n", + "X_train_pca = pca.fit_transform(X_train_scaled)\n", + "print(f'PCA explained variance: {pca.explained_variance_ratio_.sum():.4f}')\n", + "\n", + "k_range = range(2, 9)\n", + "kmeans_results = []\n", + "gmm_results = []\n", + "\n", + "for k in k_range:\n", + " print(f' Running k={k}...')\n", + " \n", + " km = KMeans(n_clusters=k, random_state=RANDOM_STATE, n_init=10)\n", + " km_labels = km.fit_predict(X_train_scaled)\n", + " sil_km = silhouette_score(X_train_scaled, km_labels)\n", + " \n", + " gmm_model = GaussianMixture(n_components=k, random_state=RANDOM_STATE, n_init=5)\n", + " gmm_labels = gmm_model.fit_predict(X_train_scaled)\n", + " sil_gmm = silhouette_score(X_train_scaled, gmm_labels)\n", + " \n", + " kmeans_results.append({\n", + " 'k': k,\n", + " 'inertia': km.inertia_,\n", + " 'silhouette_x': sil_km\n", + " })\n", + " gmm_results.append({\n", + " 'k': k,\n", + " 'log_likelihood': gmm_model.score(X_train_scaled) * X_train_scaled.shape[0],\n", + " 'bic': gmm_model.bic(X_train_scaled),\n", + " 'aic': gmm_model.aic(X_train_scaled),\n", + " 'silhouette_y': sil_gmm\n", + " })\n", + "\n", + "km_df = pd.DataFrame(kmeans_results)\n", + "gmm_df = pd.DataFrame(gmm_results)\n", + "cluster_df = km_df.merge(gmm_df, on='k')\n", + "print('\\n=== CLUSTERING COMPARISON ===')\n", + "print(cluster_df.round(4).to_string(index=False))\n", + "\n", + "cluster_df.to_csv(os.path.join(OUTPUT_DIR, 'tables', 'clustering_comparison.csv'), index=False)" ] }, { @@ -387,7 +903,33 @@ "metadata": {}, "outputs": [], "source": [ - "fig, axes = plt.subplots(1, 3, figsize=(15, 4))\n\naxes[0].plot(cluster_df['k'], cluster_df['inertia'], 'bo-', label='K-Means Inertia', linewidth=2)\naxes[0].set_xlabel('k')\naxes[0].set_ylabel('Inertia')\naxes[0].set_title('K-Means: Elbow Method')\naxes[0].grid(True)\n\naxes[1].plot(cluster_df['k'], cluster_df['bic'], 'g^-', label='BIC', linewidth=2)\naxes[1].plot(cluster_df['k'], cluster_df['aic'], 'rs--', label='AIC', linewidth=2)\naxes[1].set_xlabel('k')\naxes[1].set_ylabel('Score')\naxes[1].set_title('GMM: BIC & AIC (lower is better)')\naxes[1].legend()\naxes[1].grid(True)\n\naxes[2].plot(cluster_df['k'], cluster_df['silhouette_x'], 'bo-', label='K-Means', linewidth=2)\naxes[2].plot(cluster_df['k'], cluster_df['silhouette_y'], 'g^-', label='GMM', linewidth=2)\naxes[2].set_xlabel('k')\naxes[2].set_ylabel('Silhouette Score')\naxes[2].set_title('Silhouette Score Comparison (higher is better)')\naxes[2].legend()\naxes[2].grid(True)\n\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'clustering_comparison.png'), dpi=150)\nplt.show()" + "fig, axes = plt.subplots(1, 3, figsize=(15, 4))\n", + "\n", + "axes[0].plot(cluster_df['k'], cluster_df['inertia'], 'bo-', label='K-Means Inertia', linewidth=2)\n", + "axes[0].set_xlabel('k')\n", + "axes[0].set_ylabel('Inertia')\n", + "axes[0].set_title('K-Means: Elbow Method')\n", + "axes[0].grid(True)\n", + "\n", + "axes[1].plot(cluster_df['k'], cluster_df['bic'], 'g^-', label='BIC', linewidth=2)\n", + "axes[1].plot(cluster_df['k'], cluster_df['aic'], 'rs--', label='AIC', linewidth=2)\n", + "axes[1].set_xlabel('k')\n", + "axes[1].set_ylabel('Score')\n", + "axes[1].set_title('GMM: BIC & AIC (lower is better)')\n", + "axes[1].legend()\n", + "axes[1].grid(True)\n", + "\n", + "axes[2].plot(cluster_df['k'], cluster_df['silhouette_x'], 'bo-', label='K-Means', linewidth=2)\n", + "axes[2].plot(cluster_df['k'], cluster_df['silhouette_y'], 'g^-', label='GMM', linewidth=2)\n", + "axes[2].set_xlabel('k')\n", + "axes[2].set_ylabel('Silhouette Score')\n", + "axes[2].set_title('Silhouette Score Comparison (higher is better)')\n", + "axes[2].legend()\n", + "axes[2].grid(True)\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'clustering_comparison.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -397,7 +939,22 @@ "metadata": {}, "outputs": [], "source": [ - "best_k = cluster_df.loc[cluster_df['silhouette_x'].idxmax(), 'k']\nprint(f'Best K for K-Means (by silhouette): {best_k}')\n\nkm_best = KMeans(n_clusters=int(best_k), random_state=RANDOM_STATE, n_init=10)\nkm_best_labels = km_best.fit_predict(X_train_scaled)\n\nfig, ax = plt.subplots(figsize=(8, 6))\nscatter = ax.scatter(X_train_pca[:, 0], X_train_pca[:, 1],\n c=km_best_labels, cmap='viridis', alpha=0.5, s=10)\nax.set_xlabel('PC1')\nax.set_ylabel('PC2')\nax.set_title(f'K-Means Clustering (k={best_k}) - PCA Visualization')\nplt.colorbar(scatter, ax=ax, label='Cluster')\nplt.tight_layout()\nplt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'clustering_visualization.png'), dpi=150)\nplt.show()" + "best_k = cluster_df.loc[cluster_df['silhouette_x'].idxmax(), 'k']\n", + "print(f'Best K for K-Means (by silhouette): {best_k}')\n", + "\n", + "km_best = KMeans(n_clusters=int(best_k), random_state=RANDOM_STATE, n_init=10)\n", + "km_best_labels = km_best.fit_predict(X_train_scaled)\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 6))\n", + "scatter = ax.scatter(X_train_pca[:, 0], X_train_pca[:, 1],\n", + " c=km_best_labels, cmap='viridis', alpha=0.5, s=10)\n", + "ax.set_xlabel('PC1')\n", + "ax.set_ylabel('PC2')\n", + "ax.set_title(f'K-Means Clustering (k={best_k}) - PCA Visualization')\n", + "plt.colorbar(scatter, ax=ax, label='Cluster')\n", + "plt.tight_layout()\n", + "plt.savefig(os.path.join(OUTPUT_DIR, 'figures', 'clustering_visualization.png'), dpi=150)\n", + "plt.show()" ] }, { @@ -415,7 +972,28 @@ "metadata": {}, "outputs": [], "source": [ - "print('=== FINAL MODEL SELECTION ===')\nprint('Based on val_f1_macro (primary metric):')\nfinal_model_name = results_df.loc[results_df['val_f1_macro'].idxmax(), 'model']\nprint(f'Selected model: {final_model_name} (val_f1_macro = {results_df[\"val_f1_macro\"].max():.4f})')\n\nif final_model_name == 'XGB_CatA_MissingHandling':\n final_pipeline = catA_pipeline\n X_test_final = X_test_A\nelif final_model_name == 'Ensemble_SoftVoting':\n final_pipeline = ensemble_pipeline\n X_test_final = X_test\nelse:\n final_pipeline = tuned_xgb_pipeline\n X_test_final = X_test\n\ny_val_final_pred = final_pipeline.predict(X_test_final if final_model_name == 'XGBoost_Tuned' else X_test)\ny_val_final_decoded = le_target.inverse_transform(y_val_final_pred)\n\nplot_confusion_matrix(final_pipeline, X_val_A if final_model_name == 'XGB_CatA_MissingHandling' else X_val,\n y_val_enc, le_target,\n f'Final Model: {final_model_name} - Confusion Matrix',\n os.path.join(OUTPUT_DIR, 'figures', 'final_model_confusion_matrix.png'))" + "print('=== FINAL MODEL SELECTION ===')\n", + "print('Based on val_f1_macro (primary metric):')\n", + "final_model_name = results_df.loc[results_df['val_f1_macro'].idxmax(), 'model']\n", + "print(f'Selected model: {final_model_name} (val_f1_macro = {results_df[\"val_f1_macro\"].max():.4f})')\n", + "\n", + "if final_model_name == 'XGB_CatA_MissingHandling':\n", + " final_pipeline = catA_pipeline\n", + " X_test_final = X_test_A\n", + "elif final_model_name == 'Ensemble_SoftVoting':\n", + " final_pipeline = ensemble_pipeline\n", + " X_test_final = X_test\n", + "else:\n", + " final_pipeline = tuned_xgb_pipeline\n", + " X_test_final = X_test\n", + "\n", + "y_val_final_pred = final_pipeline.predict(X_test_final if final_model_name == 'XGBoost_Tuned' else X_test)\n", + "y_val_final_decoded = le_target.inverse_transform(y_val_final_pred)\n", + "\n", + "plot_confusion_matrix(final_pipeline, X_val_A if final_model_name == 'XGB_CatA_MissingHandling' else X_val,\n", + " y_val_enc, le_target,\n", + " f'Final Model: {final_model_name} - Confusion Matrix',\n", + " os.path.join(OUTPUT_DIR, 'figures', 'final_model_confusion_matrix.png'))" ] }, { @@ -425,7 +1003,9 @@ "metadata": {}, "outputs": [], "source": [ - "print('\\n=== FINAL CLASSIFICATION REPORT (VAL) ===')\ny_val_pred_final = final_pipeline.predict(X_val_A if final_model_name == 'XGB_CatA_MissingHandling' else X_val)\nprint(classification_report(y_val_enc, y_val_pred_final, target_names=le_target.classes_))" + "print('\\n=== FINAL CLASSIFICATION REPORT (VAL) ===')\n", + "y_val_pred_final = final_pipeline.predict(X_val_A if final_model_name == 'XGB_CatA_MissingHandling' else X_val)\n", + "print(classification_report(y_val_enc, y_val_pred_final, target_names=le_target.classes_))" ] }, { @@ -435,7 +1015,34 @@ "metadata": {}, "outputs": [], "source": [ - "STUDENT_ID = '1234560'\n\nif final_model_name == 'XGB_CatA_MissingHandling':\n y_test_pred = final_pipeline.predict(X_test_A)\nelif final_model_name == 'Ensemble_SoftVoting':\n y_test_pred = final_pipeline.predict(X_test)\nelse:\n y_test_pred = final_pipeline.predict(X_test)\n\ny_test_labels = le_target.inverse_transform(y_test_pred)\n\nsubmission_df = pd.DataFrame({\n 'applicant_id': test_df['applicant_id'],\n 'customer_key': test_df['customer_key'],\n 'premium_risk': y_test_labels\n})\n\nprint('=== SUBMISSION CSV VALIDATION ===')\nprint(f'Shape: {submission_df.shape}')\nprint(f'Columns: {list(submission_df.columns)}')\nprint(submission_df.head())\n\nprint('\\nPrediction counts:')\nprint(submission_df['premium_risk'].value_counts())\n\ncsv_path = os.path.join(OUTPUT_DIR, 'predictions', f'test_result_{STUDENT_ID}.csv')\nsubmission_df.to_csv(csv_path, index=False)\nprint(f'\\n*** CSV saved to: {csv_path} ***')" + "STUDENT_ID = '1234560'\n", + "\n", + "if final_model_name == 'XGB_CatA_MissingHandling':\n", + " y_test_pred = final_pipeline.predict(X_test_A)\n", + "elif final_model_name == 'Ensemble_SoftVoting':\n", + " y_test_pred = final_pipeline.predict(X_test)\n", + "else:\n", + " y_test_pred = final_pipeline.predict(X_test)\n", + "\n", + "y_test_labels = le_target.inverse_transform(y_test_pred)\n", + "\n", + "submission_df = pd.DataFrame({\n", + " 'applicant_id': test_df['applicant_id'],\n", + " 'customer_key': test_df['customer_key'],\n", + " 'premium_risk': y_test_labels\n", + "})\n", + "\n", + "print('=== SUBMISSION CSV VALIDATION ===')\n", + "print(f'Shape: {submission_df.shape}')\n", + "print(f'Columns: {list(submission_df.columns)}')\n", + "print(submission_df.head())\n", + "\n", + "print('\\nPrediction counts:')\n", + "print(submission_df['premium_risk'].value_counts())\n", + "\n", + "csv_path = os.path.join(OUTPUT_DIR, 'predictions', f'test_result_{STUDENT_ID}.csv')\n", + "submission_df.to_csv(csv_path, index=False)\n", + "print(f'\\n*** CSV saved to: {csv_path} ***')" ] } ], @@ -452,4 +1059,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/强化学习个人课程作业报告/outputs/figures/baseline_confusion_matrix.png b/强化学习个人课程作业报告/outputs/figures/baseline_confusion_matrix.png index ecc055f0599a5beef25849c2fecd105012b67e39..ed93551ffec8c1bf8a81d1dc51f3620e5c120cc3 100644 GIT binary patch literal 53004 zcmd?RcT`hrw}%@*L_xp;q98@tDjlUNNL708O^QP30i^dXs0fGp>oO}1@1K%sPRO} zI51}uOBcwpMC|{Qs<_%onp0`#<0~jKG(Hp3%k&CAgP2Qrvp3T__q!@W@D`uIRsCLS zO;*--b0P7HJiks3=N`OB-Sn7=(~cwbJ7K{AP67T%$CV!sR}!@}G&Jr5w+4=$@}CUB zr|$$Dk!IZOycLO{joH>K&cU*ekmA;)4%(-%+Y@iP!FbQcb$C<`JX2V|8+Tgnz}Gbg$d0)gxDK=ZCly z7|DWZa!G}X+Rjgh7(F`)Svr#2?l{~=O?HNm+;y_k(j3&d!zoag1p_G8*o)qDvul zpWt<4A06$E5mBPu)5`evp5EW`@l7L`enyw!?gUQS51!zD(-a8T8qK z*~Q7nESpidpRa7xbq^AKBFJmyp(lB=Uh|Q%BV(g%Y3SJs(P&xdy?kcNh;?dpNB@kbA$05{ zK`<=?w2K~{d!``^FWH#L9n|pPJy*mg9OeG~{p~HBq}!w~`Ytd;e6DwqWsC8!-CnaG$=HkUT_w zbj)TOnnKtq#wmS{XC5Mvs3LiIB58SS*ZNzL+@IFQD^mqGhLwI#H`qhSyK7tVOB#1` zS@xTYw(HF^%5M4_ho^AgzD94OQUuS578-cnQWu=`aQRw>Qkh~7{Arp}<^0Y#x)Bpb&=*mtQ}KzbDjoZ{X{OpM$Hv0 zIszLIy6Wm)I0b=bQcS^NXVud-xFE{d6!Z4F_^jtUXCeWYZz@tjP=j7sj(3h=^S*U% z;~WUCeEw!6b-;k+R0&qZz0{zD?6ez4#^7+AM_S#EJZW0iTJj%8kK=BVsf+$qQJkcSa-^)o>foWrLkcIGn&k2L z&HB$wvgdrxfxgjG0RywvrZd>I_UXd_D=-)6P`Ii0aC-^G;A`WxYS8@ztp8e*78(RK zk%A(>rr|dXt{370J8R!uEmgdw!1oSatd{IfSAR$Q!+dQBadQp+69l47?tTXf?cGqh zw05C=itr0qmVKO5B;RDS!(1IC_O?b=4P8fJ28^E#*1M5vyD`3V9YM7g9%wkY#-Lc$ zf3u;#-G+BW^%&jgl-x<#LJ*fSY}?CvvTT;ltv7p5S~#_hR+%TR|4Mwin)p|VLGw6= zcB$pMT*(lO#3AAQj^S9P*hOJ~o+jf(0sMS!*rb#EpD$OiP9hd?hxFp#oIfu85i?Zy z&^i~4+S4#vOAfwY8IU+w;`UGyG9$6Ro26PD;1VpUGAT3l%3(db*!}HXX9(i*Utp@Z zbTC+wzOdycC&*2%)}pa*4+1kReG{USIGE8OaeGlcf?Y*qQQaGT{iQzGNT8KdA-sd( z2EVK#=2<)w=j`_IUhl;jW6Q*{;>3!wp`y9RtrZdR&Xjl2SCNAwkNCbBbccr_meQ@N-KJ{qqr01RS+qxj zjaA>-Xzf&9>h+z6ZSrtFP$P#vL?^*z=?jsvxNr)@>}Q)hTCDZ$ZfD_?ENRw<*W+%( z;nsJ8jlrCMdC;Ioiy@{3f+gj(P$j-&PwKKCC#mzYS4E@~?;k;iiDiTY^$l^~lZk-1 zX!p7s_Q zE{gG;a-M=^oqR%?k?!|#4guNXi>@4F0n01-5nC;8cs85m(aQ3?bsOoY??$q12|liQ zHX(RP3NQuTKgTh;;Lw&s5L`*(Jp7}cHi?M_g<{z1~>|QABXD`n5}nt_u5wSP;i2Q(umVI zc@`1i*-r6OtWBWyF|!TxYrj0MPaj+{J|Kv?RO87xzSd)-K=ye|pyZz%-ZjEqrcLu5 ziP}6^$tS3)CV-Q36;2Mv!sfg%g-qXk=L089%+TG(d!i`M8K*}wk@RXiB|kn4FA=~N z>qSd}i;2?hcIpoV{_c&&PmQ-Otup0uN) zZNDzFJv~=?Fs>3cCOsGUIjp;)cfWT!$#=L$QL`^)Z1=#|0A#Gh(&^Epoj)5+x^W@( zuAVLe4<2{O$O=#^Du^N5uTk!&oxP`Duf!JS>Du;WW(z!+^RQOIZ1t5lnQM$#kPuBP z;PPmi94I3Ucx^&=c+N-tp&VNb==bp zjva+hswmkBTZM7QQgTx`(FgJ(m@FUD=iBP8J;n;I_J4{?P9SiUsd$Zd<=8h(StE` zK<3hkmH8)s+4zd+q7pTG$OQAO+u$)uYIq$U!2Lh4q}eJClfjDJ*fm0V`oX5kgw}+ zbPcao%&__F_O9;8obJyYm8}iQ6THqJSc+dA)e`lyxHx0e+@+e#g(n)(ZZrwUC;k3_ z!Se}Pdaw_eV6v7qaOGtAai=kFGpX!odwS)yP8Ob|y?~+Kf(zUR%O=&-zio^H3C&Qd zVs}YkJmN+J-cxf~2F$SS5!8FH(GE7(xMD_e9KyV`!Of#Zs{e2@+LV7_@l@>6p7C@G7` z2$mA~T|PBIs;6#U(B0)z4;<5xZnLXN$Bn3QxeJc~!9il-(w zT*CzHGEENbOfmac^d6;L?HCo?YvB;~!Jm-3jJ)(vHaJ?#lcH*Ah*}ogk?>9ntuVsN z;-y7c{>$Q}N}S>mdC%wW6_$OozWi{S*IjHKip}9>DwbTJc@BQiJLV+Wt&eHIC@H-W zwmZTf0Z8XE6rfxT`;s`by#Zm@zOuI6$Ke?pRzpQ|_G7*SB;^#6c3$qU&!FN^=otdJvBvn)6c==;&RkmJLHXXU`P`^U;o0D&?pC*?J- z7|@-rR*@fZ{1B2gQmhuAtD0e?`|viHLd0jz?H~o~v_l2~S^aLS;m=}!xf~G)I%0F3 zYGPU-nD&*`=H~+;5n<^$Gk}`aJoUM|!1}6T(d2AUwo+}|EnjL@XS4MXSftf0K6*Wy z-YfGv0aUa@RyZKaJ!CxP^MjT%eUowi7>G;q%h4TQTU5HRk!hVx?wVh7nE(3tcexcf zN(8kVSVFo2p_^Nrkyo|`MBmmipu@{U|9oZ3EVFL&1|w6{xYqJ~KApc?a^ry)&+T%G zYac{nyw)0Fm@Z{9=cl&n{D|W+=f(Q|#8h5{L`T?QG z_ogXM`Ov`Wl@37TUur!XJ~G?zL#FX(mYr;)M91=cfH4UUo~6v4ZxxO6@LcFpfCF!T zvJ8ClZf2R5rl#h@l^mbh#Zzg2!Xypp3&R5;o^FUX>h29;J;KA8{96Ncb0k25zHOh) z5B&K$EoZxIVjFtjzOMw^>hS%&_K=>gu79`n?*5n8SBj5?aUDTEGoBalR)r{GU)(0H zJ7Olp@sRUMJ3h9yF(*79e3(;s41`0aa^ZmYY^O-nmFERlA?g4@!oRaTkN{_)>fv_& z$pi!hKbi;o96MGol#22BI+~_2rZ%v}^4Y69-GE*y6i-^uzoP3L7d?0`#8`C^%Bi}J zE+UzzzFofCr0^0Rn1;TM{QY{|R;yFJ|pnra) z!401{^-sX~cp>>STyYn!zfXri&5)sg*qKf{1cOS+!4~G5+9g_FIzc|nVZX>VsbWaDnsQuzre{}#rRjj6ax#xkMb5sAw#{) z&EWu@2SM0w=B8|x^SX&Ed+iWZ%rnh;5xf_OV{IUB zJ-nu@W%yVevZI_SX5+~NCh;|j+yGw;IvO^HbC6r_q{02umQqvTsU1Hu-Y)qc2*dCu zm{?@PUVu`jzQE(5L0rJz;uT>w;e0P+`sxdh4NRYvOikhzyq5fsJVau?xsWuNCx{XW zKPPT@Cu=G~a5nftX_(@5eWb(KF}sMpZszC0u%TNJ=^(%hzk#2H4)7zHOzt#_QFn4B zBRjT(ov9-80UtciAYi6{QP5uFUAW?Uq`6!`(Vmc@;^!;mMRO{C$@i>B=0*nwecVF= zFGhQtg8#%4CC}pZgx3cTfG1>cTN-WT=vSJTEUy(N20dn8?Xcl^Z}Qnn6jUI_ zNXvMr4Aw8&yDDP7XrTXvmN>Fp}gw3i|lG~GImRO!}7f;(56J4Q2x@p?zz zPnP1!bNwyzCi9oubh4$MaicblYl29@>Xkxj80$WQD0Gg0wVZ}BOsF`VP6EE4|4`yv znn8_a^Jw(F_19NKKD^5&`%#{Sx$aD15uiYiz+zz6lFgooj|Gj<4K$I`+Iy8X69QB_}YE zeWgr~YLv4zLmJ#3Wb!x!3`cYw$At#UWlH|hu2c?9X*_lMf94&6=e9vZnr8^wgNHG zEK8Ve0(m}RHU6@&tlAb$-(zLL;-gv`j2kTSsJhw|y!ued! zPFXQ^Hq|r5n5-@$e=^*))KjW!HCUZLLl@H}J6^2Q8y@B)Ag)j8XnE+FJ>a5h<$Tu0 z6s5x(7bimS%50#oRkiZ4#5GuY$UH1cr6J=B-|~6dPWUf@!IeXH{x6RmN5b((sw42p zkl3^MG|3!}k**>5<8Ht4Z2eBcI7+7}-z_rdEw3K+zr-!iuDvna(Xd(D%V=#tDk*ml4j5@6S*b9=)!oQ)l-w+KIj@C`uCgwnAIYDfe+UYMD5%9tAf) zQ(wf$$W69?C}Ed@2_nLo4|^yVMpR+jvGQuA{;uI0P^UFT=^6jR`48||-})45nVvCc zDE-gCfjqy9umshtF_|%oK*&&=oKaqi>Zk3%CA9;k%(DyB4g#%zR7;G`7E>Dw(7a*! zf*g>#cG@4Ju$Z+?ckU4;;`4?G!E3b;Z6zVjG*=Get2rVwYJS7D+jqhFv1jdf>}8Rt z@GA*~ylQ8Kok_?8%Q7^&i*?$lUI{!jBhB(8A^kp-)8;$Of%T9f?9nV7b?q05FP%4a zIZgMMbJHWy&*~dbXjoT^z!e4WHOJwy&Wfw@X%qe#6H)>78QI|h&Mf-)R^%r`MZIx% zo9_E8)89QZ;TbAbhW_Bvmy{6p1dxGEv{_+hJGpBc*|gX8xKV(rhXCZ2`MhMjOzSx6 z=+c?qKc+EfFH}1+PZPcve6jE?EqJ6Nty(GOY-U^>)6oL#n2BDWf5Nt|+%7YtudeZ% zK>TR3%%0L8%`oLghVkONFn1okriFFzyj>9#%C)}>RBuU4Bum}a0mBd8Fsf__&RRcP+1 z7KHWO&Q>kvcRW`t3;b6MFi9=vAqnlP_h}Ju`U}er*$laL(HDNcJUh-(Z#1t#$!F_9 zY8({wGyIMp{r>Ps)j$-P#3|b@q(l2-`_@&I&ISh6wcSNw;UkTCfekhvo*y+G;m}TupYsURlj$j37 z;d+tK4M?MangK6l@9RiZZp-c5r6D&(ao=3m@W&zioZ3Jpw0onjRET{~*YNz)k4n@X z)lzu-HuP~?Zb{gE3Bfx#)m%fGLL^VlY9_8n)7BE8-qXY$wIThPRUC3%|EzQ0&2{@W z&LB*fE|KH4DbuGoEo2q0IH@{# zh~qk_?iCq4_G7$UkRV^zB1vo8ti9K2N|g)9v?ut|^glZrezzFm?_abXfV0Ou&(qfL zS}CF($dBgyq1bIDVQJC8QhEECev_okh8zsXUj;mCzmkG&`Fmc~^FS@Z&LKUp{64HhaN@b&X5e_!{uxQ_p0f%v|_iQyu|Gu!mutvcn_$91zp zH)@b;+b`hpF0#l-G+e*TNJ?ZuH&M~t;fbvH}H0|8_iHF zKv}Uq(eF!(HYsFrR#=F=GJEc=z`%CbkaD-xw!Q53S&3n9l)$T{FdHzp%ElCn7JYg} zw?&DTe`8(8v5HMwYfJv-R=?#ky-g4fIw!`!88ymrhWGt2=AGtk|RB}Oje?Wcl1%{o8mbVFM$qU{XG%T(Q0y)k7Ujf z`B)WZsLJk2tQI!nWvuE9dX$;piyudNV%wV$oR($RWI|h*-rpKgYS*Ok?FlAyk{l5% z{0e*@S2%C*A%teUu)vt?kOLC0wUurk6`v^mQ7szvP9zpv(ml7?SsFIzR#uBP^b)&F ztLCE#zU|smBR-iDOVs%uXqTIP`C{V5C7p6OT)pe$IE3w^e!8(xaA|BYjkV_)Sz7Nj zC^V%N$M^d(q}xDW6@$YD;Bx&hUTZ&=2x}V3&fa75koQ4EC=jRZYZX33ue-)_B~csB z@mwmz2?t@5ity6()rnkkGCy~GBaeZQ^dm+9g7nBt%jYvv?aX?Dl9xsE0y%`^N62)B z0T2-$&EorZGG`8B+N7t-UU^@kBC7T7D6tHpjZRtMgsLZ$`eP`@3ar(Y$^&nPwR(*4Gha;6^3-yN*z>$y78C_+ak@mJ5@|fQ}YgB>LTB zuMnI+0rD4Z7=c`4|J<|9e^k}RyHcjAO+gQ?{mUaL8Z)0yX4-sIn3%(xd+9Xj8Ko6a z7BBF;uH8R-?ts| zM%_x_T=4GdLapDs)x;ke2F}B`eM2sbn!igeocGiJMe8>%t`Sw`we)Zu!t44CMuR#m zx-)Ep;&N)}Y8mIf=tKH0R#W8awrY*ha>Ari ziDJIkL2dUjxoMLZ&kf`@v|4Qid`7IC=yl_Y30Fk-%QthKimrPEz)tBfI2fM zT#Z=>bfBp)_X$eoLnzZ3(Tj8(5iu@ndr0kJeH<6(Ux7!r(`pL2Es#0GRPe!2z+X-7 zDV}Gw^fzwxux7hxq`(YKs?b&`{$0`kI{e3)ol4Y&z3yS=_P26jyD_>hMDj=-W<8^D zYRp2bvwImUt7x{C%FT4nFS6i0XaL6aPV!Tc*l=2JnOz~%q+iQZx)tP|>r(FKW#T<# z0~q+uY0Ax;bAD7T_*aS=d~X)xfe;pUuJkq-hzaKBFDPBA5)!0^HFfy)tS35`IqqF= z+)0}#R(vy=O&y#yhjJcK%3^x*nAyLP!}rGN228rEC8werW|&xkSK6ss+M+d;@m+n# z|E^?Zt;c9+P$RTku`#mL{ zuO`PUk~q`0MAG%Nk&1%}nc?0K#MYf51sv^y@9z=BpA}jeNpJ95^SV`GSfn?H#31Up#t)WIHWEb$TFG4@%7LF&wtdtbY06!jH`vg~ z6m6JE`ZNNcXdiAL@ix;Rw%VE*Y?|G(UZIWMv#x+t)ElN39!oi&Op;oI;Xo)hRH}Uo zY`hk}Cp}8aor=*YEhbyNf5ANxUK*~7TsQt42EFGNCcsneS2W*{p;Ek8LKuj_j~nUv zR{CT(v+`Bi9RFu0O@RPaNd z_GFi$d>aNV%{J|2YwsH*W>C?W!|K*UR3oyB!MQ83lL)hLd53TBe3!;%%640AqAbGh zR-Q5J^#c7Cq&5d_L&L`fBHwe$Jg%0%QMmh9Ut!c_tBgj8bASD^Cf%*zB&J(_>C%hI zDxAZD&IR0)^yX{01*T(`dw-C{kLX2K`@6FG1r-ZuK6rs4$allcdJ1Wae4v7*(ox0S z$|)*0=avLDg>lxWh7Xm(4HT{lcjug`cj$?v+Ty`S(Q$b_e($ymf6Mz}&1c%shIiClIUzhQ%5X4MGHBL56CZ@k$scszf z?!8WH>|3LlByxQXadY;#!Y+yW43b6v;w^jCw_*>PhC(n;JV=O+EgXF;pIr%o6-;v2 z6#a#FVo$u^WUFt}TI>vt4eqiryL;}IZ~!Ndo7dYPU^i}JgSK zGJ}G(Db>0TtM5~&hiBs8lmm&1SY2=D2xBkp;{71r1MsZW9to?5HY=h9%hOK~0wD00Q=K`$z=H9ZK7@-WhGgzK%lfC0mEd%^vA_RvRUHMgn zEbkFkpGOO)LY^~0x7)JgX%tlfxQFE&r~5{at{k7QS0IwVyktY;il!1hl)MVk<0sQQ zud3A#-q@f+z%T657(1oxeb%QFBS&o|zA72(ytl?P9B#wSg4+b z+I5<~!lv-OOjhIJ-oh4JVf!#s+U+L!PCFIdN!wG+?puXRi{_&b<$qUtSqRujmYrCc zA{l)gL2tu3Rf;#ygDYKfS3%~P4(n~jVb;B_;0|#4Uk&y8AY}`Ar2MGH1*op8l@Vx& zB3tNJtvy&BEb3xw*!MQN5gBQ8HT}4j??dtCP1>idX9O#*u#&CH@L#jl7^w>gPxj=- zJJw{ypI*;a!!eVet}|9btnY?&K&(*)xXc+(ANG!6Qhk?OGq*FRv%>K9)b_Z1iI67k zB(rK=`K;r!AS$66T+VPyLHB)fSP_m5IX@P@DQpCuaqV11DC4k}QkJU7j$JXey|BV5 z{mRl7+g#rfdn7#y6_5?@NxQiM6nzQ?P`heFrajU(_0H_^ zU9@0?!Fi^`LU%O0_Kfa0Or3G)GcCVK?XSJb?;1nw!0lLc(=JkjsMVC1!P~DiX(syB z!(NT&tIItfuY1x7Y#%+5OJ_L~rQjTED9K_fdVMd~Fta=h=T;)(Y5Z^xW+>Y6^J@a) zQq#8{Y7pq0Jg}HX_KfgF&_Azy=JA*7@9In6;j)@{n7C-`nvT=>*JREDkz@1+*5vCyK_j+Pon; zkM;DMj_CmI^ykl?Nnod?M=1Fv1KSJ`TMT%KM?~cSC7GrSlUJP9Z#4^H*67(5Hb|f&Bm^TJ~~fPv)}8VPD0(o|15VN)jUOy(#mn1 zI|ua0>2XHsX^zFyj_zf;SC_aU=)XS$DLVe!fTyDXI4-iJ;cpiF-J8H~k##`Q`R{Wh z>kR&7VMYCY7ZzonxM}#m=)ifm|K%EQm0v~PqG9;^o1iXL(0{ki-~9WtsEaF&2Im&( zgU?>%37`4rN|D4}jAb}Y(gSg!xe8lc~j|JVg+X`cK0P0qzWh)7iab}#nT zO@;q9(4GJL<^Fj%r3KiXEyc}xFwNi3_5X$@|NCW}eO?f+w}Lb&we}h@5ULGP+(M1y%YV9J$aA*CiNQt*!$%fAa6i`HvN-Zw~$p zg+?uv2Pr*M`}hC;kEu)j$@cdDYc$Y9fh}OnDIPkIE!_&Z1inq5%U7;IzP!3L34lRv zKstsq=vRvW!BPe$02ju#*9@?j&za@-3-&hAV>(mKZe|ETKe|s=TNspEbp|(|qKg2( z8X#>A@LQXcR-Vl&30Ifa8gH@wGtl)bI)Heci1F-J2@M5k5Px7>8}luN7qWzePByt1 z37S-;>12w11@3vEp=kM$kX zNzchS1;rH;d4PNZ5!9c9Y1!N zaDiQ32iuxd8S{_%uH=Q(B94KasQXZ!TxOY3q@caN&Qd(EBcFtj3qRa{8s=DX>t7N; z@#2@#v)YH=ul=qUW>s{P*I@u|O=I?+4IebxVBcS#3@{Q{*Qr{(hu|Vo+-Lbm#aOe; zSRa(Ts()g(%?BGs$8@9qq0jP@+}g+SOk2SKuiXN4x_g+Z!+*K7{VcIO4+LHcfan|I zxq|s>v_)?~cQiVK_ioAeGuR1Rw@V0LEOjJ|lxYEsY_BK)X1+$)0I3d3DbtcQ<4@)# z>M6d2_?-XpSD`v`l`MyCzus$&ie=pzS&h0}dtun9P?Y&<&CX%klsk; zMw@|A={nM!-nGsmW&c{tY!YJ)efCb#Pj*RHhbdbC78xRm72T2y z$^aBwd5DLz9&A>3MeZu3{mYjxLMz-0DgP|Xp)M&C7aFaagB||PdTn6l6lNo#!*cw4k`ClkC5U^j!m98c`E=n zZC{fRD4Z&g8>Il;f8YDm)G?j-9KbvE+$`5zd+r}hnVGD#p@o@BNq!B$5<8{*)*LzH z+?pX;vl%Yza)g{DzgY=ZE!IY1MCxX8v#k5>50e(J&$X`zCe7Ln<7?|?O~}#&bY2*p z`$AlJ?P!7@l`h9*K~5yzoOu^Q0rX|&)FXSJ<(hgmPuZ!# z&9R4LK9kir*Se0AnlJ@OUX5kzS4ONg%+*4+Aw-tLm)Kxh`h1;v@@;#rPj^VTM5BCA z4-zW;UEs{N%ZdCV;fT_GiAeY&r$PKFdj+5Ry3u`UM#mH$7~Slw|258Lx<5${4sOA@ zt!&9nQbteO!;W+B*1?Nsq+kCjr(&|ECqChL;k7l}Ry(UVGAWPDR1RM7PsvxA? zCademYOE2H07iuOXa($v57&{7I1ZJ@S~%rGUD|=E^wC`adcFl1E%;+8$jmgrH`$3h z4K@MDyF->PNee(~ta}*R9)lQqZZ6elExAvB7p`%CU6dZm^VQT-t7-q^1DH`m$wb}L zeqCpSfh~3tLKxj73&|q-Au-r6EAzGIm19EaCY0tKmWIVFlV&a**fh#0edYtYG6M8i zveI&fO9p>W(CSw2dm?u|)ar6g==U>jwyn_!zE_ezF)9{=KDf`WALm&kr-P4Ax?a$= zrf6q3PRGq2R6%f=&MH3_Yr^pY>1j><>2+vV(N6L2ecJmIsz)SxH}pr-_O%v*x-T6( ztIQfkzGU02e(CZ;)ZzBis}$1KmrnoQ#34+zLWY&{$gRohXN;JpplqF7#Aw+Z5pEr! zA&S^~Z-Wl5qo{@FfP2^5DP*?<-qzx5IhuvQ;-Q&s7q6QY{o}0zK4Y&OD@|Q&d_fT+Q;xFk4^fI;* zZ7PXmZMD*Mc8s48a5~w-jK&?}E?_cpe!`o#)>GL#$Ub=g5a&~6mViFW}6hU=V5|9_IqkC+vdlZjR;2QSk~YC z`H19cH5PXxH4Axx$NzZW4Vrj}GrPoXc5!_@BH6na#+7R|&D)ymHX)GFxQAk!uG+)k zdkqxOyKP$TtJpepMzKfZ&#zZT%W_*ENEToVbXh5OznZJ1dYmY&hm^|Xr@yOAQfG+U zF&P#$uB;I3HZAdhnPD@^tgE?PRi{3whGXV_u3_WDTbcV~+{9z2vFC^9LBF74aNUPX zER@|bJv_jrH3N=laD7Tou2RB((>w$yT$sfJsZKGhFEY=tZwf#NHv!VGr93};rpmbT z`Kc=bnC1!jgI`wwS5ObQ)$;6G+wO28uoZ#^9O@}U)#|@?q_Q z;-_4lpfvM?z4(|un31Wmj9_pQ>ClT5K$w#&+t~&9!@gg8^PYEGsvTK1SsN2&Ni#9F zKlB)EzR%!8@Lfa4O`IV_i-GOi)mDoFTgPLVDY)3zgqdY)4gaCL5oNS>4$E&K#F=C* zEQB`m@|#1S7FZ}+Oa!LIb>OXJ`CGGV-##}?TtU)#0%p=&zhhZx9F3hov@zl*zky#- zy#jV>DfqJZ{n+y5$oY4R&KsWTi@y@2>eTlc6L25n@EvvplUr8lv< zNnuuS1G>`q`~*W9^8tIug9J46RMPb*xFTYZYMo#SQLXz5cvl7M_e9m z3>zLi9$P_Z_M?a(78^)44zG7JuYwL20Egj!8;H?Ge6JeF((3X!I%cp75b4MJ$U@I{snw|Ej1d~!Lxgp_5{ml zbN#ol`7Z3({10iHWGlaF$`E(S<*z4Py??#Phs;2OuFcVI7~;w;Gk<*E^oJOKx8a-~ zX_u`0N$twpXyAB`hmse3#E{(`m}nguEDf{d4`qhsI|=(v^#{0s!J1&Mt#l3KNlE85T zwWXcAO!AuN3@UN}^0Brd@7A=UZs*R1=G23*rO7X^hW;E623zRaq>{QP2^T1bH2lkC zXUSU2KFe`Fdj(PK<`%9|TGH91&>>pz@$842uO{j>T>?5q{whX|RcN{h=3Vr>vQpQY z5n=B7bv2dd%a0$pj2RRm+>LR=wAtz`saf>y$yH*InQdUv-rC3{`{e7{2$8Rbvwq&& zQNEfri-6|$-8ep4Z`WRO?$%|Ew#zCt12_vylvKIY3q1`vdA|V+FF$*J)(^|hSp^Gr zjQ^%@F{4zaWuM2xhRltqQgRzHA?uxiHET1ueOkFn}qWSo)&D5$t+ zdw{unky?-4Zy1$!p&XJB47iHr8d=DCH84cVZf2U&I|`e_@A%My zZpjlBhI2`>Ri%4!Ej1if9E$EFLiX`o_eu8Gp6k*kw+dh3(HWa!%?@~?++=~bO9rbX#9~>D zdatv}Kwh$^#Kxj<>);pj)U~e1o%F=+1lhJ9b?~nVmJ{%=))os|M(H2D``$X%&GgAo zZTA+7CI-+I#|+9(N;(ZPfUW-8((vx|3=Z&2^*?zJ<#6{jbZz^iBHe8#8$cK^ZZ9dA zO!zFSHD$)2IQQs%%u&c#`gp1Z6jk2BaIXCMf#Fs#s>M2!3$gKs*?p(QT58jlrrM_F zo6@}kyDtYq73-%lYX6!7i@-?MN7$u&*MuQ?io5L3SG?8s{YkYRLBL`x<+pAujRmyh zHOZsh_gW$iy16nI2!H%0u*KC36y}X2-iVr)tux}3?Fw?O9L984*Fz$lw2nIdYX0kY z+Gn?qBMjm)#nuo(o2FL?YYF)yZf7v$sQFnr!z)%nc0#lrz0G&xm#`KEO;fhWX>!oA za>!ya|Kvv-NyOT=d{A)BRG)6^3)>;D*1FEsCosbX_p)O%@4$p$;+FW-G{N?fyLcbg zQ*YKUYU8^&WoXGC4G~2+j)9&dB5*m0N3wqiVkbYp-pWUb+6djm`p6Y`?|^7_tMT=;RL-4bFjO4aom{DzERr3l0X#%X(s`95wjTy>Ss@})ijJ?9ftPmVWUZDKS9H{Ys`CiKYz?5Te zN6ZTTB7-5C6W5Vt?du?iDA!{MS&AZJeIp#JiZ4*$eAwcJUA;W$5&?xt=|a>poQ{e#_dk!p~i@ulD`^lek*5LKZ^N zf})c_SE(1!PWgVlFnU&jX`o)kUX3fL1Q7wy>HYvejs|=^t6wl}od{x6Y-(0dsX8r< zC1kBMW0cw)s0(W0k_*03q8AgRa^7fa*V#SHs+?GN;D^3C1ru2O7JG8M%go{Lt!1XU z?{zY{#&xpWD(Ug$bEC|716JeY@S4Zdx}=F}{n4wCX%|u`SR7A>v}s##;t?ekub`LQ5+JX^Xyd0) z)F!t>U=Zi*@qbVqg?KVr;UOuDk7Ximl`A05Zl9@-?6`hRIt~NOYC&<|!j)=XZG^~P z9z%wGMrWsGy|#vbQJ`wT98>Z(oB~c5oy>EypyqzR%OC8Rc}=J_Mt=ef#?%g!T70&C zep=x`1e`Gfb6R%;C=7|sH6RV*3DEluj2vRp3%jSK7(iu0Yw3}dE%|ZWg%_X8fs)2A zWqSE}dl;=c_%dGVW-|FUPiwC8iEV2KpOw)I6S#J2NGttZFU54?Ofh4K_; zQd4CjWIG8q{%Z^E<~Hfs^jzX+*FGB`$TkNMi z1g+ZBuoIo_!dB3k-G@1sZ#t#Yai`n84jD}jjEim#KcF^^NI<_ka^2M)B@c#F$Ykx|0vJs<4h?Pr>kZC9usN1;RmQ~&kH6pE*3f}6z z8<~U0vE>YZnN*qXZiU!nZ#8(A0*VNgF4E$+cXFK%e9|@Utt1zKZ68-9d|f2AMbHky6FMU66oc5Dxn*`0wZJfB_r;09q7|S zjG8H+x|HxVzY55-pd0$Rve#ZDS_T3Yw1{xilpNntjm#~hi>FB+k;u{mC9jH(I%|}p zX_>EUj45sMRS_+@dx=kY6Kc#G2d%{ftlFCpb8WIC)@;I-5;gA50ndN^sIo>}u?E2$ z&WAsuI#}AMWWer?PFPh_mPFM;=YD5&`(+S?U1xRz^3wfJ$OE$YxPJLY6+xpDrW_o_ z3$gt}H~n`20pZ1TL%rb_4c#qyHH$98CiP!apm!0JR%#o;Nl2q4hyRlt$AP}_{`HB9 zcUzs|NA^&^wg=muNEkQyi#18EEb}NtoqX9Iq&Ro6=aW*vS5~u+k%p!NGmY7$dq4)H z%}vrJxx{Z{7i@c--$?KV^a?UhE=Z6tllI~HNv@K3phAUl`v*Cxf;K3>^(b^tj)Hwo z*(5bz%8xJ~@Sf}lzCP9Mx{Ul$Of$)6HXH1(gVp6aewJE;OL1uRdlNucK_8uD#pN`X z5pPRko)CU6U~?Gc_rCK6m{MUQHJG&ZA(*m+BcZb(?pop7gQXCL;Hwu^P*+h9?Bux6 zTd(l!?oX0Np8DlgCbjx~Om3E#stLDcF00lT+14Qxx)%36$0>2AX}@yJYdq{@f5(c0 z?_js;%-c3Ch}}soF+bwviB+q+y(`WBRh@O!P|kfCsOa%z)mLvTZtzLo6?lYMrGB5K zWDR6uL$Z-qR;2a2c*aaLRCcyo&c<{i>hgp;zHB^&KAAA`wQ8!`A->h!UFA*st9_g9 zL7jnb?sN5VP+{v)%Vy{ITg?j!De%?k9y1_;d*M=#a$zfwi}LL)^FpS*exwa&xf{0s zuE2nL0##-D@_l+*Xb)H3JzV(H8*+$R2;SR $AfEQx_EBXK~Y&!)WHWdJutnBMT< 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

?ah&wWA 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

_%vlix2BS%p1U^M3iop66@w6j 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 diff --git a/强化学习个人课程作业报告/outputs/figures/bureau_risk_boxplot.png b/强化学习个人课程作业报告/outputs/figures/bureau_risk_boxplot.png index d3c0c67f2a1247dc788840d5855780b40ebcb0ef..2dc28ad7bebe326e062410b7757ef781350f95a1 100644 GIT binary patch literal 38345 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 literal 38370 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 diff --git a/强化学习个人课程作业报告/outputs/figures/missing_values.png b/强化学习个人课程作业报告/outputs/figures/missing_values.png index 9489b753db3ed88e29e4bb8bdc70a4bea3699641..6f1b218ccfa3d9656fa1db962a381473657184c2 100644 GIT binary patch literal 59972 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 literal 60169 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%0DLj9>li>&wD=WzvHtt3 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 G_J0Gpyj1=G diff --git a/强化学习个人课程作业报告/outputs/figures/target_distribution.png b/强化学习个人课程作业报告/outputs/figures/target_distribution.png index baae2d735a4849f382e01b380b9f6621b2586797..ebb241ea8bc0ce1aeddcb6c77cb7fab978615e0d 100644 GIT binary patch literal 50223 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 literal 50268 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 diff --git a/强化学习个人课程作业报告/outputs/tables/model_comparison_summary.csv b/强化学习个人课程作业报告/outputs/tables/model_comparison_summary.csv index eff42f7..a1d7d6d 100644 --- a/强化学习个人课程作业报告/outputs/tables/model_comparison_summary.csv +++ b/强化学习个人课程作业报告/outputs/tables/model_comparison_summary.csv @@ -1,5 +1,2 @@ -model,train_accuracy,val_accuracy,train_f1_macro,val_f1_macro,val_f1_High,val_f1_Low,val_f1_Standard,train_time -Baseline_LR,0.7593680672268908,0.7341714285714286,0.7492574544185482,0.7237629331592531,0.7665209565440987,0.6489501312335958,0.7558177117000646, -RandomForest,1.0,0.7877333333333333,1.0,0.770789728543472,0.7874554916461244,0.7095334685598377,0.8153802254244543,57.91048526763916 -XGBoost,0.8519529411764706,0.8371047619047619,0.8297116592669606,0.8143842728003406,0.8904623073719283,0.6944039941751612,0.8582865168539325,67.63970804214478 -XGBoost_Tuned,0.9767663865546219,0.8700190476190476,0.9739400525375727,0.8519502714571496,0.9084439578486383,0.7620280474649407,0.8853788090578697,142.65462470054626 +model,train_accuracy,val_accuracy,train_f1_macro,val_f1_macro,val_f1_High,val_f1_Low,val_f1_Standard +Baseline_LR,0.7595294117647059,0.7337904761904762,0.7493991157707756,0.7234383324236036,0.7663239074550129,0.6487372909150542,0.7552537989007436 diff --git a/强化学习个人课程作业报告/run_notebook.py b/强化学习个人课程作业报告/run_notebook.py index 1f249bb..321f413 100644 --- a/强化学习个人课程作业报告/run_notebook.py +++ b/强化学习个人课程作业报告/run_notebook.py @@ -1,16 +1,19 @@ -""" -运行 insurance_premium_risk.ipynb 的脚本 -将 notebook 代码单元格提取出来逐个执行 -""" -import json, sys, os, warnings, traceback, time +import warnings -warnings.filterwarnings('ignore') +warnings.filterwarnings("ignore") import matplotlib -matplotlib.use('Agg') + +matplotlib.use("Agg") import matplotlib.pyplot as _real_mpl_plt + _real_mpl_plt.show = lambda *a, **kw: None +import os +import sys +import time +import json +import traceback import numpy as np import pandas as pd import matplotlib.pyplot as plt @@ -32,34 +35,18 @@ import xgboost as xgb import optuna optuna.logging.set_verbosity(optuna.logging.WARNING) -RANDOM_STATE = 42 -np.random.seed(RANDOM_STATE) -plt.rcParams['figure.figsize'] = (10, 6) -plt.rcParams['font.size'] = 12 -sns.set_style('whitegrid') +from src.notebook_runner import execute_notebook +from src.runtime_paths import build_paths -# ===== 读取 notebook ===== -nb_path = r'd:\Code\doing_exercises\programs\外教作业外快\强化学习个人课程作业报告\notebooks\insurance_premium_risk.ipynb' -cells = json.load(open(nb_path, encoding='utf-8'))['cells'] -code_cells = [c for c in cells if c['cell_type'] == 'code'] -print(f"Total code cells: {len(code_cells)}") +paths = build_paths() +print(f"Project root : {paths.project_root}") +print(f"Notebook : {paths.notebook}") +print(f"Data dir : {paths.data_dir}") +print(f"Output dir : {paths.output_dir}") -# ===== 执行每个单元格 ===== -# 使用全局 __main__ 命名空间,变量跨单元格持久化 -main_ns = globals().copy() +ns = vars() -for i, cell in enumerate(code_cells): - src = ''.join(cell['source']) - print(f"\n{'='*60}") - print(f"Running cell {i+1}/{len(code_cells)}...") - print(f" Source: {src[:80].replace(chr(10), ' ')}") - try: - exec(compile(src, f'cell_{i+1}', 'exec'), main_ns) - except Exception as e: - print(f"ERROR in cell {i+1}: {e}") - traceback.print_exc() - print("Stopping execution.") - break - -print("\n\nAll cells executed successfully!") -print(f"Results saved to: outputs/figures/ and outputs/tables/") +result = execute_notebook(namespace=ns) +print(f"\nExecution finished: {result['status']}") +print(f"Cells run: {len([c for c in result['cells'] if c['status'] == 'ok'])}/{result['total']}") +print(f"Output dir: {result['outputs']['output_dir']}") \ No newline at end of file diff --git a/强化学习个人课程作业报告/src/__init__.py b/强化学习个人课程作业报告/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/强化学习个人课程作业报告/src/notebook_runner.py b/强化学习个人课程作业报告/src/notebook_runner.py new file mode 100644 index 0000000..c0f2faa --- /dev/null +++ b/强化学习个人课程作业报告/src/notebook_runner.py @@ -0,0 +1,55 @@ +import json +import traceback +from pathlib import Path + +from .runtime_paths import build_paths + + +def execute_notebook( + start_at: int | None = None, + stop_at: int | None = None, + namespace: dict | None = None, +) -> dict: + paths = build_paths() + paths.ensure_outputs() + + nb_data = json.loads(paths.notebook.read_text(encoding="utf-8")) + code_cells = [c for c in nb_data["cells"] if c["cell_type"] == "code"] + if not code_cells: + return {"status": "skipped", "reason": "no code cells found"} + + ns = (namespace or {}).copy() + ns.update(paths.as_injection()) + ns["RANDOM_STATE"] = 42 + + start = max((start_at or 1) - 1, 0) + stop = stop_at if stop_at is not None else len(code_cells) + cells_to_run = code_cells[start:stop] + + results = [] + for i, cell in enumerate(cells_to_run, start=start + 1): + src = "".join(cell["source"]) + tag = f"cell_{i}" + try: + exec(compile(src, tag, "exec"), ns) + results.append({"cell": i, "status": "ok"}) + except Exception as exc: + results.append({"cell": i, "status": "error", "error": str(exc)}) + traceback.print_exc() + print(f"Stopping at cell {i} due to error.") + break + + results_summary = { + "status": "completed", + "total": len(cells_to_run), + "cells": results, + "outputs": { + "data_dir": str(paths.data_dir), + "output_dir": str(paths.output_dir), + }, + } + return results_summary + + +if __name__ == "__main__": + execute_notebook() \ No newline at end of file diff --git a/强化学习个人课程作业报告/src/run_remaining.py b/强化学习个人课程作业报告/src/run_remaining.py index 661bb22..db440ce 100644 --- a/强化学习个人课程作业报告/src/run_remaining.py +++ b/强化学习个人课程作业报告/src/run_remaining.py @@ -1,32 +1,52 @@ -""" -Part 2: 运行完整的 notebook cells 1-35 -解决中文路径编码问题 -""" -import warnings, time, os, sys, json, traceback -warnings.filterwarnings('ignore') +import warnings + +warnings.filterwarnings("ignore") + import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as _p -_p.show = lambda *a, **kw: None -nb = r'D:\Code\doing_exercises\programs\外教作业外快\强化学习个人课程作业报告\notebooks\insurance_premium_risk.ipynb' -cells = json.load(open(nb, encoding='utf-8'))['cells'] -code_cells = [c for c in cells if c['cell_type'] == 'code'] -print(f"Total code cells: {len(code_cells)}") +matplotlib.use("Agg") +import matplotlib.pyplot as _real_mpl_plt -main_ns = globals().copy() -main_ns['RANDOM_STATE'] = 42 +_real_mpl_plt.show = lambda *a, **kw: None -for i, cell in enumerate(code_cells, start=1): - src = ''.join(cell['source']) - print(f"\n{'='*60}") - print(f"Running cell {i}/{len(code_cells)}...") - try: - exec(compile(src, f'cell_{i}', 'exec'), main_ns) - except Exception as e: - print(f"ERROR cell {i}: {e}") - traceback.print_exc() - print("Stopping.") - break +import os +import sys +import time +import json +import traceback +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import seaborn as sns +from sklearn.metrics import accuracy_score, f1_score, classification_report, confusion_matrix, ConfusionMatrixDisplay +from sklearn.model_selection import cross_val_score +from sklearn.preprocessing import StandardScaler, LabelEncoder +from sklearn.linear_model import LogisticRegression +from sklearn.ensemble import RandomForestClassifier, VotingClassifier +from sklearn.pipeline import Pipeline +from sklearn.compose import ColumnTransformer +from sklearn.preprocessing import OneHotEncoder +from sklearn.impute import SimpleImputer +from sklearn.cluster import KMeans +from sklearn.mixture import GaussianMixture +from sklearn.metrics import silhouette_score +from sklearn.decomposition import PCA +import xgboost as xgb +import optuna +optuna.logging.set_verbosity(optuna.logging.WARNING) -print("\n\nAll cells executed!") +from src.notebook_runner import execute_notebook +from src.runtime_paths import build_paths + +paths = build_paths() +print(f"Project root : {paths.project_root}") +print(f"Notebook : {paths.notebook}") +print(f"Data dir : {paths.data_dir}") +print(f"Output dir : {paths.output_dir}") + +ns = vars() + +result = execute_notebook(start_at=1, namespace=ns) +print(f"\nExecution finished: {result['status']}") +print(f"Cells run: {len([c for c in result['cells'] if c['status'] == 'ok'])}/{result['total']}") +print(f"Output dir: {result['outputs']['output_dir']}") \ No newline at end of file diff --git a/强化学习个人课程作业报告/src/runtime_paths.py b/强化学习个人课程作业报告/src/runtime_paths.py new file mode 100644 index 0000000..d3ed533 --- /dev/null +++ b/强化学习个人课程作业报告/src/runtime_paths.py @@ -0,0 +1,31 @@ +from dataclasses import dataclass +from pathlib import Path + + +@dataclass(frozen=True) +class RuntimePaths: + project_root: Path + notebook: Path + data_dir: Path + output_dir: Path + + def ensure_outputs(self) -> None: + (self.output_dir / "figures").mkdir(parents=True, exist_ok=True) + (self.output_dir / "tables").mkdir(parents=True, exist_ok=True) + (self.output_dir / "predictions").mkdir(parents=True, exist_ok=True) + + def as_injection(self) -> dict: + return { + "DATA_DIR": str(self.data_dir), + "OUTPUT_DIR": str(self.output_dir), + } + + +def build_paths() -> RuntimePaths: + root = Path(__file__).resolve().parents[1] + return RuntimePaths( + project_root=root, + notebook=root / "notebooks" / "insurance_premium_risk.ipynb", + data_dir=root / "dataset_final", + output_dir=root / "outputs", + ) diff --git a/强化学习个人项目报告/README.md b/强化学习个人项目报告/README.md new file mode 100644 index 0000000..21c359f --- /dev/null +++ b/强化学习个人项目报告/README.md @@ -0,0 +1,57 @@ +# PPO for CarRacing-v3 + +From-scratch PPO implementation for CarRacing-v3. No Stable-Baselines or other RL libraries used. + +## Setup + +```bash +conda activate my_env +uv pip install -r requirements.txt +``` + +## Train + +```bash +python train.py --steps 500000 +``` + +## Evaluate + +```bash +python src/evaluate.py --model models/ppo_carracing_final.pt --episodes 10 +``` + +## TensorBoard + +```bash +tensorboard --logdir logs/tensorboard +``` + +## Project Structure + +``` +src/ +├── network.py # Actor (Gaussian policy) and Critic (Value) networks +├── replay_buffer.py # Rollout buffer with GAE computation +├── trainer.py # PPO update with clipped surrogate objective +├── utils.py # Environment wrappers (grayscale, resize, frame stack) +└── evaluate.py # Evaluation script +train.py # Main training entry point +models/ # Saved checkpoints +logs/tensorboard/ # TensorBoard logs +``` + +## Hyperparameters + +| Parameter | Value | +|-----------|-------| +| Learning rate | 3e-4 | +| Gamma | 0.99 | +| GAE lambda | 0.95 | +| Clip epsilon | 0.2 | +| PPO epochs | 4 | +| Mini-batch size | 64 | +| Rollout steps | 2048 | +| Entropy coefficient | 0.01 | +| Value coefficient | 0.5 | +| Max gradient norm | 0.5 | \ No newline at end of file diff --git a/强化学习个人项目报告/TASK_PROGRESS.md b/强化学习个人项目报告/TASK_PROGRESS.md new file mode 100644 index 0000000..160836a --- /dev/null +++ b/强化学习个人项目报告/TASK_PROGRESS.md @@ -0,0 +1,136 @@ +# PPO + CarRacing-v3 任务进度追踪 + +> 生成时间:2026/04/30 + +--- + +## 作业要求 + +用 Python 从零实现 PPO 算法,在 CarRacing-v3 环境训练智能体,提交: +- 技术报告(≤3000 词,英文)PDF +- 源代码 + 训练模型 zip 文件 +- 截止:04/May/2026 23:59 +- **禁止使用**:Stable-Baselines 等 RL 专用库 +- **允许使用**:TensorBoard、PyTorch、Gymnasium + +--- + +## 一、已完成 ✅ + +| 步骤 | 内容 | 文件 | +|------|------|------| +| ✅ 项目结构 | src/ 目录、requirements.txt、README.md | [requirements.txt](requirements.txt)、[README.md](README.md) | +| ✅ 策略/价值网络 | Actor(高斯策略输出 μ, σ)+ Critic 实现,CNN 结构 | [src/network.py](src/network.py) | +| ✅ Rollout Buffer | 轨迹存储 + GAE 优势估计 + 返回值计算 | [src/replay_buffer.py](src/replay_buffer.py) | +| ✅ PPO Trainer | PPO 更新(clip 目标函数 + 熵正则 + 价值损失) | [src/trainer.py](src/trainer.py) | +| ✅ 环境预处理 | 灰度化 + Resize(84×84) + 帧堆叠(4帧) Wrapper | [src/utils.py](src/utils.py) | +| ✅ 评估脚本 | 渲染测试 + 多回合平均分数评估 | [src/evaluate.py](src/evaluate.py) | +| ✅ 训练入口 | 主训练循环、TensorBoard 记录、模型保存 | [train.py](train.py) | + +**核心算法实现要点**: +- 策略网络:3 层 CNN + FC(512) → μ, σ(高斯策略,tanh 激活) +- 价值网络:3 层 CNN + FC(512) → V(s) +- GAE:λ=0.95,优势归一化 +- PPO clip:ε=0.2,4 epoch 更新,mini-batch 64 + +--- + +## 二、待完成 ⬜ + +| 步骤 | 内容 | 优先级 | +|------|------|--------| +| ⬜ 安装依赖 | `uv pip install --system -r requirements.txt` | **高** | +| ⬜ 环境测试 | 短时间(~10000步)验证代码能跑通 | **高** | +| ⬜ 完整训练 | 运行 500k+ 步,预计 5-8 小时(后台) | **高(耗时)** | +| ⬜ 生成图表 | 从 TensorBoard 提取数据,用 matplotlib 绘图 | 中 | +| ⬜ 撰写报告 | 英文技术报告(≤3000 词),LaTeX 排版 | 中 | +| ⬜ 编译 PDF | XeLaTeX 编译生成 CW1_1234560.pdf | 中 | +| ⬜ 打包 zip | 源代码 + 模型打包 CW1_1234560.zip | 低 | + +--- + +## 三、文件结构 + +``` +强化学习个人项目报告/ +├── src/ +│ ├── __init__.py +│ ├── network.py # Actor + Critic CNN 网络 +│ ├── replay_buffer.py # Rollout buffer + GAE +│ ├── trainer.py # PPO 更新逻辑 +│ ├── utils.py # 环境预处理 wrappers +│ └── evaluate.py # 评估脚本 +├── train.py # 主训练入口 +├── requirements.txt +├── README.md +└── TASK_PROGRESS.md # 本文档 +``` + +--- + +## 四、超参数配置 + +| 参数 | 值 | +|------|-----| +| Learning rate | 3e-4 | +| Gamma | 0.99 | +| GAE lambda | 0.95 | +| Clip epsilon | 0.2 | +| PPO epochs | 4 | +| Mini-batch size | 64 | +| Rollout steps | 2048 | +| Entropy coefficient | 0.01 | +| Value coefficient | 0.5 | +| Max gradient norm | 0.5 | +| State shape | (84, 84, 4) | +| Action dim | 3(连续:steer, gas, brake) | + +--- + +## 五、下一步行动 + +### 立即执行 +```bash +# 1. 安装依赖 +uv pip install --system -r requirements.txt + +# 2. 验证代码能跑(短测试) +python train.py --steps 10000 + +# 3. 开始正式训练(后台运行,预计 5-8 小时) +python train.py --steps 500000 +``` + +### 训练完成后 +```bash +# TensorBoard 可视化 +tensorboard --logdir logs/tensorboard + +# 评估模型 +python src/evaluate.py --model models/ppo_carracing_final.pt --episodes 10 +``` + +### 报告撰写后 +```bash +# 编译 PDF +cd tex && xelatex CW1_1234560.tex +``` + +--- + +## 六、报告结构(≤3000 词) + +1. **Introduction** — RL 背景、CarRacing-v3 任务、状态/动作/奖励空间定义 +2. **Methodology** — PPO 数学公式、clip 机制、GAE 优势估计 +3. **Implementation Details** — 网络结构、训练流程、超参数、问题与解决 +4. **Results and Analysis** — 训练曲线图、评估结果、与 SB3 基线对比 +5. **Conclusion** — PPO 敏感性、actor-critic 有效性总结 + +--- + +## 七、提交清单 + +- [ ] `CW1_1234560.pdf` — 技术报告(封面 + ≤3000 词) +- [ ] `CW1_1234560.zip` — 源代码 + 训练好的模型 .pt 文件 +- [ ] 所有代码使用英文注释 +- [ ] 图表坐标轴和图例使用英文 diff --git a/强化学习个人项目报告/requirements.txt b/强化学习个人项目报告/requirements.txt new file mode 100644 index 0000000..266af09 --- /dev/null +++ b/强化学习个人项目报告/requirements.txt @@ -0,0 +1,5 @@ +torch +gymnasium[box2d] +numpy +matplotlib +tensorboard \ No newline at end of file diff --git a/强化学习个人项目报告/src/__init__.py b/强化学习个人项目报告/src/__init__.py new file mode 100644 index 0000000..7a8879a --- /dev/null +++ b/强化学习个人项目报告/src/__init__.py @@ -0,0 +1,6 @@ +"""PPO Agent for CarRacing-v3 environment.""" +from .network import Actor, Critic +from .replay_buffer import RolloutBuffer +from .trainer import PPOTrainer + +__all__ = ['Actor', 'Critic', 'RolloutBuffer', 'PPOTrainer'] \ No newline at end of file diff --git a/强化学习个人项目报告/src/evaluate.py b/强化学习个人项目报告/src/evaluate.py new file mode 100644 index 0000000..1f41d10 --- /dev/null +++ b/强化学习个人项目报告/src/evaluate.py @@ -0,0 +1,92 @@ +"""Evaluation script for trained PPO agent.""" +import torch +import numpy as np +import gymnasium as gym +from src.utils import make_env, get_device +from src.network import Actor, Critic + + +def evaluate(actor, env, num_episodes=10, device=torch.device("cpu")): + """Evaluate actor and return average return.""" + actor.eval() + returns = [] + + for ep in range(num_episodes): + obs, _ = env.reset() + obs = np.transpose(obs, (1, 2, 0)) # (C, H, W) -> (H, W, C) for storage + total_reward = 0 + done = False + steps = 0 + + while not done and steps < 1000: + with torch.no_grad(): + # Convert to tensor (B, C, H, W) + obs_t = torch.from_numpy(obs).float().unsqueeze(0).permute(0, 3, 1, 2).to(device) + mu, std = actor(obs_t) + # Sample action + dist = torch.distributions.Normal(mu, std) + action = dist.sample() + action = torch.clamp(action, -1, 1).squeeze(0).cpu().numpy() + + obs, reward, terminated, truncated, _ = env.step(action) + # Convert to (C, H, W) format + obs = np.transpose(obs, (1, 2, 0)) + total_reward += reward + done = terminated or truncated + steps += 1 + + returns.append(total_reward) + print(f"Episode {ep+1}/{num_episodes}: return={total_reward:.1f}, steps={steps}") + + actor.train() + return np.mean(returns), np.std(returns) + + +def evaluate_render(actor, env, device): + """Render and evaluate agent with visualization.""" + actor.eval() + obs, _ = env.reset() + obs = np.transpose(obs, (1, 2, 0)) + + env.render_mode = "human" + done = False + total_reward = 0 + + while not done: + with torch.no_grad(): + obs_t = torch.from_numpy(obs).float().unsqueeze(0).permute(0, 3, 1, 2).to(device) + mu, std = actor(obs_t) + dist = torch.distributions.Normal(mu, std) + action = dist.sample() + action = torch.clamp(action, -1, 1).squeeze(0).cpu().numpy() + + obs, reward, terminated, truncated, _ = env.step(action) + obs = np.transpose(obs, (1, 2, 0)) + total_reward += reward + done = terminated or truncated + env.render() + + actor.train() + print(f"Final return: {total_reward:.1f}") + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--model", type=str, required=True, help="Path to trained model") + parser.add_argument("--episodes", type=int, default=5, help="Number of evaluation episodes") + args = parser.parse_args() + + device = get_device() + env = make_env() + + actor = Actor().to(device) + critic = Critic().to(device) + + # Load model + checkpoint = torch.load(args.model, map_location=device, weights_only=False) + actor.load_state_dict(checkpoint["actor"]) + print(f"Loaded model from {args.model}") + + mean_return, std_return = evaluate(actor, env, num_episodes=args.episodes, device=device) + print(f"\nEvaluation: mean={mean_return:.2f}, std={std_return:.2f}") \ No newline at end of file diff --git a/强化学习个人项目报告/src/network.py b/强化学习个人项目报告/src/network.py new file mode 100644 index 0000000..d89a0ac --- /dev/null +++ b/强化学习个人项目报告/src/network.py @@ -0,0 +1,78 @@ +"""Neural network architectures for Actor and Critic.""" +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class Actor(nn.Module): + """Actor network outputting Gaussian policy parameters (mu, sigma).""" + + def __init__(self, state_shape=(84, 84, 4), action_dim=3): + super().__init__() + c, h, w = state_shape[2], state_shape[0], state_shape[1] # channels, height, width + + self.conv = nn.Sequential( + nn.Conv2d(c, 32, kernel_size=8, stride=4), + nn.ReLU(), + nn.Conv2d(32, 64, kernel_size=4, stride=2), + nn.ReLU(), + nn.Conv2d(64, 64, kernel_size=3, stride=1), + nn.ReLU(), + ) + + # Calculate feature map size: 84x84 -> 20x20 after conv layers + feat_size = 64 * 20 * 20 + + self.fc = nn.Sequential( + nn.Linear(feat_size, 512), + nn.ReLU(), + ) + self.mu_head = nn.Linear(512, action_dim) + self.log_std_head = nn.Linear(512, action_dim) + + # Initialize output layers + nn.init.orthogonal_(self.mu_head.weight, gain=0.01) + nn.init.orthogonal_(self.log_std_head.weight, gain=0.01) + + def forward(self, x): + """Forward pass returning (mu, log_std).""" + x = x / 255.0 # Normalize + x = self.conv(x) + x = x.view(x.size(0), -1) + x = self.fc(x) + mu = torch.tanh(self.mu_head(x)) + log_std = self.log_std_head(x) + log_std = torch.clamp(log_std, -20, 2) + return mu, log_std.exp() + + +class Critic(nn.Module): + """Critic network estimating state value V(s).""" + + def __init__(self, state_shape=(84, 84, 4)): + super().__init__() + c, h, w = state_shape[2], state_shape[0], state_shape[1] + + self.conv = nn.Sequential( + nn.Conv2d(c, 32, kernel_size=8, stride=4), + nn.ReLU(), + nn.Conv2d(32, 64, kernel_size=4, stride=2), + nn.ReLU(), + nn.Conv2d(64, 64, kernel_size=3, stride=1), + nn.ReLU(), + ) + + feat_size = 64 * 20 * 20 + + self.fc = nn.Sequential( + nn.Linear(feat_size, 512), + nn.ReLU(), + nn.Linear(512, 1) + ) + + def forward(self, x): + """Forward pass returning V(s).""" + x = x / 255.0 + x = self.conv(x) + x = x.view(x.size(0), -1) + return self.fc(x) \ No newline at end of file diff --git a/强化学习个人项目报告/src/replay_buffer.py b/强化学习个人项目报告/src/replay_buffer.py new file mode 100644 index 0000000..8080a3e --- /dev/null +++ b/强化学习个人项目报告/src/replay_buffer.py @@ -0,0 +1,64 @@ +"""Rollout buffer for storing trajectories.""" +import numpy as np + + +class RolloutBuffer: + """Stores trajectories for PPO training.""" + + def __init__(self, buffer_size, state_shape, action_dim): + self.buffer_size = buffer_size + self.ptr = 0 + self.size = 0 + + self.states = np.zeros((buffer_size, *state_shape), dtype=np.uint8) + self.actions = np.zeros((buffer_size, action_dim), dtype=np.float32) + self.rewards = np.zeros(buffer_size, dtype=np.float32) + self.dones = np.zeros(buffer_size, dtype=np.bool_) + self.values = np.zeros(buffer_size, dtype=np.float32) + self.log_probs = np.zeros((buffer_size, action_dim), dtype=np.float32) + + def add(self, state, action, reward, done, value, log_prob): + """Add a transition to the buffer.""" + self.states[self.ptr] = state + self.actions[self.ptr] = action + self.rewards[self.ptr] = reward + self.dones[self.ptr] = done + self.values[self.ptr] = value + self.log_probs[self.ptr] = log_prob + self.ptr = (self.ptr + 1) % self.buffer_size + self.size = min(self.size + 1, self.buffer_size) + + def compute_returns(self, last_value, gamma=0.99, gae_lambda=0.95): + """Compute returns and advantages using GAE.""" + advantages = np.zeros(self.size, dtype=np.float32) + last_gae = 0 + + # Compute GAE backwards + for t in reversed(range(self.size)): + if t == self.size - 1: + next_value = last_value + else: + next_value = self.values[t + 1] + + delta = self.rewards[t] + gamma * next_value * (1 - self.dones[t]) - self.values[t] + last_gae = delta + gamma * gae_lambda * (1 - self.dones[t]) * last_gae + advantages[t] = last_gae + + returns = advantages + self.values[:self.size] + return returns, advantages + + def get(self): + """Return all data as numpy arrays.""" + return ( + self.states[:self.size], + self.actions[:self.size], + self.rewards[:self.size], + self.dones[:self.size], + self.values[:self.size], + self.log_probs[:self.size], + ) + + def reset(self): + """Reset buffer.""" + self.ptr = 0 + self.size = 0 \ No newline at end of file diff --git a/强化学习个人项目报告/src/trainer.py b/强化学习个人项目报告/src/trainer.py new file mode 100644 index 0000000..880d3c2 --- /dev/null +++ b/强化学习个人项目报告/src/trainer.py @@ -0,0 +1,123 @@ +"""PPO Trainer with GAE advantage estimation.""" +import torch +import torch.nn as nn +import torch.optim as optim +from torch.utils.data import TensorDataset, DataLoader +import numpy as np + + +class PPOTrainer: + """PPO trainer handling the training loop.""" + + def __init__( + self, + actor, + critic, + rollout_buffer, + device, + clip_eps=0.2, + gamma=0.99, + gae_lambda=0.95, + lr=3e-4, + ent_coef=0.01, + vf_coef=0.5, + max_grad_norm=0.5, + ppo_epochs=4, + mini_batch_size=64, + ): + self.actor = actor + self.critic = critic + self.buffer = rollout_buffer + self.device = device + self.clip_eps = clip_eps + self.gamma = gamma + self.gae_lambda = gae_lambda + self.ent_coef = ent_coef + self.vf_coef = vf_coef + self.max_grad_norm = max_grad_norm + self.ppo_epochs = ppo_epochs + self.mini_batch_size = mini_batch_size + + # Separate optimizers + self.actor_optim = optim.Adam(actor.parameters(), lr=lr) + self.critic_optim = optim.Adam(critic.parameters(), lr=lr) + + self.loss_history = {'actor': [], 'critic': [], 'entropy': [], 'total': []} + + def update(self, last_value): + """Perform one PPO update.""" + states, actions, rewards, dones, values, log_probs_old = self.buffer.get() + + # Compute returns and advantages + returns, advantages = self.buffer.compute_returns( + last_value, self.gamma, self.gae_lambda + ) + + # Normalize advantages + advantages = (advantages - advantages.mean()) / (advantages.std() + 1e-8) + + # Convert to tensors + states_t = torch.from_numpy(states).float().to(self.device) + actions_t = torch.from_numpy(actions).float().to(self.device) + log_probs_old_t = torch.from_numpy(log_probs_old).float().to(self.device) + returns_t = torch.from_numpy(returns).float().to(self.device) + advantages_t = torch.from_numpy(advantages).float().to(self.device) + + dataset = TensorDataset(states_t, actions_t, log_probs_old_t, returns_t, advantages_t) + loader = DataLoader(dataset, batch_size=self.mini_batch_size, shuffle=True) + + total_actor_loss = 0 + total_critic_loss = 0 + total_entropy = 0 + count = 0 + + for _ in range(self.ppo_epochs): + for batch in loader: + s, a, log_pi_old, ret, adv = batch + + # Get current policy distribution + mu, std = self.actor(s) + dist = torch.distributions.Normal(mu, std) + log_pi = dist.log_prob(a).sum(dim=-1, keepdim=True) + entropy = dist.entropy().sum(dim=-1, keepdim=True) + + # Probability ratio + ratio = torch.exp(log_pi - log_pi_old) + + # Clipped surrogate objective + surr1 = ratio * adv + surr2 = torch.clamp(ratio, 1 - self.clip_eps, 1 + self.clip_eps) * adv + actor_loss = -torch.min(surr1, surr2).mean() + + # Value loss + value = self.critic(s) + critic_loss = nn.MSELoss()(value.squeeze(), ret) + + # Total loss + loss = actor_loss + self.vf_coef * critic_loss - self.ent_coef * entropy.mean() + + # Update + self.actor_optim.zero_grad() + self.critic_optim.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(self.actor.parameters(), self.max_grad_norm) + nn.utils.clip_grad_norm_(self.critic.parameters(), self.max_grad_norm) + self.actor_optim.step() + self.critic_optim.step() + + total_actor_loss += actor_loss.item() + total_critic_loss += critic_loss.item() + total_entropy += entropy.mean().item() + count += 1 + + avg_actor = total_actor_loss / count + avg_critic = total_critic_loss / count + avg_entropy = total_entropy / count + + self.loss_history['actor'].append(avg_actor) + self.loss_history['critic'].append(avg_critic) + self.loss_history['entropy'].append(avg_entropy) + self.loss_history['total'].append(avg_actor + avg_critic) + + self.buffer.reset() + return avg_actor, avg_critic, avg_entropy \ No newline at end of file diff --git a/强化学习个人项目报告/src/utils.py b/强化学习个人项目报告/src/utils.py new file mode 100644 index 0000000..3ee51b1 --- /dev/null +++ b/强化学习个人项目报告/src/utils.py @@ -0,0 +1,87 @@ +"""Utility functions for environment, device detection, and TensorBoard.""" +import gymnasium as gym +import numpy as np +import torch +from collections import deque + + +class GrayScaleWrapper(gym.ObservationWrapper): + """Convert RGB observation to grayscale.""" + + def __init__(self, env): + super().__init__(env) + + def observation(self, obs): + # RGB to grayscale: weighted average + gray = 0.299 * obs[:, :, 0] + 0.587 * obs[:, :, 1] + 0.114 * obs[:, :, 2] + return gray.astype(np.uint8) + + +class ResizeWrapper(gym.ObservationWrapper): + """Resize observation to target size.""" + + def __init__(self, env, size=(84, 84)): + super().__init__(env) + self.size = size + + def observation(self, obs): + import cv2 + return cv2.resize(obs, self.size, interpolation=cv2.INTER_AREA) + + +class FrameStackWrapper(gym.ObservationWrapper): + """Stack last N frames.""" + + def __init__(self, env, num_stack=4): + super().__init__(env) + self.num_stack = num_stack + self.frames = deque(maxlen=num_stack) + obs_shape = env.observation_space.shape + self.observation_space = gym.spaces.Box( + low=0, high=255, + shape=(num_stack, *obs_shape[-2:]), + dtype=np.uint8 + ) + + def reset(self, **kwargs): + obs, info = self.env.reset(**kwargs) + for _ in range(self.num_stack): + self.frames.append(obs) + return self._get_observation(), info + + def observation(self, obs): + self.frames.append(obs) + return self._get_observation() + + def _get_observation(self): + return np.stack(list(self.frames), axis=0) + + +def make_env(env_id="CarRacing-v3", gray_scale=True, resize=True, frame_stack=4): + """Create preprocessed CarRacing environment.""" + env = gym.make(env_id, render_mode="rgb_array") + if resize: + env = ResizeWrapper(env, size=(84, 84)) + if gray_scale: + env = GrayScaleWrapper(env) + if frame_stack > 1: + env = FrameStackWrapper(env, num_stack=frame_stack) + return env + + +def get_device(): + """Detect and return available device.""" + if torch.cuda.is_available(): + device = torch.device("cuda") + print(f"Using GPU: {torch.cuda.get_device_name(0)}") + else: + device = torch.device("cpu") + print("Using CPU") + return device + + +def preprocess_obs(obs): + """Ensure observation is in correct format for network.""" + if len(obs.shape) == 2: # single channel + obs = np.expand_dims(obs, axis=0) + return obs \ No newline at end of file diff --git a/强化学习个人项目报告/train.py b/强化学习个人项目报告/train.py new file mode 100644 index 0000000..3a605f5 --- /dev/null +++ b/强化学习个人项目报告/train.py @@ -0,0 +1,192 @@ +"""Main training script for PPO on CarRacing-v3.""" +import os +import time +import argparse +import numpy as np +import torch +from torch.utils.tensorboard import SummaryWriter + +from src.network import Actor, Critic +from src.replay_buffer import RolloutBuffer +from src.trainer import PPOTrainer +from src.utils import make_env, get_device + + +def collect_rollout(actor, critic, env, buffer, device, rollout_steps): + """Collect rollout data.""" + obs, _ = env.reset() + # Convert to (C, H, W) format for storage + obs = np.transpose(obs, (1, 2, 0)) + + for step in range(rollout_steps): + with torch.no_grad(): + # Convert to (B, C, H, W) + obs_t = torch.from_numpy(obs).float().unsqueeze(0).permute(0, 3, 1, 2).to(device) + mu, std = actor(obs_t) + dist = torch.distributions.Normal(mu, std) + action = dist.sample() + action = torch.clamp(action, -1, 1) + log_prob = dist.log_prob(action).sum(dim=-1, keepdim=True) + value = critic(obs_t).squeeze(0).item() + + action_np = action.squeeze(0).cpu().numpy() + log_prob_np = log_prob.squeeze(0).cpu().numpy() + + next_obs, reward, terminated, truncated, _ = env.step(action_np) + done = terminated or truncated + + # Convert next_obs to (C, H, W) for storage + next_obs_stored = np.transpose(next_obs, (1, 2, 0)) + + buffer.add(obs.copy(), action_np, reward, done, value, log_prob_np) + + obs = next_obs_stored + + if done: + obs, _ = env.reset() + obs = np.transpose(obs, (1, 2, 0)) + + +def train( + total_steps=500000, + rollout_steps=2048, + eval_interval=10, + save_interval=50, + device=None, +): + """Main training loop.""" + if device is None: + device = get_device() + + env = make_env() + eval_env = make_env() + + state_shape = (84, 84, 4) + action_dim = 3 + + actor = Actor(state_shape=state_shape, action_dim=action_dim).to(device) + critic = Critic(state_shape=state_shape).to(device) + + buffer = RolloutBuffer( + buffer_size=rollout_steps, + state_shape=state_shape, + action_dim=action_dim, + ) + + trainer = PPOTrainer( + actor=actor, + critic=critic, + rollout_buffer=buffer, + device=device, + clip_eps=0.2, + gamma=0.99, + gae_lambda=0.95, + lr=3e-4, + ent_coef=0.01, + vf_coef=0.5, + max_grad_norm=0.5, + ppo_epochs=4, + mini_batch_size=64, + ) + + # TensorBoard + log_dir = os.path.join("logs", "tensorboard", f"run_{int(time.time())}") + writer = SummaryWriter(log_dir) + + print(f"Training on {device}") + print(f"Log directory: {log_dir}") + + episode = 0 + total_timesteps = 0 + episode_rewards = [] + recent_rewards = [] + + while total_timesteps < total_steps: + # Collect rollout + collect_rollout(actor, critic, env, buffer, device, rollout_steps) + + # Get last value for GAE + with torch.no_grad(): + obs_t = torch.from_numpy(obs).float().unsqueeze(0).permute(0, 3, 1, 2).to(device) + last_value = critic(obs_t).squeeze(0).item() + + # PPO update + actor_loss, critic_loss, entropy = trainer.update(last_value) + + # Logging + writer.add_scalar("Loss/Actor", actor_loss, total_timesteps) + writer.add_scalar("Loss/Critic", critic_loss, total_timesteps) + writer.add_scalar("Loss/Entropy", entropy, total_timesteps) + + total_timesteps += rollout_steps + episode += 1 + + # Estimate episode reward from buffer + ep_reward = buffer.rewards[:buffer.size].sum() + episode_rewards.append(ep_reward) + recent_rewards.append(ep_reward) + + # Running average of last 10 episodes + avg_reward = np.mean(recent_rewards[-10:]) if len(recent_rewards) >= 10 else np.mean(recent_rewards) + writer.add_scalar("Reward/Episode", ep_reward, total_timesteps) + writer.add_scalar("Reward/AvgLast10", avg_reward, total_timesteps) + + print(f"Episode {episode}, steps {total_timesteps}, ep_reward={ep_reward:.1f}, avg_10={avg_reward:.1f}") + + # Evaluation + if episode % eval_interval == 0: + eval_returns = [] + for _ in range(5): + eval_obs, _ = eval_env.reset() + eval_obs = np.transpose(eval_obs, (1, 2, 0)) + eval_reward = 0 + done = False + + while not done: + with torch.no_grad(): + eval_obs_t = torch.from_numpy(eval_obs).float().unsqueeze(0).permute(0, 3, 1, 2).to(device) + mu, std = actor(eval_obs_t) + action = torch.clamp(mu, -1, 1).squeeze(0).cpu().numpy() + eval_obs, reward, terminated, truncated, _ = eval_env.step(action) + eval_obs = np.transpose(eval_obs, (1, 2, 0)) + eval_reward += reward + done = terminated or truncated + + eval_returns.append(eval_reward) + + mean_eval = np.mean(eval_returns) + writer.add_scalar("Eval/MeanReturn", mean_eval, episode) + print(f" Eval: mean_return={mean_eval:.2f}") + + # Save model + if episode % save_interval == 0: + os.makedirs("models", exist_ok=True) + torch.save({ + "actor": actor.state_dict(), + "critic": critic.state_dict(), + "episode": episode, + "timesteps": total_timesteps, + }, os.path.join("models", f"ppo_carracing_ep{episode}.pt")) + print(f" Saved model at episode {episode}") + + # Save final model + os.makedirs("models", exist_ok=True) + torch.save({ + "actor": actor.state_dict(), + "critic": critic.state_dict(), + "episode": episode, + "timesteps": total_timesteps, + }, os.path.join("models", "ppo_carracing_final.pt")) + + writer.close() + print(f"Training complete! Total episodes: {episode}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--steps", type=int, default=500000, help="Total training steps") + parser.add_argument("--rollout", type=int, default=2048, help="Rollout buffer size") + args = parser.parse_args() + + device = get_device() + train(total_steps=args.steps, rollout_steps=args.rollout, device=device)