可视化与监控
课程介绍
本模块聚焦AI开发中的可视化和监控技术,教你如何创建直观的数据可视化和有效的模型监控系统。通过实际案例,掌握从基础图表到交互式仪表板的开发技能。
学习目标
完成本模块学习后,你将能够:
- 使用多种工具创建数据可视化
- 开发交互式可视化仪表板
- 构建模型训练监控系统
- 设计实验跟踪平台
1. 静态可视化
1.1 Matplotlib基础
# 📊 实战案例:模型评估可视化
import matplotlib.pyplot as plt
import numpy as np
def plot_model_evaluation(y_true, y_pred):
"""创建模型评估可视化"""
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 1. 预测vs实际值散点图
axes[0,0].scatter(y_true, y_pred, alpha=0.5)
axes[0,0].plot([y_true.min(), y_true.max()],
[y_true.min(), y_true.max()],
'r--', lw=2)
axes[0,0].set_title('预测 vs 实际值')
# 2. 残差图
residuals = y_pred - y_true
axes[0,1].hist(residuals, bins=30)
axes[0,1].set_title('残差分布')
# 3. 预测值的置信区间
sorted_idx = np.argsort(y_true)
axes[1,0].plot(y_true[sorted_idx], label='实际值')
axes[1,0].fill_between(range(len(y_true)),
y_pred[sorted_idx] - residuals.std(),
y_pred[sorted_idx] + residuals.std(),
alpha=0.3)
axes[1,0].set_title('预测置信区间')
# 4. Q-Q图
from scipy import stats
stats.probplot(residuals, dist="norm", plot=axes[1,1])
axes[1,1].set_title('Q-Q图')
plt.tight_layout()
return fig
1.2 Seaborn进阶
# 🎨 实战案例:特征分析可视化
import seaborn as sns
def plot_feature_analysis(df, target_col):
"""创建特征分析可视化"""
# 设置风格
sns.set_style("whitegrid")
sns.set_palette("husl")
# 创建图表
g = sns.PairGrid(df, hue=target_col,
diag_kind="hist",
corner=True)
# 添加不同类型的图
g.map_lower(sns.scatterplot, alpha=0.5)
g.map_diag(sns.histplot, multiple="stack")
# 添加图例
g.add_legend()
return g.fig
def plot_correlation_matrix(df):
"""创建相关性矩阵热图"""
plt.figure(figsize=(12, 8))
# 计算相关性
corr = df.corr()
# 创建掩码(只显示上三角)
mask = np.triu(np.ones_like(corr, dtype=bool))
# 绘制热图
sns.heatmap(corr, mask=mask, annot=True,
fmt='.2f', cmap='coolwarm',
vmin=-1, vmax=1, center=0)
plt.title('特征相关性矩阵')
return plt.gcf()
2. 交互式可视化
2.1 Plotly使用
# 🔄 实战案例:交互式训练监控
import plotly.graph_objects as go
from plotly.subplots import make_subplots
def create_training_dashboard(history):
"""创建训练过程交互式仪表板"""
# 创建子图
fig = make_subplots(
rows=2, cols=2,
subplot_titles=('损失曲线', '准确率曲线',
'学习率变化', '梯度范数')
)
# 添加损失曲线
fig.add_trace(
go.Scatter(y=history['loss'], name='训练损失'),
row=1, col=1
)
fig.add_trace(
go.Scatter(y=history['val_loss'], name='验证损失'),
row=1, col=1
)
# 添加准确率曲线
fig.add_trace(
go.Scatter(y=history['accuracy'], name='训练准确率'),
row=1, col=2
)
fig.add_trace(
go.Scatter(y=history['val_accuracy'], name='验证准确率'),
row=1, col=2
)
# 添加学习率变化
fig.add_trace(
go.Scatter(y=history['lr'], name='学习率'),
row=2, col=1
)
# 添加梯度范数
fig.add_trace(
go.Scatter(y=history['gradient_norm'], name='梯度范数'),
row=2, col=2
)
# 更新布局
fig.update_layout(height=800, showlegend=True,
title_text="模型训练监控仪表板")
return fig
2.2 Streamlit应用
# 📱 实战案例:模型监控应用
import streamlit as st
def create_monitoring_app():
"""创建Streamlit监控应用"""
st.title('AI模型监控平台')
# 侧边栏配置
st.sidebar.header('配置')
model_name = st.sidebar.selectbox(
'选择模型',
['模型A', '模型B', '模型C']
)
# 主页面
col1, col2 = st.columns(2)
with col1:
st.subheader('模型性能指标')
metrics = get_model_metrics(model_name)
st.metric('准确率', f"{metrics['accuracy']:.2%}")
st.metric('F1分数', f"{metrics['f1']:.2%}")
with col2:
st.subheader('预测分布')
fig = plot_prediction_distribution(model_name)
st.plotly_chart(fig)
# 预测历史
st.subheader('预测历史')
history = get_prediction_history(model_name)
st.line_chart(history)
3. 实验监控
3.1 TensorBoard使用
# 📈 实战案例:TensorBoard集成
from torch.utils.tensorboard import SummaryWriter
class ModelTrainer:
def __init__(self, model, log_dir='runs/experiment'):
self.model = model
self.writer = SummaryWriter(log_dir)
def train_epoch(self, epoch, dataloader):
"""训练一个epoch并记录到TensorBoard"""
for batch_idx, (data, target) in enumerate(dataloader):
# 前向传播
output = self.model(data)
loss = self.criterion(output, target)
# 反向传播
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
# 记录指标
self.writer.add_scalar('train/loss',
loss.item(),
epoch * len(dataloader) + batch_idx)
# 记录梯度直方图
for name, param in self.model.named_parameters():
self.writer.add_histogram(f'gradients/{name}',
param.grad,
epoch)
def log_model_graph(self, input_size):
"""记录模型图结构"""
dummy_input = torch.randn(input_size)
self.writer.add_graph(self.model, dummy_input)
3.2 MLflow跟踪
# 📊 实战案例:MLflow实验跟踪
import mlflow
import mlflow.pytorch
def train_with_mlflow(model, train_loader, valid_loader,
num_epochs, hyperparameters):
"""使用MLflow跟踪训练实验"""
# 设置实验
mlflow.set_experiment('模型训练实验')
# 开始新的运行
with mlflow.start_run():
# 记录超参数
mlflow.log_params(hyperparameters)
# 训练循环
for epoch in range(num_epochs):
# 训练
train_loss = train_epoch(model, train_loader)
# 验证
valid_loss = validate(model, valid_loader)
# 记录指标
mlflow.log_metrics({
'train_loss': train_loss,
'valid_loss': valid_loss
}, step=epoch)
# 保存模型检查点
mlflow.pytorch.log_model(model, f'model_epoch_{epoch}')
# 记录学习曲线
plot_learning_curves(train_loss, valid_loss)
mlflow.log_artifact('learning_curves.png')
实战项目:AI实验管理平台
项目描述
开发一个完整的AI实验管理平台,集成可视化和监控功能。
项目代码框架
class ExperimentManager:
def __init__(self):
self.mlflow_client = mlflow.tracking.MlflowClient()
self.tensorboard_writer = SummaryWriter('runs/current')
def start_experiment(self, name, config):
"""启动新实验"""
mlflow.set_experiment(name)
with mlflow.start_run() as run:
# 记录配置
mlflow.log_params(config)
return run.info.run_id
def log_metrics(self, metrics, step):
"""记录指标"""
# MLflow记录
mlflow.log_metrics(metrics, step=step)
# TensorBoard记录
for name, value in metrics.items():
self.tensorboard_writer.add_scalar(name, value, step)
def log_model(self, model, artifacts):
"""记录模型和相关文件"""
# 保存模型
mlflow.pytorch.log_model(model, 'model')
# 保存相关文件
for name, artifact in artifacts.items():
mlflow.log_artifact(artifact, name)
def create_dashboard(self):
"""创建实验仪表板"""
# 使用Streamlit创建Web界面
st.title('AI实验管理平台')
# 显示实验列表
experiments = self.mlflow_client.list_experiments()
selected_exp = st.sidebar.selectbox(
'选择实验',
[exp.name for exp in experiments]
)
# 显示实验详情
runs = self.mlflow_client.search_runs(
experiment_ids=[selected_exp]
)
st.write('实验运行历史:')
st.dataframe(runs)
练习与作业
- 创建模型训练可视化
- 搭建实验跟踪系统
- 开发监控仪表板
扩展阅读
小测验
- 如何选择合适的可视化类型?
- 实验跟踪系统的关键要素是什么?
- 如何设计有效的监控指标?
下一步学习
- 模型部署
- 自动化测试
- 性能优化
常见问题解答
Q: 如何选择可视化工具? A: 根据需求选择:静态分析用Matplotlib/Seaborn,交互式展示用Plotly,快速原型用Streamlit。
Q: 如何设计有效的监控系统? A: 关注关键指标,设置合理的告警阈值,保持可视化的直观性,支持实时更新。