文件的规范拆分和写法
今日的示例代码包含2个部分
- notebook文件夹内的ipynb文件,介绍下今天的思路
- 项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法
知识点回顾:文件和项目管理
规范的文件命名
重要性:就像在餐厅中,每道菜都有一个清晰明确的名字,方便厨师和顾客识别。在编程中,规范的文件命名可以帮助开发者快速识别文件的用途和内容。
实践:使用有意义的文件名,避免使用模糊的名称如“document1”或“file2”。例如,将数据处理相关的文件命名为“data_processing.py”,将模型训练相关的文件命名为“model_training.py”。
规范的文件夹管理
重要性:类似于餐厅中将食材、餐具、调料等分类存放,方便取用。在编程项目中,良好的文件夹管理有助于组织代码和资源,提高项目的可维护性和可读性。
实践:创建合理的目录结构,如将数据集放在“data”文件夹,模型保存在“models”文件夹,源代码放在“src”文件夹等。
机器学习项目的拆分
重要性:就像大型的餐饮项目需要拆分成多个部分,由不同的团队负责。机器学习项目通常较为复杂,拆分成多个模块可以提高开发效率和代码复用性。
实践:将项目拆分为数据预处理、模型训练、评估、部署等模块,每个模块负责特定的功能。
编码格式和类型注解
重要性:就像餐厅有统一的菜谱格式和烹饪标准,编码格式和类型注解有助于提高代码的可读性和可维护性。
实践:遵循一致的编码风格指南(如PEP 8),使用类型注解明确函数参数和返回值的类型。
作业:尝试针对之前的心脏病项目ipynb,将他按照今天的示例项目整理成规范的形式,思考下哪些部分可以未来复用
项目结构初始化
mkdir -p heart-disease-project/data/{raw,processed}
mkdir -p heart-disease-project/models
mkdir -p heart-disease-project/src
touch heart-disease-project/config.py
touch heart-disease-project/README.md
touch heart-disease-project/requirements.txt
配置文件 config.py
# config.py
import os
# 数据路径
RAW_DATA_PATH = os.path.join("data", "raw", "heart_disease.csv")
PROCESSED_DATA_PATH = os.path.join("data", "processed", "heart_data_processed.csv")
# 模型路径
MODEL_SAVE_PATH = os.path.join("models", "heart_model.pkl")
# 超参数
TEST_SIZE = 0.2
RANDOM_STATE = 42
数据处理模块 src/data_processing.py
# src/data_processing.py
import pandas as pd
from sklearn.model_selection import train_test_split
from config import RAW_DATA_PATH, PROCESSED_DATA_PATH
def load_and_preprocess_data():
# 加载原始数据
df = pd.read_csv(RAW_DATA_PATH)
# 处理缺失值(示例:填充均值)
df.fillna(df.mean(), inplace=True)
# 特征与标签分离
X = df.drop("target", axis=1)
y = df["target"]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 保存预处理后的数据
processed_data = {
"X_train": X_train,
"X_test": X_test,
"y_train": y_train,
"y_test": y_test,
}
pd.to_pickle(processed_data, PROCESSED_DATA_PATH)
return processed_data
模型训练模块 src/model_training.py
# src/model_training.py
import joblib
from sklearn.ensemble import RandomForestClassifier
from config import MODEL_SAVE_PATH
from src.data_processing import load_and_preprocess_data
def train_model():
# 加载预处理后的数据
data = pd.read_pickle(config.PROCESSED_DATA_PATH)
X_train, y_train = data["X_train"], data["y_train"]
# 初始化模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
model.fit(X_train, y_train)
# 保存模型
joblib.dump(model, MODEL_SAVE_PATH)
print(f"Model saved to {MODEL_SAVE_PATH}")
模型评估模块 src/evaluation.py
# src/evaluation.py
import joblib
from sklearn.metrics import classification_report, roc_auc_score
from config import MODEL_SAVE_PATH, PROCESSED_DATA_PATH
def evaluate_model():
# 加载模型和数据
model = joblib.load(MODEL_SAVE_PATH)
data = pd.read_pickle(PROCESSED_DATA_PATH)
X_test, y_test = data["X_test"], data["y_test"]
# 预测结果
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)[:, 1]
# 输出评估指标
print("Classification Report:")
print(classification_report(y_test, y_pred))
print("ROC AUC Score:")
print(roc_auc_score(y_test, y_proba))
工具函数 src/utils.py
# src/utils.py
import os
import logging
def create_directory(path):
"""确保目录存在"""
if not os.path.exists(path):
os.makedirs(path)
logging.info(f"Created directory: {path}")
依赖管理 requirements.txt
# requirements.txt
pandas
scikit-learn
joblib
项目运行流程
* 准备数据
将原始数据文件 heart_disease.csv 放入 data/raw/ 目录。
* 运行数据处理
python src/data_processing.py
* 训练模型
python src/model_training.py
* 评估模型
python src/evaluation.py