7.4 与 Pandas 和机器学习生态集成


文档摘要

7.4 与 Pandas 和机器学习生态集成 Seaborn 与 Pandas 的集成点是"长表进、图形出"的列名映射;与 sklearn 的集成点是"模型输出整理回 DataFrame 再画"。图形从不直接吃模型对象——数据框是两个生态之间的通用货币。 第 7 章的收官节。前七画的图都来自现成数据集,真实工作流里数据要过 Pandas 的加工、模型要经 sklearn 的训练,本节拆两个接驳口的语法,顺便交代交互可视化库的选型边界。 Pandas 接驳:分组结果的回填 Pandas 自带的 plot 接口能画同样的图,但一过聚合就失去 hue 分组与统计误差能力。

7.4 与 Pandas 和机器学习生态集成

Seaborn 与 Pandas 的集成点是"长表进、图形出"的列名映射;与 sklearn 的集成点是"模型输出整理回 DataFrame 再画"。图形从不直接吃模型对象——数据框是两个生态之间的通用货币。

第 7 章的收官节。前七画的图都来自现成数据集,真实工作流里数据要过 Pandas 的加工、模型要经 sklearn 的训练,本节拆两个接驳口的语法,顺便交代交互可视化库的选型边界。

Pandas 接驳:分组结果的回填

import seaborn as sns import matplotlib.pyplot as plt flights = sns.load_dataset('flights') # groupby 的输出直接可画——reset_index 把组键变回普通列 monthly = (flights.groupby('month', observed=True)['passengers'] .mean().reset_index()) ax = sns.barplot(data=monthly, x='month', y='passengers') ax.set_ylabel('跨年平均乘客数') # 输出说明:7、8 月两根柱明显最高,2 月最低——季节效应的摘要视图

Pandas 自带的 plot 接口能画同样的图,但一过聚合就失去 hue 分组与统计误差能力。经验法则:探索时 Pandas 的快枪可以,交付时回到 Seaborn——后者拿到 reset_index 后的聚合表,仍能提供配色、误差棒与细节层打磨。

# transform 的宽回填:给每行附上组均值,散点与组均值线同图 tips = sns.load_dataset('tips') tips['day_mean'] = tips.groupby('day')['total_bill'].transform('mean') ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', alpha=0.5) for day, grp in tips.groupby('day'): ax.axvline(grp['day_mean'].iloc[0], linestyle=':', linewidth=1) # transform 与 agg 的区别:agg 压缩行数、transform 保持行数—— # 前者产出新表,后者给原表加注释列

sklearn 接驳:模型输出的图形化

from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split import numpy as np import pandas as pd penguins = sns.load_dataset('penguins').dropna() X = penguins[['flipper_length_mm']] y = penguins['body_mass_g'] X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = LinearRegression().fit(X_tr, y_tr) pred = model.predict(X_te) # 关键一步:把数组输出整理成长表,图形才能映射 res_df = pd.DataFrame({'flipper': X_te['flipper_length_mm'], 'true': y_te, 'pred': pred}) res_df['residual'] = res_df['true'] - res_df['pred'] fig, axes = plt.subplots(1, 2, figsize=(11, 4)) sns.scatterplot(data=res_df, x='true', y='pred', alpha=0.6, ax=axes[0]) axes[0].axline((3000, 3000), slope=1, color='crimson', linestyle='--') # 理想对角线 axes[0].set_xlabel('实际体重(克)') axes[0].set_ylabel('预测体重(克)') sns.scatterplot(data=res_df, x='pred', y='residual', alpha=0.6, ax=axes[1]) axes[1].axhline(0, color='gray', linestyle=':') axes[1].set_xlabel('预测值') axes[1].set_ylabel('残差') plt.show() # 输出说明:左图预测与实际沿对角线分布、两端收窄; # 右图残差在零线附近随机散布、无明显喇叭口——线性假设未被残差否决

残差图是"模型体检"的标准图形,它的语法就是普通散点图——sklearn 集成的全部秘密在于把输出装回 DataFrame

# 特征系数的条形图:模型解释力的直观表达 coef = pd.DataFrame({'feature': X.columns, 'coef': model.coef_}) ax = sns.barplot(data=coef, x='feature', y='coef') # 多特征模型里这张图排完序就是特征重要性的一手视图(第 8 章会展开成完整案例)

交互库的选型边界

静态图之外,Plotly、Bokeh 一系提供悬停与缩放。什么时候值得换轨道?三个判据:读者是否需要逐点查数(悬停价值)、图形是否需要在线过滤(仪表场景)、交付物是否必须离线(PDF 报告则无意义)。Seaborn 与它们不共享 API,切换是重写而非移植;但本章的拆解法照用——数据、映射、图层的分析在任何库里都成立。

⚠️ 常见坑:sklearn 的输出全是 NumPy 数组,直接喂给 Seaborn 会在列名映射处报错。约定俗成的第一行永远是 pd.DataFrame(...) 包装——列名即映射,没有列名就没有语法。

💡 关键直觉:DataFrame 是数据分析工作流的通用接口——Pandas 产出它、sklearn 消费并产出数组、Seaborn 只认它。所有"集成"问题最后都归结为"怎么把东西变回带列名的表"。

本节要点回顾

  • 聚合后 reset_index:groupby 结果变回普通长表才能进映射层;
  • transform 保行数:组统计回填原表做注释列,agg 产出新表做摘要图;
  • 模型输出先装表:预测值、残差、系数全部 DataFrame 化后再画;
  • 残差图是模型体检:随机散布于零线附近是线性模型的及格线;
  • 交互三判据:逐点查数、在线过滤、离线交付,三者皆无就不必换库。

第 7 章完成。零件齐了,第 8 章开三条完整产线:EDA、模型结果表达、时间序列。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U