seo优化教学视频,seo网站优化课程,单位网站建设工作总结,营销网站设计公司有哪些目录
机器学习项目的流程
文件的组织
1.项目核心代码组织
2.配置文件管理
3.实验与探索代码
4.项目产出物管理
注意事项
if name main
编码格式
类型注解
作业#xff1a;尝试针对之前的心脏病项目ipynb#xff0c;将他按照今天的示例项目整理成规范…目录
机器学习项目的流程
文件的组织
1.项目核心代码组织
2.配置文件管理
3.实验与探索代码
4.项目产出物管理
注意事项
if name main
编码格式
类型注解
作业尝试针对之前的心脏病项目ipynb将他按照今天的示例项目整理成规范的形式思考下哪些部分可以未来复用。
preprocessing.py
train.py
plots.py 昨天介绍了如何在不同文件中导入其他目录的文件核心在于了解导入方式和python解释器检索目录的方式。搞清楚了这些就可以看看如何把一个文件拆分成多个具有独立功能的文件然后通过import 的方式来调用这些文件。这样有几个好处 1.可以让项目文件变得更加清晰和规范 2.可以让项目文件更加容易维护修改某一个功能的时候只需要修改一个文件而不需要修改多个文件 3.文件变得更容易复用部分通用的文件可以单独拿出来进行其他项目的复用。
机器学习项目的流程
一个典型的机器学习项目通常包含以下阶段 - 数据加载从文件、数据库、API等获取原始数据。 - 命名参考load_data.py、data_loader.py - 数据探索与可视化了解数据特性初期可用Jupyter Notebook成熟后固化绘图函数。 - 命名参考eda.py、visualization_utils.py - 数据预处理处理缺失值、异常值、进行标准化、归一化、编码等操作。 - 命名参考preprocess.py、data_cleaning.py、data_transformation.py - 特征工程创建新特征选择、优化现有特征。 - 命名参考feature_engineering.py - 模型训练构建模型架构设置超参数并训练保存模型。 - 命名参考model.py、train.py - 模型评估用合适指标评估模型在测试集上的性能生成报告。 - 命名参考evaluate.py - 模型预测用训练好的模型对新数据预测。 - 命名参考predict.py、inference.py
文件的组织
1.项目核心代码组织
- src/source的缩写存放项目的核心源代码。按照机器学习项目阶段进一步细分 - src/data/放置与数据相关的代码。 - src/data/load_data.py负责从各类数据源如文件系统、数据库、API 等读取原始数据。 - src/data/preprocess.py进行数据清洗处理缺失值、异常值、数据转换标准化、归一化、编码等操作。 - src/data/feature_engineering.py根据业务和数据特点创建新特征或对现有特征进行选择、优化。 - src/models/关于模型的代码。 - src/models/model.py定义模型架构比如神经网络结构、机器学习算法模型设定等。 - src/models/train.py设置模型超参数并执行训练过程保存训练好的模型。 - src/models/evaluate.py使用合适的评估指标如准确率、召回率、均方误差等在测试集上评估模型性能生成评估报告。 - src/models/predict.py 或 src/models/inference.py利用训练好的模型对新数据进行预测。 - src/utils/存放通用辅助函数代码可进一步细分 - src/utils/io_utils.py包含文件读写相关帮助函数比如读取特定格式文件、保存数据到文件等。 - src/utils/logging_utils.py实现日志记录功能方便记录项目运行过程中的信息便于调试和监控。 - src/utils/math_utils.py特定的数值计算函数像自定义的矩阵运算、统计计算等。 - src/utils/plotting_utils.py绘图工具函数用于生成数据可视化图表如绘制损失函数变化曲线、特征分布直方图等 。
2.配置文件管理
- config/ 目录集中存放项目的配置文件方便管理和切换不同环境开发、测试、生产的配置。 - config/config.py 或 config/settings.py以 Python 代码形式定义配置参数。 - config/config.yaml 或 config/config.json采用 YAML 或 JSON 格式清晰列出文件路径、模型超参数、随机种子、API 密钥等可配置参数。 - .env 文件通常放在项目根目录用于存储敏感信息如数据库密码、API 密钥等在代码中通过环境变量的方式读取一般会被 .gitignore 忽略防止敏感信息泄露。
3.实验与探索代码
- notebooks/ 或 experiments/ 目录用于初期的数据探索、快速实验、模型原型验证。 - notebooks/initial_eda.ipynb在项目初期使用 Jupyter Notebook 进行数据探索与可视化了解数据特性分析数据分布、相关性等。 - experiments/model_experimentation.py编写脚本对不同模型架构、超参数组合进行快速实验对比实验结果寻找最优模型设置。
这部分往往是最开始的探索阶段后面跑通了后拆分成了完整的项目留作纪念用。、
4.项目产出物管理
- data/ 目录存放项目相关数据。 - data/raw/放置从外部获取的未经处理的原始数据保持数据原始状态。 - data/processed/存放经过预处理清洗、转换、特征工程等操作后的数据供模型训练和评估使用。 - data/interim/可选保存中间处理结果比如数据清洗过程中生成的临时文件、特征工程中间步骤产生的数据等。
- models/ 目录专门存放训练好的模型文件根据模型保存格式不同可能是 .pklPython pickle 格式常用于保存 sklearn 模型 、.h5常用于保存 Keras 模型 、.joblib 等。
- reports/ 或 output/ 目录存储项目运行产生的各类报告和输出文件。 - reports/evaluation_report.txt记录模型评估的详细结果包括各项评估指标数值、模型性能分析等。 - reports/visualizations/存放数据可视化图片如损失函数收敛图、预测结果对比图等。 - output/logs/保存项目运行日志文件记录项目从开始到结束过程中的关键信息如训练开始时间、训练过程中的损失值变化、预测时间等。
总结一下通用的拆分起步思路 1.首先按照机器学习的主要工作流程数据处理、训练、评估等将代码分离到不同的.py文件中。这是最基本也是最有价值的一步。 2.然后创建一个utils.py来存放通用的辅助函数。 3.考虑将所有配置参数集中到一个config.py文件中。 4.为你的数据和模型产出物创建专门的顶层目录如data/和models/将它们与你的源代码通常放在src/目录分开。
注意事项
if name main
常常会看到if name main这个写法实际上每个文件都是一个对象对象就会有属性和方法。
如果直接运行这个文件则__name__等于__main__若这个文件被其他模块导入则__name__不等于__main__。
这个写法有如下好处 1. 明确程序起点一个 Python 项目往往由多个模块组成。if __name__ __main__ 可清晰界定程序执行的起始位置。比如一个包含数据处理模块 data_processing.py、模型训练模块 model_training.py 的机器学习项目在 model_training.py 中用 if __name__ __main__ 包裹训练相关的主逻辑代码运行该文件时就知道需要从这里开始执行其他文件都是附属文件让项目结构和执行流程更清晰。大多时候如此 2. 避免执行python遵从模块导入即执行机制当你使用 import xxx 导入一个模块时Python 会执行该模块中的所有顶层代码即不在任何函数或类内部的代码。如果顶层代码中定义了全局变量或执行了某些操作如读取文件、初始化数据库连接这些操作会在导入时立即生效并可能影响整个程序的状态。为了避免执行不必要的代码我们可以使用 if __name__ __main__ 来避免在导入时执行不必要的代码。这样只有当模块被直接运行时即被执行 python xxx.py才会执行顶层代码而导入时则不会执行。这样我们就可以确保在导入模块时不会执行不必要的代码从而提高程序的性能和可维护性。 3. 合理的资源管理if __name__ __main__ 与定义 main 函数结合使用函数内变量在函数执行完这些变量被释放能及时回收内存资源避免内存泄漏保证程序高效运行。
编码格式
规范的py文件首行会有# -*- coding: utf-8 -*-
主要目的是 显式声明文件的编码格式确保 Python 解释器能正确读取和解析文件中的非 ASCII 字符如中文、日文、特殊符号等。也就是说这个是写给解释器看的。
因为在 Python 2.x 时代默认编码是 ASCII不支持直接在代码中写入非 ASCII 字符如中文注释、字符串中的中文否则会报错SyntaxError: Non-UTF-8 code starting with...。但是Python 3.x 默认为 UTF-8 编码理论上可以省略编码声明。但实际开发中为了兼容旧代码、明确文件编码规则或在团队协作中避免因编辑器 / 环境配置不同导致的乱码问题许多开发者仍会保留这一行声明。
ps
1. 编码声明必须出现在文件的前两行通常是首行否则会被忽略。
2. 如果编码格式没问题可能是vscode的编码格式不是utf-8可以尝试修改编码格式。
3. 常见的编码报错是因为字符串编码问题可以尝试显式转化即读取的时候转化为utf-8编码。
类型注解
Python 的类型注解是在 Python 3.5 引入的特性用于为变量、函数参数、返回值和类属性等添加类型信息。虽然 Python 仍是动态类型语言但类型注解可以提高代码可读性、可维护性并支持静态类型检查工具如 mypy。
其次你在安装python插件的时候附带安装了2个插件 1. 一个是python debugger用于断点调试我们已经介绍了 2. 另一个是pylance用于代码提示和类型检查这个插件会根据你的代码中的类型注解给出相应的提示和检查比如你定义了一个函数参数类型是int那么当你传入一个字符串时它会提示你传入的参数类型不正确。
变量类型注解语法为 变量名类型
# 变量的类型注解
name: str Alice
age: int 30
height: float 1.75
is_student: bool False
函数类型注解为函数参数和返回值指定类型语法为 def 函数名(参数: 类型) - 返回类型。
def add(a: int, b: int) - int:return a bdef greet(name: str) - None:print(fHello, {name})
类属性与方法的类型注解为类的属性和方法添加类型信息。
# 定义一个矩形类
class Rectangle:width: float # 矩形宽度浮点数类属性的类型注解不初始化值height: float # 矩形高度浮点数def __init__(self, width: float, height: float):self.width widthself.height heightdef area(self) - float:# 计算面积宽度 × 高度return self.width * self.height
上述的width: float # 矩形宽度浮点数这个写法由于没有对变量赋值所以是一种类型注解写法
作业尝试针对之前的心脏病项目ipynb将他按照今天的示例项目整理成规范的形式思考下哪些部分可以未来复用。
preprocessing.py
import pandas as pd
import numpy as np
from typing import Tuple, Dictdef load_data(file_path: str) - pd.DataFrame:加载数据文件Args:file_path: 数据文件路径Returns:加载的数据框return pd.read_csv(file_path)def handle_missing_values(data: pd.DataFrame) - pd.DataFrame:处理缺失值Args:data: 包含缺失值的数据框Returns:处理后的数据框data_clean data.copy()continuous_features data.select_dtypes(include[int64, float64]).columns.tolist()for feature in continuous_features:mode_value data[feature].mode()[0]data_clean[feature].fillna(mode_value, inplaceTrue)return data_cleanif __name__ __main__:# 测试代码data load_data(心脏病预测/data/heart.csv)data_clean handle_missing_values(data_encoded)print(数据预处理完成)
train.py
# -*- coding: utf-8 -*-import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import time
import joblib # 用于保存模型
from typing import Tuple # 用于类型注解from data.preprocessing import load_data,handle_missing_valuesdef prepare_data() - Tuple:准备训练数据Returns:训练集和测试集的特征和标签# 加载和预处理数据data load_data(心脏病预测/data/heart.csv)# 分离特征和标签X data.drop([target], axis1)y data[target]# 划分训练集和测试集X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)return X_train, X_test, y_train, y_testdef train_model(X_train, y_train, model_paramsNone) - RandomForestClassifier:训练随机森林模型Args:X_train: 训练特征y_train: 训练标签model_params: 模型参数字典Returns:训练好的模型if model_params is None:model_params {random_state: 42}model RandomForestClassifier(**model_params)model.fit(X_train, y_train)return modeldef evaluate_model(model, X_test, y_test) - None:评估模型性能Args:model: 训练好的模型X_test: 测试特征y_test: 测试标签y_pred model.predict(X_test)print(\n分类报告)print(classification_report(y_test, y_pred))print(\n混淆矩阵)print(confusion_matrix(y_test, y_pred))def save_model(model, model_path: str) - None:保存模型Args:model: 训练好的模型model_path: 模型保存路径os.makedirs(os.path.dirname(model_path), exist_okTrue)joblib.dump(model, model_path)print(f\n模型已保存至: {model_path})if __name__ __main__:# 准备数据X_train, X_test, y_train, y_test prepare_data()# 记录开始时间start_time time.time()# 训练模型model train_model(X_train, y_train)# 记录结束时间end_time time.time()print(f\n训练耗时: {end_time - start_time:.4f} 秒)# 评估模型evaluate_model(model, X_test, y_test)# 保存模型save_model(model, models/random_forest_model.joblib)
plots.py
import matplotlib.pyplot as plt
import seaborn as sns
import shap
import numpy as np
from typing import Anydef plot_feature_importance_shap(model: Any, X_test, save_path: str None) - None:绘制SHAP特征重要性图Args:model: 训练好的模型X_test: 测试数据save_path: 图片保存路径# 初始化SHAP解释器explainer shap.TreeExplainer(model)shap_values explainer.shap_values(X_test)# 绘制特征重要性条形图plt.figure(figsize(12, 8))shap.summary_plot(shap_values[:, :, 0], X_test, plot_typebar, showFalse)plt.title(SHAP特征重要性)if save_path:plt.savefig(save_path)print(f特征重要性图已保存至: {save_path})plt.show()def plot_confusion_matrix(y_true, y_pred, save_path: str None) - None:绘制混淆矩阵热力图Args:y_true: 真实标签y_pred: 预测标签save_path: 图片保存路径plt.figure(figsize(8, 6))cm confusion_matrix(y_true, y_pred)sns.heatmap(cm, annotTrue, fmtd, cmapBlues)plt.title(混淆矩阵)plt.ylabel(真实标签)plt.xlabel(预测标签)if save_path:plt.savefig(save_path)print(f混淆矩阵图已保存至: {save_path})plt.show()def set_plot_style():设置绘图样式plt.style.use(seaborn)plt.rcParams[font.sans-serif] [Heiti TC]plt.rcParams[axes.unicode_minus] Falseif __name__ __main__:# 设置绘图样式set_plot_style()# 这里可以添加测试代码print(可视化模块加载成功)
浙大疏锦行