☰
Python打卡第34天
2026/10/10 14:29:21 网站建设 项目流程

@浙大疏锦行

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

## 项目结构

```

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→预处理→特征工程→训练→评估

# ============================================

importos

importargparse

# 自动切换到脚本所在目录(不管从哪里运行都能找到 data/ 和 output/)

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

os.chdir(BASE_DIR)

# 确保output目录存在

os.makedirs('output', exist_ok=True)

defmain(run_eda:bool=True, run_train:bool=True):

"""主函数:串联完整流程"""

print("="*60)

print("心脏病预测项目 - 完整流程")

print("="*60)

# Step 1: 数据加载

print("\n[Step 1/6] 数据加载...")

fromload_dataimportload_heart_data, split_data

df=load_heart_data()

X_train, X_test, y_train, y_test=split_data(df,'target')

# Step 2: EDA

ifrun_eda:

print("\n[Step 2/6] 数据探索与可视化...")

fromedaimportrun_heart_eda

run_heart_eda(df, output_dir="output")

# Step 3: 数据预处理

print("\n[Step 3/6] 数据预处理...")

frompreprocessimportpreprocess_heart

X_train_p, X_test_p, scaler=preprocess_heart(X_train, X_test)

# Step 4: 特征工程

print("\n[Step 4/6] 特征工程...")

fromfeature_engineeringimportfeature_engineering_heart

X_train_fe, X_test_fe, selected_cols=feature_engineering_heart(X_train_p, X_test_p, y_train)

# Step 5: 模型训练

ifrun_train:

print("\n[Step 5/6] 模型训练...")

fromtrainimporttrain_heart_models

best_model, best_name, cv_results=train_heart_models(X_train_fe, y_train)

# Step 6: 模型评估

print("\n[Step 6/6] 模型评估...")

fromevaluateimportevaluate_heart_model

results=evaluate_heart_model(best_model, X_test_fe, y_test, best_name)

# 保存最终结果

importjson

final_results={k: vfork, vinresults.items()ifisinstance(v, (int,float,str))}

withopen('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=notargs.no_eda, run_train=notargs.no_train)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询