前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习之数据之美

机器学习之数据之美

作者头像
公众号guangcity
发布2019-09-20 15:32:52
1.2K0
发布2019-09-20 15:32:52
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

机器学习之数据之美

0.说在前面

1.单变量分布

2.双变量分布

3.作者的话

0.说在前面

昨天看了一下机器学习的东西,发现在做特征工程时,需要用到seaborn的可视化方法。

特别是涉及变量置键的关系强度,对于模型的选择非常重要,那么今天一起来学习一下,有关可视化的两个分布,分别是单变量分布及双变量分布!

同时介绍一下Jupter的几个快捷键,哈哈~~,之前用的pycharm,没想到我也改用Jupter了。

改用这个主要原因为:绘制图形方便显示,而在pycharm中弹出多张图来就有点受不了了,在Jupter中为浏览器交互式操作,直接显示,非常方便。

这里介绍几个Jupter的快捷键

Ctrl+Enter 运行当前行代码

Alt+Enter 运行当前行代码并跳转下一行

Tab 补全代码

下面开始使用Jupter开始程序美图之路!

1.单变量分布

distplot绘制单变量分布

导包

代码语言:javascript
复制
# 此行代码只能在Jupter中使用,并且可以保证不plt.show()直接显示图片
%matplotlib inline
# 导入相关包
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats, integrate

固定种子

利用np.random.seed()函数设置相同的seed,每次生成的随机数相同。

如果不设置seed,则每次会生成不同的随机数

代码语言:javascript
复制
np.random.seed(sum(map(ord,"distributions")))

绘制默认图

distplotseaborndisplot()函数集合了matplotlibhist()与核函数估计kdeplot的功能;

增加了rugplot分布观测条显示与利用scipy库fit拟合参数分布的新颖用途。

绘制单变量分布,单变量分布distplot()函数,默认使用柱状图hisogram来绘制,并提供一个适配的核密度估计(KDE)

代码语言:javascript
复制
# 产生制定分布的数集(默认是标准正态分布)
data = np.random.normal(size=100)
print(data)
sns.distplot(data)

data结果输出

代码语言:javascript
复制
[ 0.42852369  1.19133255 -0.45820746 -1.85860798  1.02445299  0.69330216
  0.78849804  0.38978006  0.28186484  2.87595634 -0.47628215  1.68025623
..................]

分桶参数

bins是分桶数

hist控制是否显示分桶柱子

kde 控制是否显示核密度估计图

rug 控制是否显示观测实例竖线

代码语言:javascript
复制
sns.distplot(data,kde=False,bins=5)

柱子参数

代码语言:javascript
复制
sns.distplot(data,kde=False,hist=True)

核密度参数

代码语言:javascript
复制
sns.distplot(data,kde=True,hist=False)

观测实例竖线参数

rug参数开启后会在最下面产生由下至上的竖线

代码语言:javascript
复制
sns.distplot(data,rug=True)

核密度估计

kdeplot,核密度估计的步骤:

每一个观测附近用一个正态分布曲线近似;

叠加所有观测的正态分布曲线;

归一化,以使得曲线下面包围的面积是1

KDE的带宽参数(bw)控制着密度估计曲线的宽窄形状。

代码语言:javascript
复制
sns.kdeplot(data,label="bw: default")
sns.kdeplot(data, bw=.2, label="bw: 0.2")
# 这个设置shade=True表示显示曲线包围面积,且包围面积为1
sns.kdeplot(data, bw=2, label="bw: 2", shade=True)
plt.legend()

为了更好得表达bw参数有点类似hist图形种的bins参数,对应这上面绘制的KDE宽度。

看到上图感觉对数值范围发生了变化,这里使用cut参数,与上面的几张图的范围对比,会发西安并没有变化,只是当bw为2时,使得范围扩大了,这样所产是的结果是:默认图看似区间范围变了,实际没变!

代码语言:javascript
复制
sns.kdeplot(data,label="bw: default")
sns.kdeplot(data, bw=.2, label="bw: 0.2")
# 通过cut参数来控制绘制曲线的极值值的距离
sns.kdeplot(data, bw=2, label="bw: 2", shade=True, cut=0)
plt.legend()

拟合参数分布

拟合参数分布,distplot的fit参数,控制拟合的参数分布图形

distplot可以绘制很多分布,函数内部涵盖了大量的分布函数,

可以用来近似拟合数据.这对于熟悉统计的人来说十分有用.

伽玛分布(Gamma Distribution)是统计学的一种连续概率函数。

这里采用distplot使用fit参数去拟合绘制伽玛分布。

核密度估计图

代码语言:javascript
复制
np.random.seed(sum(map(ord,"distributions")))
x = np.random.gamma(6, size=200)
print(x)
sns.distplot(x,kde=True)

伽玛图

注意将kde关闭,否则两个图绘制到一张图中,不容易区分!

代码语言:javascript
复制
sns.distplot(x,kde=False,fit=stats.gamma)

2.双变量分布

jointplot

jointplot绘制双变量分布

提供多面板图形展示两个变量之间的联合关系

以及每个轴单变量的分布情况

散点图(Scatterplots)

Pearsonr相关系数衡量x于y的相关程度

相关系数的绝对值越大,相关性越强;

相关系数越接近于1或-1,相关度越强;

相关系数越接近0,相关度越弱;

代码语言:javascript
复制
# 固定随机种子
np.random.seed(sum(map(ord,"distributions")))
# 均值,协方差矩阵
mean,cov = (1, 2),[[1, 0], [0.5, 1]]
'''
mean:mean是多维分布的均值维度为1;
cov:协方差矩阵且协方差矩阵必须是对称的且需为半正定矩阵;
size:指定生成的正态分布矩阵的维度。
'''
# 生成一个多元正态分布矩阵
# data=shape(200,2)
data = np.random.multivariate_normal(mean, cov, 200)
data
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x",y="y",data=df)

Hexbin plots图

hexbin图Hexbin plot,称为直方图histogram的双变量类似图

展示了落在六角形箱内的观测量。适合数据量大的!白色背景视觉效果最好

代码语言:javascript
复制
import warnings
# 忽略一些警告
warnings.filterwarnings('ignore')
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
    sns.jointplot(x=x, y=y, kind="hex", color="k")

核密度估计(Kernel density estimation)

等高线图展示核密度估计过程来可视化双变量分布

代码语言:javascript
复制
sns.jointplot(x="x", y="y", data=df, kind="kde")

二维核密度图

代码语言:javascript
复制
# 也可以用 kdeplot 函数来绘制一个二维的核密度图形
# matlibplot与seaborn结合!
f, ax = plt.subplots(figsize=(7, 7))
sns.kdeplot(df.x, df.y)
sns.rugplot(df.x, color="g", ax=ax)
# vertical设置x与y轴的垂直线
sns.rugplot(df.y, vertical=True, ax=ax);

JointGrid

代码语言:javascript
复制
'''
jointplot()函数使用JointGrid来管理图形。
为了获得更多的灵活性,可以直接使用JointGrid绘制图形
'''
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$");

参考资料:数据可视化Seaborn从零开始学习教程(三) 数据分布可视化篇

3.作者的话

最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢! 更多内容,请关注本公众号机器学习系列!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 机器学习之数据之美
    • 0.说在前面
      • 1.单变量分布
        • 2.双变量分布
          • 3.作者的话
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档