机器学习第四周----总结


本周的主题是数据可视化,主要讲解了两个用于可视化的库:Matplotlib和Seaborn,并对一些工程数据进行可视化。
## Matplotlib ##
Matplotlib继承了R和Matlib的若干属性。
一,可视化图的基本机构:
通常,使用 numpy 组织数据, 使用 matplotlib API 进行数据图像绘制。一幅数据图基本上包括如下结构:
Data: 数据区,包括数据点、描绘形状
Axis: 坐标轴,包括 X 轴、 Y 轴及其标签、刻度尺及其标签
Title: 标题,数据图的描述
Legend: 图例,区分图中包含的多种曲线或不同分类的数据
如下图所示:

1.png

二,画法:
以常规图为例,按照绘图结构,可将数据图的绘制分为如下几个步骤:
• 导入 matplotlib 包相关工具包
• 准备数据,numpy 数组存储
• 绘制原始曲线
• 配置标题、坐标轴、刻度、图例
• 添加文字说明、注解
• 显示、保存绘图结果
1,绘制基本曲线
代码如下:

plt.rcParams["figure.figsize"] = (12,8)   #设置图像的大小
plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')    
plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')

plt.plot()参数说明:x,y1分别表示x维度和y维度的数据;linewidth表示图像的线的粗细;color表达线段的颜色;linestyle表示图像线段的形状,marker表示图像上的点的显示情况,linestyle和marker的表达如下所示:

2.png


Label会在图像中显示,它会与legend配合使用。

2,为图标设置坐标轴spines
ax = plt.subplot(111) #表示一行一列的第一个图
        
    ax.spines['right'].set_color('none')     # 去掉右边的边框线
ax.spines['top'].set_color('none')       # 去掉上边的边框线

移动下边边框线,相当于移动 X 轴

ax.xaxis.set_ticks_position('bottom')    #先将x轴设置成bootom
ax.spines['bottom'].set_position(('data', 0))  #其实就是将x轴设置到0处

移动左边边框线,相当于移动 y 轴

ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))  


3,可通过如下代码,设置刻度尺间隔 lim、刻度标签 ticks

设置 x, y 轴的刻度取值范围

plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)

设置 x, y 轴的刻度标签值

plt.xticks([2, 4, 6, 8, 10], [r'2', r'4', r'6', r'8', r'10'])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],[r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])

4,可通过如下代码,设置 X、Y 坐标轴和标题:

设置标题、x轴、y轴

plt.title(r'$the \ function \ figure \ of \ cos(), \ sin() \ and \ sqrt()$', fontsize=19)
plt.xlabel(r'$the \ input \ value \ of \ x$', fontsize=18, labelpad=88.8)
plt.ylabel(r'$y = f(x)$', fontsize=18, labelpad=12.5)

5,可通过如下代码,在数据图中添加文字描述 text:
    plt.text(0.8, 0.9, r'$x \in [0.0, \ 10.0]$', color='k', fontsize=15)
plt.text(0.8, 0.8, r'$y \in [-1.0, \ 4.0]$', color='k', fontsize=15)


6,可通过如下代码,在数据图中给特殊点添加注解 annotate:
    # 特殊点添加注解
plt.scatter([8,],[np.sqrt(8),], 50, color ='m')  # 使用散点图放大当前点
plt.annotate(r'$2\sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))


7,设置图例
plt.legend(['cos(x)', 'sin(x)', 'sqrt(x)'], loc='upper right')
loc指定图例出现的位置。若legend中只有loc没有指定[]信息,则会寻找plt.plot()中的label的信息。


三,常用图形
1,曲线图:查看数据变化的情况
x = np.arange(-5,5,0.1)
y = x ** 2

plt.plot(x,y)
2,灰度图:统计某商品的热度,体现其分布的情况
x = np.random.normal(size=1000)
plt.hist(x, bins=10)
3,散点图:灰度图可以展现两个维度之间的关系
plt.rcParams["figure.figsize"] = (8,8)
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
plt.scatter(x,y)
4,箱线图
plt.boxplot(x)

## Seaborn ##
seaborn:让分布更直观
seaborn是通过可视化的方式来分析数据,它可以画出matplotlib中所有的图,除了饼状图。
一:几种常见的图:
1,灰度图
用法:sns.distplot(x, kde=False, bins=20, rug=True)
参数说明:x表示要展示的数据; bins:表示桶的数量,可以默认也可以自己指定;rug:为True时会在图像中显示样本,通过这个参数可以找到合适的bins数;
kde:表示核密度估计,当设为True之后会从数学上展示拟合效果。


2,双变量分布
如下是两个相关的正态分布:
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)


3.散点图
sns.jointplot(x="x", y="y", data=df)
显示两个维度的数据间的关系


