Python打卡第34天

@浙大疏锦行

心脏病预测项目 - 目录说明

项目结构

```

heart_project/

├── data/ # 原始数据目录

│ └── heart.csv # 心脏病数据集(14特征 + target)

│

├── load_data.py # 【模块1】数据加载

├── eda.py # 【模块2】数据探索与可视化

├── preprocess.py # 【模块3】数据预处理

├── feature_engineering.py # 【模块4】特征工程

├── train.py # 【模块5】模型训练

├── evaluate.py # 【模块6】模型评估

├── predict.py # 【模块7】模型预测/推理

├── main.py # 主入口(串联完整流程)

└── output/ # 运行后自动生成,存放所有输出

├── *.png # 可视化图表

├── *.pkl # 保存的模型和预处理工具

└── *.json # 评估结果

```

各模块职责与可复用性分析

1. load_data.py --- 数据加载

| 函数 | 类型 | 说明 |

|------|------|------|

| `load_csv()` | ✅ 可复用 | 通用CSV加载,任何项目都能用 |

| `split_data()` | ✅ 可复用 | 通用训练/测试集拆分,自动分层抽样 |

| `load_heart_data()` | ❌ 项目特定 | 心脏病数据专用入口 |

**复用建议**:`load_csv` 和 `split_data` 可以直接搬到任何新项目。


2. eda.py --- 数据探索与可视化

| 函数 | 类型 | 说明 |

|------|------|------|

| `check_missing()` | ✅ 可复用 | 缺失值统计,返回DataFrame |

| `plot_distribution()` | ✅ 可复用 | 单变量分布直方图+箱线图 |

| `plot_correlation_heatmap()` | ✅ 可复用 | 相关性热力图 |

| `plot_target_distribution()` | ✅ 可复用 | 目标变量分布柱状图 |

| `run_heart_eda()` | ❌ 项目特定 | 心脏病完整EDA流程编排 |

**复用建议**:前4个绘图函数是通用工具,建议以后单独存成 `visualization_utils.py`,所有项目共用。


3. preprocess.py --- 数据预处理

| 函数 | 类型 | 说明 |

|------|------|------|

| `fill_missing_numerical()` | ✅ 可复用 | 数值型缺失值填补 |

| `fill_missing_categorical()` | ✅ 可复用 | 类别型缺失值填补 |

| `detect_outliers_iqr()` | ✅ 可复用 | IQR法异常值检测 |

| `clip_outliers()` | ✅ 可复用 | IQR法截断异常值 |

| `standardize()` | ✅ 可复用 | 标准化(train fit, test transform) |

| `label_encode()` | ✅ 可复用 | Label编码 |

| `preprocess_heart()` | ❌ 项目特定 | 心脏病预处理流程编排 |

**复用建议**:这一整层几乎全部可复用!是最值得沉淀的工具库。新项目只需写 `preprocess_xxx()` 编排函数。


4. feature_engineering.py --- 特征工程

| 函数 | 类型 | 说明 |

|------|------|------|

| `select_kbest_features()` | ✅ 可复用 | SelectKBest特征选择 |

| `rfe_feature_selection()` | ✅ 可复用 | RFE递归特征消除 |

| `get_feature_importance()` | ✅ 可复用 | 随机森林特征重要性 |

| `add_interaction_features()` | ✅ 可复用 | 添加交互/组合特征 |

| `feature_engineering_heart()` | ❌ 项目特定 | 心脏病特征工程编排 |

**复用建议**:特征选择函数全部通用;交互特征的具体组合是业务相关的。


5. train.py --- 模型训练

| 函数 | 类型 | 说明 |

|------|------|------|

| `train_logistic_regression()` | ✅ 可复用 | 逻辑回归训练 |

| `train_random_forest()` | ✅ 可复用 | 随机森林训练 |

| `train_gradient_boosting()` | ✅ 可复用 | GBDT训练 |

| `train_svm()` | ✅ 可复用 | SVM训练 |

| `grid_search_model()` | ✅ 可复用 | 网格搜索调参 |

| `cross_validate_model()` | ✅ 可复用 | 交叉验证 |

| `save_model() / load_model()` | ✅ 可复用 | 模型保存/加载 |

| `train_heart_models()` | ❌ 项目特定 | 心脏病多模型对比编排 |

**复用建议**:所有单模型训练函数 + 调参 + 保存加载 都可以直接复用。


6. evaluate.py --- 模型评估

| 函数 | 类型 | 说明 |

|------|------|------|

| `evaluate_classifier()` | ✅ 可复用 | 通用分类评估(指标+混淆矩阵+ROC) |

| `compare_models()` | ✅ 可复用 | 多模型对比柱状图 |

| `evaluate_heart_model()` | ❌ 项目特定 | 心脏病评估入口 |

**复用建议**:`evaluate_classifier` 是通用的,任何二分类任务都能直接用。


7. predict.py --- 模型预测/推理

| 函数 | 类型 | 说明 |

|------|------|------|

| `load_model_and_preprocessors()` | ✅ 可复用 | 一键加载模型+scaler+特征列表 |

| `predict_single()` | ✅ 可复用 | 单样本预测 |

| `predict_batch()` | ✅ 可复用 | 批量预测 |

| `predict_heart_disease()` | ❌ 项目特定 | 心脏病预测入口 |

**复用建议**:推理框架通用,只需替换模型加载路径和输入字段。


如何运行

完整流程

```bash

cd heart_project

python main.py

```

只跑预处理和特征工程(不训练)

```bash

python main.py --no-train

```

跳过EDA(已有图表,直接训练)

