一、Notebook 里在干什么
notebook 里的 .ipynb 文件通常承担 "草稿纸 + 说明书" 的角色,核心思路是:
-
快速实验
- 数据读取、分布查看、缺失值检查
- 尝试不同的特征工程、模型,看哪个有效
- 可视化分析,理解业务与数据的关系(信贷场景如逾期率、收入分布)
-
沉淀分析逻辑
- 把实验结论写成 markdown 说明,解释每一步的原因
- 这些结论会指导后续工程代码的编写
-
最终并不是"可交付"的代码
- 很多函数是零散的,变量名随意,没有模块化
- 所以今天要学的就是:如何把 notebook 里的有效内容,提炼到规范的项目结构中,让它可复用、可维护、可上线。
二、项目文件夹的拆分方法(以信贷项目为例)
一个典型的机器学习项目拆分类似这样(很多大项目都是这个骨架):
credit_project/
├── data/ # 原始数据 & 处理后的数据(只读/版本管理)
│ ├── raw/
│ └── processed/
├── notebooks/ # 探索性分析,文件名带编号和主题
│ └── 01_data_exploration.ipynb
├── src/ # 核心代码包
│ ├── __init__.py
│ ├── preprocess.py # 数据清洗、缺失值填补、编码
│ ├── features.py # 特征构造、筛选
│ ├── train.py # 模型训练与交叉验证
│ ├── evaluate.py # 评估指标、AUC/KS、报告生成
│ └── utils.py # 通用工具(日志、配置读取)
├── configs/ # 配置文件(yaml/json),参数集中管理
│ └── config.yaml
├── models/ # 保存训练好的模型文件
├── outputs/ # 输出结果(预测结果、图表)
├── tests/ # 单元测试
├── requirements.txt # 依赖包版本
├── README.md # 项目说明
└── main.py # 主入口,串联所有流程(可选)
拆分原则
- 数据与代码分离:原始数据只读,处理后的数据由代码生成,不手动修改。
- 流程模块化 :每个
.py只负责一个阶段(清洗、特征、训练),函数职责单一。 - 可配置 :超参、路径、阈值全写在
configs/里,改动不碰代码。 - 可复现:固定随机种子,记录依赖版本。
三、知识点回顾对照
1. 规范的文件命名
- 模块名用小写 + 下划线:
preprocess.py,train_model.py - Notebook 用数字编号:
01_xxx.ipynb,方便排序 - 数据文件有明确版本或日期:
application_20250101.csv - 避免中文、空格和特殊字符
2. 规范的文件夹管理
- 按功能分层,不要所有文件平铺在根目录
src/就是你的"工具箱",notebooks/是"实验记录"- 第三方代码、原始数据、产出物各归其位
3. 机器学习项目的拆分
- 对应上面的项目树,把 "notebook 思路" 转成 "工程代码":
- 探索后,把数据清洗逻辑写成
preprocess.py的函数 - 把特征构造写成
features.py,并用ColumnTransformer或Pipeline封装 - 训练逻辑独立,方便调参和切换模型
- 探索后,把数据清洗逻辑写成
- 这样可以一键运行,而不是手动一个 cell 一个 cell 点
4. 编码格式和类型注解
-
文件头声明编码:
python# -*- coding: utf-8 -*-确保中文注释、数据列名在不同系统不乱码。
-
类型注解(Type Hints):
pythondef calc_ks(y_true: np.ndarray, y_pred: np.ndarray) -> float: ...好处:IDE 会有代码提示、错误检查,读代码的人也更容易理解函数的输入输出。