4,六角箱图
适用于数据点比较多的情景,当数据量比较大的时候使用散点图速度会很慢,此时使用六角箱图比较好。如下调用:
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("ticks"):
sns.jointplot(x=x, y=y, kind="hex")


5,核密度估计
能够清晰展现数据的具体分布情况;sns.jointplot(x="x", y="y", data=df, kind="kde")


!由上可以知道3,4,5三种图像都是通过sns.jointplot()来展现的,通过参数kind来决定获取什么样的图,默认是散点图 kind='scatter',kind="hex"为六角箱图,
kind="kde"为和密度估计图


二,数据集中的两两关系
可以通过如下语句来展现数据集中两两维度间的关系:iris = sns.load_dataset("iris"); sns.pairplot(iris);
会自动便利iris两两数据间的关系,以直方图和散点图的方式给出。




三,探索变量间的关系 --- 万能的sns.lmplot函数
sns.lmplot(x,y,data):它有严格的格式要求,x,y必须是DataFrame的columns,不可以是Series。它会默认的给予拟合曲线95%的置信区间
1,绘制线性回归模型
最简单的方式:散点图 + 线性回归 + 95%置信区间
sns.lmplot(x="total_bill", y="tip", data=tips)

2,当变量间的关系是离散和线性时,图像不够明显,可以使用两种方法避免:
一,给离散的那一维加上抖动:
sns.lmplot(x="size", y="tip", data=tips, x_jitter=.05) 给离散的x轴加上了0.5的抖动,使数据展示的更清晰。
二,离散取值上用均值和置信区间代替散点
sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean)


3,拟合不同模型
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), order=2, ci=None, scatter_kws={"s": 80})
使用关键字‘order’来拟合不同维度的数据,


4,去除异常点
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"), robust=True, ci=None, scatter_kws={"s": 80})
使用关键字robust=True,这样可以增强数据的鲁棒性,会忽略掉较差数据对拟合的影响,


5,对于二值数据的拟合:
sns.lmplot(x="total_bill", y="big_tip", data=tips, logistic=True, y_jitter=.03, ci=None)
使用关键字logistic=True,会使用核函数为sigmoid,以逻辑回归的方式来拟合这个二分问题。


6,使用残差曲线评价拟合效果
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), scatter_kws={"s": 80})






7,变量间的条件关系摸索
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
关键字hue="smoker";需要“smoker”是离散型的变量,使用hue就可以将数据分组,然后计算分组之后的数据中x与y之间的关系。
还可以尝试更多的分类条件:
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips)
将显示time为Lunch和Dinner的条件下smoker条件下x与y的关系的两列图。
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", row="sex", data=tips)
将显示time为Lunch和Dinner的两行,sex为Male和Female的两列的四幅图中x与y的关系。
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, col_wrap=2, size=5)
通过关键字col_wrap=2来设置结果中每行显示的图的列数。




四,分类数据的可视化分析
观测点的直接展示:swarmplot, stripplot
观测近似分布的展示:boxplot, violinplot
均值和置信区间的展示:barplot, pointplot


1,分类散点图:当有一维数据是分类数据时,散点图成为了条带形状。
与lmplot不同之处在于它不会自己拟合。
可以使用抖动的方式使数据显示的更清晰:
sns.stripplot(x="day", y="total_bill", data=tips, jitter=True)
可以是生成蜂群图,避免散点重叠~:
sns.swarmplot(x="day", y="total_bill", data=tips)


在每一个一级分类内部可能存在二级分类
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips)

此处的hue更前面的相似


2,分类分布图
箱图:上边缘、上四分位数、中位数、下四分位数、下边缘
sns.boxplot(x="day", y="total_bill", hue="time", data=tips)


提琴图 = 箱图 + KDE(Kernel Distribution Estimation)
sns.violinplot(x="total_bill", y="day", hue="time", data=tips, bw=.1, scale="count", scale_hue=False)

其中bw越小那么分布的宽度越窄;
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True, inner="stick")
split=True那么会将两个不同类放在一起展示。


3,分类统计估计图
统计柱状图:sns.barplot(x="sex", y="survived", hue="class", data=titanic)
灰度柱状图:sns.countplot(x="deck", data=titanic, palette="Greens_d")
点图: sns.pointplot(x="sex", y="survived", hue="class", data=titanic)
点图会显示数据的均值和方差


4,分类子图
它是通用图,在使用的时候使用参数kind来表示会显示什么数据图。
sns.factorplot(x="day", y="total_bill", hue="smoker", col="time", data=tips, kind="swarm")
swarm表示蜂群图,count表示计数并用柱状图显示


palette表示的是调色板,可以是palette='winter_d',也可以是palette='cool'显示的颜色结果会不一样






0 个评论

要回复文章请先登录注册

返回顶部