资讯动态

Seaborn数据可视化实战:机器学习探索性数据分析利器

发布时间:2026/10/13 8:40:41 来源:尧图企业网站定制
做机器学习项目做得多了你会发现一个很朴素的道理拿到数据之后第一步永远不是直接丢进模型而是先花时间把数据看明白。这里说的看明白指的就是数据可视化探索。Python里的可视化工具不少matplotlib够底层够灵活但写起来繁琐pandas内置绘图虽然方便但统计图形支持有限。而Seaborn这个Python数据可视化库恰好站在两者之间配合DataFrame使用非常顺手特别适合机器学习项目中的探索性数据分析。去年我在整理某机器学习课程的笔记时把Seaborn从头到尾过了一遍越用越觉得它适合当作日常EDA的主力工具。这篇就把我整理过的核心用法、踩过的坑、以及一些实操经验一次性分享出来。如果你是刚接触机器学习的小白或者已经会用matplotlib但觉得画统计图太费劲这篇文章应该能帮你快速上手Seaborn少走不少弯路。1. Seaborn是什么为什么机器学习项目绕不开它1.1 为什么是Seaborn而不是只用matplotlibmatplotlib的能力没有任何问题但它的设计哲学是给你所有零件你自己组装。画一个带分组颜色、统计趋势线的散点图你需要自己处理颜色映射、图例、回归拟合代码量非常可观。Seaborn相当于把这些常见的统计图形封装成了现成的函数一行就能搞定。更关键的是Seaborn并不是重新发明了一套绘图体系它底层依然依赖matplotlib只是提供了一个更贴近数据分析场景的接口。它内置了多种美观的主题和配色方案默认输出就比matplotlib原始样式好看很多几乎不需要额外调整就能放到PPT或者报告中。用个生活化的类比matplotlib是厨房里的整套刀具和锅具什么都能做但需要你自己切、自己配、自己掌握火候Seaborn则是一份半成品菜包食材和调料都配好了你只需要按步骤下锅出锅就色香味俱全。对于机器学习项目中高频出现的分布图、箱线图、热力图这类标准菜用Seaborn的效率要高得多。1.2 与pandas和matplotlib的协同关系Seaborn最顺手的一点是它可以直接接受pandas的DataFrame列名作为参数。你不需要像matplotlib那样手动把数据拆成列表只要把DataFrame传进去指定x、y、hue分别对应哪一列剩下的分组、聚合、图例都由Seaborn自动完成。这种设计对机器学习流程很友好。因为项目里的数据基本都是DataFrame特征工程做完之后想要快速看某个特征与标签之间的关系代码就只是seaborn.scatterplot(datadf, xfeature, ytarget, huelabel)这样几行。它和matplotlib的关系也不是替代而是互补。Seaborn负责画统计图matplotlib继续负责那些高度定制的细节比如坐标轴刻度格式化、添加文字批注、调整子图布局。实际项目中常用的组合是Seaborn画主体plt来修饰。你需要记住一句话Seaborn是matplotlib的增强层画图的底层对象依然是Axes所以plt.title()、plt.xlabel()这些函数依然可以作用于Seaborn生成的图。1.3 环境准备安装与导入安装非常直接如果有conda环境执行conda install seaborn或者直接用pippip install seabornSeaborn依赖numpy、pandas和matplotlib安装时通常会自动带上。我建议在虚拟环境里安装避免和系统环境打架。导入时一般约定写成import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as npseaborn的官方简写是sns这是长期形成的习惯社区里所有教程、文档都这么用。如果哪天看到别人的代码里出现sns别疑惑就是Seaborn。安装完成后可以加载Seaborn自带的数据集来练手。sns.load_dataset(tips)、sns.load_dataset(iris)、sns.load_dataset(titanic)都是经典数据集非常适合用来熟悉各种图表。第一次联网加载时可能会提示下载缓存到本地之后速度就快了。2. 机器学习项目里最常用的几种统计图形2.1 单变量分布图历史数据长什么样机器学习第一步通常是看每个特征自身的分布。特征是否接近正态分布、有没有明显偏态、有没有异常值这些信息直接影响后续的标准化方案和模型选择。Seaborn里最常用的单变量分布图是histplot和kdeplot。histplot是直方图适合看频数分布kdeplot是核密度估计曲线相当于把直方图平滑成一条连续曲线更适合看分布形状。在新版本里sns.histplot(datadf, xtotal_bill, kdeTrue)可以同时画出直方图和密度曲线一行代码就能完成常见的分布体检。画分组分布也很简单。比如想看男女顾客消费金额的分布差异只要加一个hue参数sns.histplot(datadf, xtotal_bill, huesex, kdeTrue, alpha0.6)或者用multiplestack把不同组的直方图堆叠起来对比效果更直观。这个需求放在matplotlib里你需要手动循环分组、多次调用hist、再自己写图例但在Seaborn里就是加一个参数的事。2.2 变量关系图两个特征之间有没有关联在探索特征与特征、特征与标签之间的关系时散点图是首选。scatterplot是基础版relplot是它的高级形态支持用hue、size、style同时映射多个维度的信息。sns.scatterplot(datadf, xtotal_bill, ytip, huesex, sizesize, alpha0.7)这样一张图横轴是消费金额纵轴是小费颜色区分性别点的大小代表用餐人数信息量比普通散点图丰富得多。当数据量太大、散点严重重叠时纯散点图会糊成一团。这时候可以换成jointplot它中间是散点或密度图四周还附带单变量分布sns.jointplot(datadf, xtotal_bill, ytip, kindhex)kindhex会用六边形蜂窝图展示密度颜色越深表示该区域点越密集非常适合大数据量。如果要一下子看多个特征两两之间的关系pairplot是最省事的方案。它会自动把DataFrame里的数值列做两两组合对角线画单变量分布非对角线画散点图sns.pairplot(datadf, huesex)当hue指定分组后所有子图都会自动带上颜色和图例。在机器学习项目里pairplot常被用来做特征相关性速览。不过要注意特征数量太多时子图数量会爆炸式增长一般只挑少数核心特征来画。2.3 分组对比图不同类别之间有显著差异吗分类特征对比是EDA的重点比如不同性别的消费是否存在差异周一和周五的小费分布差多少。这类问题用箱线图和提琴图最合适。boxplot可以很方便地展示分位数和异常值sns.boxplot(datadf, xday, ytotal_bill, huesex)箱体上下边界是四分位数中间的线是中位数箱体外的点是异常值。一份图就能看出中心位置、离散程度和异常情况。violinplot在箱线图基础上加上了核密度估计的形状能更细致地反映分布形态适合描述多峰分布。splitTrue还能把两个分组的提琴图左右对称拼在一起对比效果非常直观sns.violinplot(datadf, xday, ytotal_bill, huesex, splitTrue)对于计数类数据比如不同日期、不同性别的订单数量用countplot最简单。它本质上就是分类柱状图直接统计每个类别出现的次数。而barplot可以展示某个类别对应的数值特征的均值并自动加上误差棒相当于帮你算好了分组统计结果sns.barplot(datadf, xday, ytotal_bill, estimatornp.mean)不过要提醒一句barplot的默认误差棒在一些新版里展示的是置信区间如果你更想要标准差记得手动用errorbarsd这类参数控制不同版本写法略有差别。2.4 相关性热力图找出冗余特征机器学习特征工程里有一项重要工作检查特征之间的相关性。高度相关的特征往往会带来信息冗余影响模型的可解释性。Seaborn的heatmap是展示相关性矩阵的标准工具中的标准工具。corr df.select_dtypes(include[np.number]).corr() sns.heatmap(corr, annotTrue, fmt.2f, cmapcoolwarm, squareTrue)annotTrue会在格子里显示相关系数数值fmt.2f控制显示的小数位数cmap指定色带squareTrue让格子呈正方形。这张图在看多特征数据时非常直观颜色越深表示相关性越强从中能快速发现哪些特征高度共线。如果你只想看上三角部分可以提前用numpy生成一个掩膜矩阵mask np.triu(np.ones_like(corr, dtypebool), k1) sns.heatmap(corr, maskmask, annotTrue, fmt.2f)这种写法在很多Kaggle比赛方案里都能看到生成的热力图更整洁信息也没有丢失。3. 主题、配色与细节控制让图表能直接放进报告3.1 一套配置统管全图风格Seaborn的默认样式已经不错但项目汇报时通常希望整套图风格统一看起来像是同一个流水线出来的。这就用到set_themesns.set_theme(contextnotebook, styledarkgrid, palettedeep, fontSimHei)context控制整体比例分为paper、notebook、talk、poster四档。写报告选paper屏幕演示选notebook或talk大屏汇报选poster。style控制背景和网格线有white、dark、whitegrid、darkgrid四种可选。我个人习惯用darkgrid因为网格线能帮助读图深色网格在投影上也清晰。如果你不想用全局配置只想局部调整一张图可以用axes_style配合with语句限制影响范围with sns.axes_style(whitegrid): sns.boxplot(datadf, xday, ytotal_bill)这种写法很适合只对某一张图做特殊处理的场景。3.2 调色板颜色不抢戏但也不能看不懂Seaborn的调色板系统非常强大基本上不需要自己手写十六进制颜色。palettedeep是默认的强色调适合分类数据palettepastel柔和一些palettehusl色相分布均匀适合类别多的情况。连续型数据或相关性热力图一般用渐变色带可以通过cmap参数直接传入matplotlib的色带比如coolwarm、viridis、RdBu_r。其中RdBu_r在热力图上很常用正负相关分别用红蓝表示视觉上非常容易区分。如果你需要一套自己定义的颜色可以用color_palette生成一组颜色列表custom_colors sns.color_palette([#3498db, #e74c3c, #2ecc71]) sns.boxplot(datadf, xday, ytotal_bill, palettecustom_colors)这里要注意新版Seaborn里对部分绘图函数传palette可能不再生效而是要用hue来映射或者直接给color参数传单一颜色。不同函数行为不完全一致遇到调色板不生效时优先查一查当前版本的官方文档。3.3 坐标轴、标题、图例的微调Seaborn生成的图本质上是matplotlib的Axes对象所以标题、坐标轴标签、图例位置的微调都需要用matplotlib的函数。sns.histplot(datadf, xtotal_bill, kdeTrue) plt.title(消费金额分布) plt.xlabel(总消费美元) plt.ylabel(频数) plt.tight_layout()图例稍微麻烦一点。Seaborn会自动创建图例但默认位置不一定合适有时候会盖住数据。简单粗暴的解决办法是手动指定位置plt.legend(title性别, locupper right, frameonFalse)如果图例项太多还可以改成两列显示plt.legend(ncol2)。在机器学习项目里图例不要花哨frameonFalse去掉边框会让整个图干净不少。3.4 中文字体配置Seaborn默认使用英文环境下的字体配置直接显示中文会变成方块。这个问题几乎每个中文用户都会遇到。标准解决方法是回到matplotlib层面设置字体plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, Arial Unicode MS] plt.rcParams[axes.unicode_minus] Falseaxes.unicode_minus必须设置否则坐标轴上的负号会显示成方块。MacOS可以换成Arial Unicode MSLinux可以装文泉驿字体。这个配置建议放在notebook或脚本的最开头和sns.set_theme放在一起。4. 实操流程从原始数据到一张完整EDA报告4.1 数据准备与初步体检我用Seaborn自带的tips数据集走一遍完整流程大家都拿得到方便复现。先加载数据import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np sns.set_theme(contextnotebook, styledarkgrid, palettedeep) plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False df sns.load_dataset(tips) print(df.head()) print(df.info()) print(df.describe())info()可以看列名和缺失值describe()看数值列的统计量。先做这一步不是为了展示而是帮你决定后续要画哪些图。比如发现某个类别样本很少后面的分组图就要谨慎解读。4.2 单变量分布检查先看目标变量tip它决定了模型要预测什么plt.figure(figsize(8, 5)) sns.histplot(df[tip], kdeTrue, bins30) plt.title(小费金额分布) plt.show()从图上能明显看到右偏分布这意味着如果直接用线性模型误差会不太稳定。在真实项目中看到这样的分布下一步就会考虑对目标变量做log变换。这就是单变量图的价值它直接指导特征工程。接下来看数值特征total_bill同样画分布图并且按性别分组plt.figure(figsize(8, 5)) sns.histplot(datadf, xtotal_bill, huesex, kdeTrue, alpha0.5) plt.title(消费金额分布按性别) plt.show()这里如果两组分布重叠程度很高说明性别对消费金额的影响有限。如果分离明显性别就是一个值得保留的特征。4.3 多变量关系与分组对比探索total_bill和tip的关系这是数据集里最核心的两个数值变量plt.figure(figsize(8, 5)) sns.scatterplot(datadf, xtotal_bill, ytip, huetime, stylesmoker, sizesize) plt.title(消费金额与小费的关系) plt.show()散点图能明显看到正向线性关系。此时可以继续用lmplot画带回归拟合线的散点图sns.lmplot(datadf, xtotal_bill, ytip, huetime, height6)lmplot会自动拟合线性回归并画出置信区间一图看完关系强度、方向和异常点模型选型时非常有参考价值。再看分类特征之间的差异。比如星期几对消费金额的影响plt.figure(figsize(8, 5)) sns.boxplot(datadf, xday, ytotal_bill, order[Sun, Sat, Thur, Fri]) plt.title(不同日期的消费金额分布) plt.show()手动指定order很重要否则Seaborn默认按字母顺序排列周一和周五的顺序就会很奇怪。箱线图能看出周末的中位数明显高于工作日这也是一个可以继续深挖的业务洞察。最后用heatmap把所有数值特征的相关性放到一张图上corr df.select_dtypes(include[np.number]).corr() plt.figure(figsize(6, 5)) sns.heatmap(corr, annotTrue, fmt.2f, cmapcoolwarm, squareTrue, cbarTrue) plt.title(数值特征相关性热力图) plt.show()由于tips数据集的数值列不多这张图很简单但换成真实项目的几十个特征时这张图能帮你快速锁定高度共线的特征组合为后续特征筛选提供依据。4.4 把整套图组织成一个网格如果不想一张一张地画可以用FacetGrid一次性生成多子图。比如按性别和时间分组展示消费金额分布g sns.FacetGrid(df, coltime, rowsex, margin_titlesTrue) g.map(sns.histplot, total_bill, kdeTrue) g.add_legend() plt.show()这种网格图在对比多个条件下的分布时非常够用。FacetGrid几乎可以对接任何Seaborn绘图函数相当于用DataFrame的组别自动切分子图。对机器学习EDA来说这种分面方式比单纯多画几张图更省版面也更便于对比。同时还可以用pairplot快速浏览所有数值列的关系sns.pairplot(df[[total_bill, tip, size]], diag_kindkde)diag_kindkde可以让对角线上的单变量图用密度曲线显示。这个函数适合小规模特征集的快速体检十几列以内用起来最舒服。4.5 高质量图片输出做完整套EDA最后一步是保存图片。我常用的参数是plt.savefig(eda_total_bill.png, dpi300, bbox_inchestight, facecolorwhite)dpi300保证印刷清晰bbox_inchestight自动裁剪空白区域facecolorwhite避免透明背景在Word或PPT里变成黑块。如果图片要放到论文里可以考虑输出成PDF矢量格式plt.savefig(eda_total_bill.pdf, bbox_inchestight)矢量图放大不会模糊推荐在写技术报告时使用。5. 常见坑与排查技巧5.1 版本升级带来的API变化Seaborn版本迭代比较快特别是在0.11到0.13版本之间很多旧函数被标记为废弃或者改版。最典型的就是sns.distplot旧代码里经常出现但在新版本中会抛FutureWarning建议改成histplot或kdeplot。如果你跑别人的老代码遇到警告别慌按提示改函数名就行。distplot的功能基本被拆分成histplot和kdeplot把原来的参数对应过去即可。另外一个变化是barplot里的ci参数改成了errorbar旧代码里的ciNone需要改成errorbarNone。遇到这类问题最效率的方法是查看当前版本官方文档里的release notes里面会把每个废弃接口的迁移方案写清楚。千万别对着老博客里的代码硬抄很多代码在新环境里跑不通就是这么来的。5.2 中文乱码和负号问题中文显示成方块、负号显示成方块这是最影响心情的问题。前面说过解决办法是通过rcParams设置字体。这里再补充一点如果设置了中文字体后X轴或Y轴的刻度标签仍然出现小方块可能需要清除matplotlib缓存import matplotlib as mpl print(mpl.get_cachedir())然后把缓存目录清空重启Python环境。这个坑有时候很隐蔽明明字体装了、配置也写了但图还是乱码多半就是缓存问题。5.3 类别顺序和图例不按预期画箱线图时默认按字母排序想让类别按业务逻辑排列要用order参数。比如order[周一, 周二, ...]。这个方法适用于boxplot、violinplot、barplot、countplot等大部分分类图。如果order也不管用可以在DataFrame层面把列转成category类型并指定categories顺序df[day] pd.Categorical(df[day], categories[Thur, Fri, Sat, Sun], orderedTrue)这样不用在每个绘图函数里都传order全局一次搞定。图例位置问题则用plt.legend手动调整前面已经说过。5.4 数据量大时绘图卡顿Seaborn本质上把所有数据都交给matplotlib渲染数据量一大散点图会卡到怀疑人生。我有一次画几十万条记录的散点图浏览器直接不动了。解决办法有几个思路直接采样df.sample(10000)适合EDA阶段快速看趋势。用histplot加hue代替散点用二维密度方式展示分布性能更好。在绘图参数里加rasterizedTrue把图像栅格化保存时矢量部分会变少导出PDF时不会卡。用scatterplot的alpha参数降低点的不透明度减少视觉重叠。sns.scatterplot(datadf.sample(5000), xx, yy, alpha0.1, rasterizedTrue)真实项目里几十万行的数据集很常见EDA阶段不需要把所有点都画出来抽样完全不影响观察趋势。6. 实践经验与效率技巧6.1 把常用绘图封装成函数写多了会发现EDA的绘图操作高度重复。每次都要写标题、写标签、调整图例非常枯燥。我习惯把常用图表封装成小函数比如给任意两列画关系图def plot_scatter(df, x_col, y_col, hue_colNone, title): plt.figure(figsize(8, 5)) sns.scatterplot(datadf, xx_col, yy_col, huehue_col, alpha0.7) plt.title(title) plt.tight_layout() plt.show()封装的思路不追求复杂只要把最常用的参数暴露出来就行。这样每次拿到新数据调用几分钟就能生成整套EDA图省下来的时间足够多做一轮特征分析。6.2 用PairGrid和FacetGrid替代手写循环当你想对多个特征分别画图时手写循环是下策。FacetGrid可以在一个图里按条件切分多个子图自动适配所有数据子集。PairGrid则更适合自定义配对图可以自由组合上三角、下三角和对角线的图形类型g sns.PairGrid(df[[total_bill, tip, size]], diag_shareyFalse) g.map_upper(sns.scatterplot) g.map_lower(sns.kdeplot, alpha0.5) g.map_diag(sns.histplot, kdeTrue)这种灵活度在真实项目中非常实用。比如上三角画散点下三角画密度图对角线画直方图一张图涵盖的信息量远超普通pairplot。6.3 与机器学习流程的衔接Seaborn在EDA和结果分析阶段都有用武之地。特征工程阶段用它画分布图和相关性图模型训练之后用它画预测值与真实值的散点图、残差分布图、特征重要性图。比如我经常画残差图residuals y_test - y_pred sns.histplot(residuals, kdeTrue, bins30)或者用回归图评估预测值的拟合程度sns.scatterplot(xy_test, yy_pred, alpha0.6) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], r--)这些图和EDA阶段的图风格统一整理成报告时非常省心。6.4 学习路径建议如果你是新手我的建议是从这三个数据集开始tips、iris、titanic。先把histplot、scatterplot、boxplot、barplot、heatmap这五个主力图型熟练起来再逐步接触lmplot、pairplot、FacetGrid这类进阶工具。不要试图一次性记住所有函数参数。Seaborn的核心思路就是分类数据、关系数据、分布数据你只需要记住每个类别下有哪些函数用的时候查文档即可。真正需要理解的是每一张图回答什么问题、什么时候应该用什么图。图表工具会频繁更新统计图形的基本选择逻辑不会变。把注意力放在这个特征分布是不是偏态这两个特征是否相关不同分组之间的差异是不是显著这些问题上Seaborn自然越用越顺手。我自己在多个项目里反复用下来最大的感受是Seaborn最大的价值不是帮你画出一张好看的图而是让你把更多时间留给数据本身。机器学习项目里数据质量决定模型上限而数据可视化是发现数据问题的第一道照妖镜。希望这份笔记能让你少走一些弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