seaborn简介

seaborn是基于matplotlib的数据集分布可视化库。它在matplotlib的基础上,进行了更高级的封装,从而使得绘图更加容易,不需要经过大量的调整,就能使图像变得精致。

seaborn的几个鲜明特点如下:

>绘图接口更加集成,可以通过少量的参数设置实现大量封装绘图。

>多数图表具有统计学含义,例如分布、关系、统计、回归等

>对pandas和numpy数据类型支持非常友好

>导入seaborn

seaborn的依赖库为numpy、pandas、matplotlib、scipy。

>import numpy as np

>import pandas as pd

>import seaborn as sns

>import matplotlib.pyplot as plt

>from scipy import stats,integrate

主要用于比较数据集中各变量的分布情况

数据集分布可视化------>单变量分布sns.displot()

sns.displot()  参数(rug:密度小柱状体;kde密度曲线)

import numpy as npimport pandas as pdfrom scipy import statsimport matplotlib.pyplot as pltimport seaborn as sns
x1 = np.random.normal(size=100)sns.distplot(x1, bins=20, kde=True, rug=True,                                              rug_kws = {'color':'y'},#设置数据频率分布颜色kde_kws = {'color':'k', 'lw':1, 'label':'KDE', 'linestyle':'--'},#设置密度曲线颜色、线宽、标注、 线hist_kws = {'histtype':'stepfilled', 'linewidth':1, 'alpha':1, 'color':'g'})# 设置箱子的风格、线宽、透明度、颜色# 风格包括:'bar'、'barstacked'、'step'、'stepfilled'

x2 = np.random.randint(0, 100, 500)

sns.distplot(x2, hist=False, rug=True)


sns.kdeplot(x2, shade=True)

sns.rugplot(x2)

1、深度了解Seaborn

1.1 鸢尾花识别

假设我们要创建一个智能手机应用程序,从智能手机拍摄的照片中自动识别花的种类。 我们正在与一个数据科学家团队合作,该数据科学主管负责创建一个演示机器学习模型,测量花的萼片长度 (sepal length),萼片宽度 (sepal width),花瓣长度 (petal length) 和花瓣宽度 (petal width) 四个变量,并根据这些测量识别物种。

那么什么是萼片呢?萼片是花的最外一环。下图清晰指出花的萼片和花瓣。

我们的数据集里面包括三种类型的鸢尾花的测量,如下图

根据每种鸢尾花的四个数据 (萼片长/宽和花瓣长/宽),我们最终目的是想正确的分类这三种花。但重中之重的第一步是数据处理,有了干净数据之后再来机器学习很容易

但怎么处理数据有时候更像一门艺术而不像一门科学。接下来会从

1.检查数据
2.清理数据
3.测试数据

三方面来探索,在其过程中当然会借助 Seaborn.

即便是政府或银行,他们公布的数据也有错误。在花费太多时间分析数据之前,提早检查并修正这些错误能节省大量时间。一般来说,我们希望回答以下问题:

1.据格式有什么问题吗?
2.数据数值有什么问题吗?
3.数据需要修复或删除吗?

检查点1.数据格式
首先用 pandas 读取 csv 文件并将数据存成 DataFrame 格式。

iris_data = pd.read_csv( 'iris-data.csv',  na_values=['NA'] ) 

函数 read_csv() 里面用到的两个参数

  • 第一个 filename 是读取 csv 文件名
  • 第二个参数用来把 csv 里面空白处用 NaN 代替

此行代码将 csv 里的数据转成 pandas 里的数据表,命名为 iris_data。接着查看其前 10 个数据。

iris_data.head(10)

数据看起来是可用的 (大神 Hadley Wickhan 对干净数据的定义是,每一列代表一个特征;每一行代表一个样例)。

数据的第一行定义了列标题,标题的描述足以让我们了解每个列代表的内容 (萼片长度,萼片宽度,花瓣长度和花瓣宽度),标题甚至给我们记录测量的单位 (cm, 厘米)

第一行之后的每一行代表一个花的观测数据:四个测量指标和一个类 (class),它告诉我们花的种类。比如前 10 个都是山鸢尾花 (注意第 8 到 10 个的花瓣宽度没有数据,用 NaN 来表示)。

检查点2.数据统计

接下来,检查数据的分布可以识别异常值。我们从数据集的汇总统计数据开始。

iris_data.describe()

解释一下上表:

        describe() 函数的产出每列数据的个数 (count),均值 (mean),标准差 (std),最小值 (min)    25, 50 和 75 百分位数 (25%, 50%, 75%) 和最大值 (max)。50 百分位数也就是中位数 (median)。

从该表中看到几个有用的值。 例如,我们看到缺少 5 条花瓣宽度的数据 (表里 count 那一行的萼片长度,萼片宽度和花瓣长度的个数都是 150 个,唯独花瓣宽度是 145 个)。

此外,这样的表给不了太多有用信息,除非我们知道数据应该在一个特定的范围 (如萼片长度的最小值是 0.055, 和它其他指标如均值和几个百分位数都不是量纲的,很有可能是测量错误)。

你说表中这些数字看起来是不是很枯燥,为什么不用直观的图呢?现在 seaborn 可以派上用场了。

sb.pairplot(iris_data.dropna(), hue='class') 

上面 pairplot() 函数里

> 第一个参数 iris_data.dropna() 就是除去 NaN 的数据表,这么做原因很简单,图里不可能显示的出 NaN 值的。

> 第二个参数 hue = ‘class’ 就是根据类 (class) 下不同的值赋予不同的颜色 (hue 是色彩的意思)

让我们再回顾一下 iris_data 的前 10 行:

它有 5 列,前四列 (萼片长度,萼片宽度,花瓣长度和花瓣宽度) 可看成自变量,第五列 (类) 可看成变量。

配对图 (pairplot) 绘制前四列变量的关系图,而且用不同颜色区分不同的类下面的这四个变量。 从上图可知,横轴纵轴都有四个变量,那么总共可以画出 16 (4*4) 张小图。

>对角线上的 4 张都是某个变量和自身的关系,用分布图 (dist plot)。

>非对角线的 12 张就是某个变量和另一个变量的关系,用散点图 (scatter plot)。比如第一行第二列的图描述的就是萼片长度 (看纵轴第一个 sepal_length_cm 字样) 和萼片宽度 (看横轴第二个 sepal_width_cm 字样)。

让再回顾「配对图」

从「配对图」中,我们可以迅速看出数据集上的一些问题:

1.图的右侧标注这五个类 (Iris-setosa, Iris-setossa, Iris-versicolor, versicolor, Iris-virginica),但原本要分类的花只有三类 (Iris-setosa, Iris-versicolor, Iris-virginica)。这意味着在记录数据时可能会犯下一些错误。

2.在测量中有一些明显的异常值可能是错误的。

第二行的图 1-2-4 (或第二列的图1-2-4),对于 Iris-setosa,一个萼片宽度 (sepal_width) 值落在其正常范围之外。

第一行后三张图 (或第一列后三张图),对于 Iris-versicolor,几个萼片长度 (sepal_length) 值都接近零。

下一步我们的任务是要处理错误的数据。

修正点1.数据类型

问题:按理说鸢尾花应该只有三类,而图中显示有五类。

通过观察数据的标签,我们发现

  • 忘记在 Iris-versicolor 之前添加 Iris-
  • 在 Iris-setossa 中多打了一个 s

现在让我们使来修正这些错误。

>iris_data.loc[iris_data['class']=='versicolor','class']='Iris-versicolor'
>iris_data.loc[iris_data['class']=='Iris-setossa','class']='Iris-setosa'

>iris_data['class'].unique()

第一行将 versicolor 改为 Iris-versicolor;第二行将 Iris-setossa 改为 Iris-setosa;第四行用 unique() 函数 (unique 有唯一不重复的意思) 检验修改过的数据只有三类,更新后再画「配对图」。

sns.pairplot(iris_data.dropna(), hue='class')  

完美!五个类减到三个类,而且名称正确,分别是 Iris-setosa, Iris-versicolor 和 Iris-virginica。

修正点2.异常值

修正异常值 (outliers) 是一件棘手的事情。因为我们很难判断异常值是否由测量误差引起,或者是不正确的单位记录数据,或者是真正的异常。如果我们决定排除任何数据,需要记录排除的数据并提供排除该数据的充分理由。由上节所知,我们有两种类型的异常值。

问题1:山鸢尾花的一个萼片宽度值落在其正常范围之外。

通过调查我们知道,山鸢尾花 (Iris-setosa) 的萼片宽度 (sepal_width_cm) 不可能低于 2.5 厘米。显然,这个记录是错误的,这种情况下最有效的方法是删除它而不是花时间查找原因。但是,我们仍需要知道有多少个类似这样的错误数据,如果很少删除它没有问题,如果很多我们需要查明原因

cond = (iris_data['class'] == 'Iris-setosa') & (iris_data['sepal_width_cm'] < 2.5)
iris_data.loc[cond]

上面代码是用数据表里的 loc[] 切片来找到类为 Iris-setoa 并且 sepal width 小于 2.5 的所有行。最后发现只有一个这样的数据,因此可以直接删除此数据。

去掉 Iris-setosa 里萼片宽度大于 2.5 厘米的数据,然后画出其条形图。

iris_data = iris_data.loc[~cond]
iris_data.loc[iris_data['class'] == 'Iris-setosa','sepal_width_cm'].hist()

从上面条形图也看到了再没有这个异常值 (小于 2.5 厘米的点)。

完美! 现在所有的山鸢尾花的萼片宽度都大于 2.5 厘米

问题2:变色鸢尾花的几个萼片长度值接近于零。

所有这些接近零的 sepal_length_cm 似乎错位了两个数量级,好像它们的记录单位米而不是厘米。在经过了解,我们发现错误是因为忘记将这些测量值转换为厘米。

我们使用代码来修正这些错误。

cond = (iris_data['class'] == 'Iris-versicolor') & (iris_data['sepal_length_cm'] < 1.0)
iris_data.loc[cond]

>iris_data.loc[cond, 'sepal_length_cm'] *= 100.0

>iris_data.loc[iris_data['class'] == 'Iris-versicolor','sepal_length_cm'].hist()

从上面条形图也看到了再没有这五个异常值 (零点零几的点)。

完美! 我们成功修正了这些异常值,要不然以后会 GIGO (Garbage In Garbage Out)

修正点3.缺失值

对了,我们还有些 NaN 这样的缺失值 (missing value)。通常我们有两种方式来处理这类数据。

  • 删除 (deletion)

  • 插补 (imputation)

在本例中删除不是理想的做法,特别是考虑到它们都在 Iris-setosa 下,如图:

所有缺失的值都属于 Iris-setosa类,直接删除可能会对日后数据分析带来偏差。此外,可以用插补方法,其最常见的方法平均插补 (mean imputation)。其做法就是“假设知道测量的值落在一定范围内,就可以用该测量的平均值填充空值”。

首先查看缺失值在 DataFrame 哪个位置
iris_data.loc[(iris_data['sepal_length_cm'].isnull())|
             (iris_data['sepal_width_cm'].isnull())|
             (iris_data['petal_length_cm'].isnull())|
             (iris_data['petal_width_cm'].isnull())]

上面代码里面 iris_data[A].isnull() 语句是找出 A 列中值为 NA 或 NaN 的行,而 “|” 是“或”的意思。因此上面整句话是找到萼片长度,萼片宽度,花瓣长度和花瓣宽度这四列下的所有含 NaN 的行数据,最后发现只有 5 行,而且 NaN 都来自花瓣宽度。

然后用 mean() 求出其宽度的平均值,用其将 NaN 值全部代替,最后打印出那 5 行插补后的 DataFrame。
>isSetosa=iris_data['class']=='Iris-setosa'
>average_petal_width=iris_data.loc[isSetosa,'petal_width_cm'].mean()
>iris_data.loc[isSetosa & >(iris_data['petal_width_cm'].isnull()),'petal_width_cm']=average_petal_width
>iris_data.loc[isSetosa & (iris_data['petal_width_cm']==average_petal_width)]

为了确保所有 NaN 值已被替换,再次用 iris_data[A].isnull() 语句来查看,出来的结果是一个只有列标题的空数据表。这表示表内已经没有 NaN 值了。

> iris_data.loc[(iris_data['sepal_length_cm'].isnull())|
             (iris_data['sepal_width_cm'].isnull())|
             (iris_data['petal_length_cm'].isnull())|
             (iris_data['petal_width_cm'].isnull())]

经过了修正类别、异常值和缺失值后,最后来看看基于干净数据画的「配对图」吧。

sns.pairplot( iris_data,  hue='class' )

从上图可看到:

  • 五个类变成三个类

  • 异常值全部被删除

  • 缺失值全部被插补

图整洁了,数据也干净了,之后可以用来做机器学习。

如果你不喜欢我自定义的配色的话,你可以随意用

set_style() 选五种风格:darkgrid, whitegrid, dark, white 和 ticks .

set_palette() 六种调色盘:deep, muted, pastel, bright, dark 和 colorblind

首先将风格初始化成 ticks。

sns.set(style='ticks')

1.2 无标签的图

假设我们不知道数据标签是什么 (无监督学习里的聚类问题),那么画出来的「配对图」是单色调的

sns.pairplot( iris_data );

对角线上的图是直方图 (histgram),非对角线上的散点图没有被不同的颜色区分。我们可以用 K-mean 聚类来得到 K 个不同簇,再和本身有的标签比对,看看聚类的效果如何 (在之后的 sklean 那贴再细讲)。

1.3 带标签的图

如果我们知道数据标签 (有监督学习里的分类问题),那么画出来的「配对图」是多色调的,只需把 hue 变量设置成 DataFrame 数据里的标签名。

sns.pairplot( iris_data, hue='class' );

当细分了标签后,对角线图就是分布图 (distplot),本例有三类,因此有三个分布。非对角线图还是散点图,只不过由不同颜色区分不同类别。

1.4 设置色板

将风格设置为 dark (背景变成灰色),色板设置成 husl。

sns.set_style('dark')
sns.pairplot( iris_data, hue='class', palette='husl' );

husl 其实就是一个色彩系统,取 10 个样本颜色展示如下:

sns.palplot( sns.color_palette('husl',10) )

1.5 设置标记

将风格设置为 darkgrid (背景变成带网格的灰色),色板设置成 colorblind 为色盲用户着想,甚至将不同类用圆形 (o)、正方形 (s) 和方块 (D) 来标记。

sns.set_style('darkgrid')
sns.set_palette('colorblind')
sns.pairplot( iris_data, hue='class',
                         markers=['o','s','D'] );

1.6 子集图

如果我们不想展示所有变量之间的关系图,我们可以选择子集图。

将风格设置为 whitegrid (背景变成带网格的白色),并将横轴和纵轴赋予相同的子集变量 (都是 vars)。

sns.set_style('whitegrid')
sns.pairplot( iris_data, vars=['sepal_width_cm', 'sepal_length_cm'] );

将风格设置为 white (背景变成白色),并将横轴和纵轴赋予不同的子集变量 (x_vars 和 y_vars)。

sns.set_style('white')
sns.pairplot( iris_data,
              x_vars=['sepal_width_cm',
                      'sepal_length_cm'],
              y_vars=['petal_width_cm',
                      'petal_length_cm']);

1.7 线性回归图

pairplot() 除了画出变量之间的关系图,通过设置里面参数 kind = ‘reg’,还可在非对角图上对那些散点做线性回归。

sns.set_style('ticks')
sns.set_palette('dark')
sns.pairplot( iris_data, kind='reg' );

有个细节:色板设置成 dark,颜色顿时暗淡了许多 (深蓝)。

1.8 核密度图

pairplot() 除了画出变量之间的关系图,通过设置里面参数 diag_kind = ‘kde’,还可在对角图上对那些直方图的点做核密度估计 (KDE, kernel density estimation),该技巧在做平滑数据时用到。

sns.set_palette('bright')
sns.pairplot( iris_data, diag_kind='kde' );

有个细节:色板设置成 bright,颜色顿时明亮了许多 (浅蓝)。

2 广度了解Seaborn

在本节中我们用 Seaborn 提供了内置数据集 Titantic 来展示

  • 条形图 (barplot)

  • 计数图 (countplot)

  • 点图 (pointplot)

  • 箱形图 (boxplot)

  • 小提琴图 (violinplot)

然后用 Iris 数据来展示

  • 箱形水平图 (boxplot h)

  • 双变量分布图 (jointplot)

首先加载 Titanic 的数据。

titanic = sns.load_dataset("titanic")
titanic.head(3).append(titanic.tail(3))

Titanic 数据集是非常适合数据科学和机器学习新手入门练习的数据集,它包含 1912 年泰坦尼克号沉船事件中一些乘客的个人信息以及存活状况。点击下图看该数据集的变量解释。

还是用引言中自定义的调色板。

sns.set_palette( color )
sns.palplot( sns.color_palette(color,11) )

3.加载样本数据

seaborn除了画图之外,还附带了样本数据集,所有数据集均为csv格式,数据集默认存放在线上,地址为https://github.com/mwaskom/seaborn-data

3.1获取样本数据地址seaborn.get_data_home()

函数签名为seaborn.get_data_home(data_home=None)

返回值为样本数据集的缓存地址。这个用于seaborn.load_dataset()

3.2加载数据集seaborn.load_dataset()

3.2.1 默认从网络加载数据集。

函数的签名为seaborn.load_dataset(name,cache=True,data_home=None,**kws)。

函数的参数为:

>  name:数据集的名称,对应https://github.com/mwaskom/seaborn-dataname.csv。字符串。

>   cache:是否从网络下载数据集。布尔值。可选参数。当取值为True时,首选从本地缓存加载数据,如果下载数据会将数据缓存在本地。

>   data_home:缓存目录。字符串,可选参数。默认值为None,即get_data_home()

>   kws:传递给pandas.read_csv()的附加参数。键值对,可选参数。

返回值为pandas.DataFrame

3.2.2加载本地数据集

由于数据集默认从github下载,由于网络不稳定或者没有网络,所以直接访问数据集可能不方便,因此加载本地数据集比较灵活。

加载本地数据集的步骤如下:

1、直接从https://github.com/mwaskom/seaborn-data 下载数据集。
    2、将数据集保存在同一个目录中,比如D:\seaborn-data。
    3、加载数据时,设置load_dataset函数的cache参数为True,data_home参数为D:\seaborn-data。即sns.load_dataset('iris',data_home=r'D:\seaborn-data',cache=True)

3.2.3加载自定义数据集

除了seaborn附带的数据集,也可以自己创建数据。

根据load_data()函数概述可知,其原理就是利用pandas.read_csv()函数读取csv文件,因此,只要数据最终被转换为DataFrame格式即可。

机器学习python库--seaborn相关推荐

  1. 几行代码搞定ML模型,低代码机器学习Python库正式开源

    公众号关注 "视学算法" 设为 "星标",消息即可送达! 机器之心报道 机器之心编辑部 PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器 ...

  2. python灰色模型代码_几行代码搞定ML模型,低代码机器学习Python库正式开源

    机器之心报道 机器之心编辑部 PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型,提升机器学习实验的效率. 想提高机器学习实验的效率,把更多精力放在解决业务问题而不是写代 ...

  3. python低代码_几行代码搞定ML模型,低代码机器学习Python库正式开源

    PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型,提升机器学习实验的效率. 想提高机器学习实验的效率,把更多精力放在解决业务问题而不是写代码上?低代码平台或许是个不错的 ...

  4. 代码实现tan graph model for classification_几行代码搞定ML模型,低代码机器学习Python库正式开源...

    PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型,提升机器学习实验的效率. 想提高机器学习实验的效率,把更多精力放在解决业务问题而不是写代码上?低代码平台或许是个不错的 ...

  5. 机器学习 python 库_Python机器学习库

    机器学习 python 库 什么是机器学习? (What is Machine Learning?) As the web is immensely growing with each day, an ...

  6. 厉害了!几行代码搞定ML模型,低代码机器学习Python库正式开源

    点击上方"Python高校",关注 文末干货立马到手 机器之心编辑部 PyCaret 库支持在「低代码」环境中训练和部署有监督以及无监督的机器学习模型,提升机器学习实验的效率. 想 ...

  7. 机器学习 Python 库 Top 20

    如今开源是创新的核心,推动着技术的飞速革新.本文会为你介绍 2016 年机器学习 Top 20 Python 开源项目,同时分析得出一些有趣的见解和发展趋势. KDnuggets 为您带来 Githu ...

  8. 5个常用的机器学习python库

    前言 机器学习的工作内容往往复杂枯燥又困难--通过大量重复工作进行提升必不可少: 汇总工作流及传输渠道.设置数据源以及在内部部署和云部署的资源之间来回分流. 所以使用工具提升你的工作效率实在很关键,而 ...

  9. 2019年最强大的十大机器学习python库

    导言 Python是最流行和广泛使用的编程语言之一,已经取代了业界的许多编程语言.以下是Python流行的几个重要原因: Python有大量的库. Python因其简单易懂而被称为初学者级编程语言. ...

最新文章

  1. 设计模式之代理模式(Proxy Pattern)
  2. OCX和DLL的区别
  3. 学习对象对神经网络迭代次数的影响
  4. TCP网络编程中connect()、listen()和accept()三者之间的关系
  5. python 艺术照片滤镜_使用Python创建自己的Instagram滤镜|视觉实战
  6. 前端学习(2760):image基本使用
  7. Wireshark工作笔记-对TCP连接与断开以及数据传输的实战分析
  8. 人工智能目标检测模型总结(三)——yolov1模型(1)
  9. ExcelToSQLServer-批量导入Excel文件到SQL Server数据库
  10. 在职读研犹如飞轮效应,社科院与杜兰大学金融管理硕士与你奔赴未来
  11. IllegalArgumentException异常
  12. 万年历单片机c语言,c51单片机万年历的c程序
  13. 3D打印无人机等无人设备6——谈一谈从设计到实践的分分合合,模型如何合并与拆分?
  14. word自动消除html标签,如何将Word转换为网页html格式的方法(附代码清理方法)
  15. x = x(x-1)
  16. 如何删除aux aux.c aux.h,强行删除删不掉的文件
  17. OK外呼中心配置的电话系统规则
  18. 07数据库设计(概念结构、逻辑结构)
  19. 射影几何----笛沙格对合定理的证明
  20. 头歌平台数据结构与算法 线性表 第2关:实现一个连接存储的线性表

热门文章

  1. 老婆永远都是对的.......
  2. JavaSE基础02
  3. ubuntu18.04 moveit geomagic touch配置及使用
  4. 细说OSI七层协议模型及OSI参考模型中的数据封装过程
  5. babel(ES6转码工具)转码(将ES6代码转为ES5代码)
  6. 一篇简文让你明白CPU到底是什么?为什么能够实现计算?
  7. 智慧工厂-PDM的应用与实施
  8. Android 欢迎动画
  9. Arduino教程——RFID-RC522读卡器的驱动
  10. VR制作中必须踩的坑365之056(oculus2、UE4、UE5、VR记录一年的踩坑之旅)为什么我安装不了Twinmotion?