可视化与监控

课程介绍

本模块聚焦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)

练习与作业

  1. 创建模型训练可视化
  2. 搭建实验跟踪系统
  3. 开发监控仪表板

扩展阅读

小测验

  1. 如何选择合适的可视化类型?
  2. 实验跟踪系统的关键要素是什么?
  3. 如何设计有效的监控指标?

下一步学习

  • 模型部署
  • 自动化测试
  • 性能优化

常见问题解答

Q: 如何选择可视化工具? A: 根据需求选择:静态分析用Matplotlib/Seaborn,交互式展示用Plotly,快速原型用Streamlit。

Q: 如何设计有效的监控系统? A: 关注关键指标,设置合理的告警阈值,保持可视化的直观性,支持实时更新。