```bash

python main.py --no-eda

```

单独测试预测

```bash

python predict.py

```

未来复用总结

**可以抽成通用工具库的部分(建议单独建 `ml_utils/` 文件夹):**

  1. 数据加载:`load_csv`, `split_data`

  2. 预处理:缺失值填补、异常值检测/截断、标准化、编码

  3. 特征选择:SelectKBest, RFE, 特征重要性

  4. 模型训练:LR/RF/GBDT/SVM 训练 + 网格搜索 + 交叉验证

  5. 模型评估:分类指标计算 + 混淆矩阵 + ROC曲线

  6. 模型推理:模型加载 + 单/批量预测

**每个新项目只需要写3个文件:**

  1. `data_loader_xxx.py` --- 加载本项目数据

  2. `preprocess_xxx.py` --- 编排本项目的预处理流程

  3. `main.py` --- 串联整个流程,替换成本项目的数据和目标变量

> 核心思想:**通用逻辑全部封装成函数,项目特定的部分只做编排和调用。**

> 新项目 80% 的代码可以直接复用,只需写 20% 的业务逻辑。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # ============================================ # main.py - 主入口文件 # 串联整个机器学习项目流程:加载→EDA→预处理→特征工程→训练→评估 # ============================================ import os import argparse # 自动切换到脚本所在目录(不管从哪里运行都能找到 data/ 和 output/) BASE_DIR ``= os.path.dirname(os.path.abspath(__file__)) os.chdir(BASE_DIR) # 确保output目录存在 os.makedirs(``'output'``, exist_ok``=``True``) def main(run_eda: ``bool = True``, run_train: ``bool = True``): ``"""主函数:串联完整流程""" ``print``(``"=" * 60``) ``print``(``"心脏病预测项目 - 完整流程"``) ``print``(``"=" * 60``) ``# Step 1: 数据加载 ``print``(``"\n[Step 1/6] 数据加载..."``) ``from load_data ``import load_heart_data, split_data ``df ``= load_heart_data() ``X_train, X_test, y_train, y_test ``= split_data(df, ``'target'``) ``# Step 2: EDA ``if run_eda: ``print``(``"\n[Step 2/6] 数据探索与可视化..."``) ``from eda ``import run_heart_eda ``run_heart_eda(df, output_dir``=``"output"``) ``# Step 3: 数据预处理 ``print``(``"\n[Step 3/6] 数据预处理..."``) ``from preprocess ``import preprocess_heart ``X_train_p, X_test_p, scaler ``= preprocess_heart(X_train, X_test) ``# Step 4: 特征工程 ``print``(``"\n[Step 4/6] 特征工程..."``) ``from feature_engineering ``import feature_engineering_heart ``X_train_fe, X_test_fe, selected_cols ``= feature_engineering_heart(X_train_p, X_test_p, y_train) ``# Step 5: 模型训练 ``if run_train: ``print``(``"\n[Step 5/6] 模型训练..."``) ``from train ``import train_heart_models ``best_model, best_name, cv_results ``= train_heart_models(X_train_fe, y_train) ``# Step 6: 模型评估 ``print``(``"\n[Step 6/6] 模型评估..."``) ``from evaluate ``import evaluate_heart_model ``results ``= evaluate_heart_model(best_model, X_test_fe, y_test, best_name) ``# 保存最终结果 ``import json ``final_results ``= {k: v ``for k, v ``in results.items() ``if isinstance``(v, (``int``, ``float``, ``str``))} ``with ``open``(``'output/final_results.json'``, ``'w'``) as f: ``json.dump(final_results, f, indent``=``2``) ``print``(f``"\n最终结果已保存: output/final_results.json"``) ``print``(``"\n" + "=" * 60``) ``print``(``"流程完成!所有输出文件在 output/ 目录下"``) ``print``(``"=" * 60``) if __name__ ``=``= "__main__"``: ``parser ``= argparse.ArgumentParser(description``=``'心脏病预测项目'``) ``parser.add_argument(``'--no-eda'``, action``=``'store_true'``, ``help``=``'跳过EDA步骤'``) ``parser.add_argument(``'--no-train'``, action``=``'store_true'``, ``help``=``'跳过训练步骤(只跑预处理和特征工程)'``) ``args ``= parser.parse_args() ``main(run_eda``=``not args.no_eda, run_train``=``not args.no_train) |

相关推荐
FPGA信号处理1 小时前
【凸优化】第一节课(下):保凸运算、分离超平面与 Farkas 引理
人工智能·算法·机器学习
计算机毕业编程指导师1 小时前
大数据毕设选题推荐:基于Hadoop+Spark全球碳排放减排策略分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·spark·毕业设计·碳排放减排
专业程序开发源1 小时前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
toooooop81 小时前
宝塔Python项目管理器:环境变量踩坑记录
java·jvm·python
大文说跨境1 小时前
用 Python 自动化检测浏览器环境指纹:WebRTC 泄露、Canvas 哈希与时区一致性校验
python·自动化·webrtc
小黄人软件2 小时前
粘贴助手C++版 支持 Windows 7 / 10 / 11 不会出现缺少api-ms-win-core-path-11-1-0.dll
开发语言·c++·windows
田里的水稻2 小时前
IL_策略训练---Mamba\SSM神经网络种类六
人工智能·深度学习·神经网络·机器学习
vx_Biye_Design2 小时前
springboot旅游管理系统18006-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·django·课程设计
新新学长搞科研2 小时前
【一级学会, 985高校联合主办】第五届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2026)
图像处理·机器学习·计算机视觉