开个玩笑了,其实可视化想做深入,只看这一篇,必然是不够的了~ 入个门估计差不多可以的。
为什么写这一篇呢?算是继续上一篇最嗨的歌最快的车:Data Fountain光伏发电量预测 Top1 开源分享zhuanlan.zhihu.com
写的,上一篇概括了数据分析比赛的思路和整体流程,从这篇开始写每个部分如何操作。当然不止适用于比赛,常规的Projec也是可以参考。
一般的数据比赛,时间紧任务重,高效的探索性分析显得很重要,说白了作图可视化,必须要做,因为不做不知道数据的规律没有思路,做可视化又不舍得花太多时间,所以提前准备好大概的框架很有必要。。
第一次接触比赛的时候为了看个分布图,拿Python找了半天不知道咋搞,最后开了SPSS搞。。然而SPSS作图功能又有限,Python相比起来灵活很多。。了解可视化和Python做图的地方太多了,Kaggle, datacamp, 各种包推出的官方文档都是好资源,特别是Kaggle最近修改了自己提供的Kernel服务,随便注册下就可以免费使用4CPU,17G内存,5G硬盘带NVIDIA Tesla K80 GPU的机器,还是很慷慨的。毕竟这个配置自己买下来至少要3万多我估计,可以去试试。
言归正传,记录下学来的各种作图。
本文所演示的的可视化方法散点图 (Scatterplot)
直方图 (Histogram)
小提琴图 (Violinplot)
特征两两对比图(Pairplot)
安德鲁斯曲线 (Andrews curves)
核密度图 (Kernel density estimation plot)
平行坐标图 (Parallel coordinates)
Radviz (力矩图?)
热力图 (Heatmap)
气泡图 (Bubbleplot)
这里主要使用Python一个流行的作图工具: Seaborn library,同时Pandas和bubbly辅助。为什么Seaborn比较好?
因为很多时候数据分析,建模前,都要清洗数据,清洗后数据的结果总要有个格式,我知道的最容易使用,最方便输入模型, 最好画图的格式叫做"Tidy Data" (Wickham H. Tidy data[J]. Journal of Statistical Software, 2014, 59(10): 1-23.) 其实很简单,Tidy Data格式就是:每条观察(记录)自己占一行
观察(记录)的每个特征自己占一列
举个例子,我们即将作图的数据集IRIS就是Tidy Data(IRIS(IRIS数据集)_百度百科):
Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
该数据集包含了5个属性:
Sepal.Length(花萼长度),单位是cm;
Sepal.Width(花萼宽度),单位是cm;
Petal.Length(花瓣长度),单位是cm;
Petal.Width(花瓣宽度),单位是cm;
种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
# 这里引入所用到的包
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="white", color_codes=True)
# 读入数据
iris = pd.read_csv("Iris.csv") # the iris dataset is now a Pandas DataFrame
# 看下数据前5行
iris.head()IRIS数据
可以看到,每条观察(ID=0,1,2...)自己占一行,每个特征(四个部位长/宽度,种类)自己占一列。Seaborn就是为Tidy Data设计的,所以方便使用。
所以这个数据集有6列,6个特征,很多时候做可视化就是为了更好的了解数据,比如这里就是想看每个种类的花有什么特点,怎么样根据其他特征把花分为三类。我个人的喜好是首先一张图尽量多的包含数据点,展示数据信息,从中发现规律。我们可以利用以下代码完全展示全部维度和数据这里用的bubbly:
from bubbly.bubbly import bubbleplot
from __future__ import division
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()
#这里设置x,y,z轴,气泡,气泡大小,气泡颜色分别代表6列~在二维平面想展示6个维度,除了x,y,z之外,
#只能用颜色,大小等代表其他维度了,bubbly还可以承受更高维度的数据,可以自己搜索
figure = bubbleplot(dataset=iris, x_column='SepalLengthCm', y_column='PetalLengthCm', z_column='SepalWidthCm',
bubble_column='Id', size_column='PetalWidthCm', color_column='Species',
x_title="SepalLength(Cm)", y_title="PetalLength(Cm)", z_title='SepalWidth(Cm)',
title='IRIS Visualization',
x_logscale=False,scale_bubble=0.1,height=600)
#展示图片
iplot(figure, config={'scrollzoom': True})三维图,全局观察
Python做出来,其实是一张可以拖动角度,放大缩小的图,拖一拖看各角度视图会发现三类还是分的挺明显的。Github上这个bubbly还是很厉害的,方便。
接下来开始做一些基础的可视化,没有用任何修饰,代码只有最关键的画图部分,可视化作为比赛的一个基础和开端,个人理解做出的图能看就行,美不美无所谓,不美也不扣分。因为
散点图,可以得到相关性等信息,比如基本上SepalLengthCm越大,SepalWidthCm越大
# 普通二维散点图
sns.FacetGrid(iris, hue="Species", size=5) \
.map(plt.scatter, "SepalLengthCm", "SepalWidthCm") \
.add_legend()散点图
使用Jointplot, 看两个变量的分布,KDE图,同时展示对应的数据点
sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris,kind="reg")
就像上一篇说的,比赛中的每个环节都至关重要,很有必要看下这些分布直方图,kde图,根据这些来处理异常值等,这里请教,为什么画了直方图还要画KDE??我理解说的都是差不多的东西。
关于KDE:"由于核密度估计方法不利用有关数据分布的先验知识,对数据分布不附加任何假定,是一种从数据样本本身出发研究数据分布特征的方法,因而,在统计学理论和应用领域均受到高度的重视。"
无论如何,我们先画直方图,再画KDE
# 画不同Species情况下,SepalWidthCm直方图
g = sns.FacetGrid(iris, col="Species")
g = g.map(plt.hist, "SepalWidthCm", bins=20)直方图
# 画不同Species情况下,PetalLengthCm KDE图
sns.FacetGrid(iris, hue="Species", size=6) \
.map(sns.kdeplot, "PetalLengthCm") \
.add_legend()KDE 图
这里通过KDE可以说,由于Setosa的KDE与其他两种没有交集,直接可以用Petailength线性区分Setosa与其他两个物种。
# Pairplot, 看三个品种在不同的两特征组合中的区分情况,对角线由于X,Y是一个特征,多以画了KDE
sns.pairplot(iris.drop("Id", axis=1), hue="Species", size=3, diag_kind="kde")Pairplot
箱线图,显示一组数据分散情况的统计图。形状如箱子。主要用于反映原始数据分布的特征,关键的5个黑线是最大值、最小值、中位数和两个四分位数。在判断异常值,处理异常值时候有用。
#箱线图,可以把原始数据点加上,用jitter=True避免点重合
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
ax = sns.stripplot(x="Species", y="PetalLengthCm", data=iris, jitter=True, edgecolor="gray")BoxPlot
小提琴图
# 小提琴图,箱线图与核密度图的结合体,能代表的信息和上图相似
sns.violinplot(x="Species", y="PetalLengthCm", data=iris, size=6)Violinplot
from pandas.tools.plotting import andrews_curves
andrews_curves(iris.drop("Id", axis=1), "Species")
这个Andrews curves很有趣,它是把所有特征组合起来,计算个值,展示该值,可以用来确认这三个物种到底好不好区分,维基百科的说法是“If there is structure in the data, it may be visible in the Andrews' curves of the data.”(Andrews plot - Wikipedia)Andrews' curves
# parallel_coordinates 做法是把每个特征放一列,不同物种用不同颜色连起来看看有没有规律
from pandas.tools.plotting import parallel_coordinates
parallel_coordinates(iris.drop("Id", axis=1), "Species")
# radviz
from pandas.tools.plotting import radviz
radviz(iris.drop("Id", axis=1), "Species")radviz
Radviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术,是基于圆形平行坐标系的设计思想而提出的多维可视化方法。圆形的m条半径表示m维空间,使用坐标系中的一点代表多为信息对象,其实现原理参照物理学中物体受力平衡定理。 多维空间的点映射到二维可视空间的位置由弹簧引力分析模型确定。 (Radviz可视化原理 - CSDN博客) ,能展示一些数据的可区分规律。
#特征间相关系数热力图
f = iris.drop("Id", axis=1).corr()
sns.heatmap(f, annot=True)
数值是皮尔森相关系数,浅颜色表示相关性高,比如Petal.Length(花瓣长度)与 Petal.Width(花瓣宽度)相关性0.96,也就是花瓣长的花,花瓣宽度也大,也就是个大花。
这些是我见过比较常用的,对数据探索有帮助的可视化方法。
实际上现在机器学习的很多方向,包括可视化都在做自动化,也就是把数据一输入,点点鼠标全搞定,可视化真的需要这种自动化,能提高效率的好东西。
关于机器学习的自动化,尝试过Auto Sklearn和IBM的Waston Studio, Auto Sklearn可以自动,建模,调参,融合,但是特征得自己搞,参数拟合用的是贝叶斯,效果还不错,依旧开发中,值得期待,之前比赛中期Auto Sklearn的结果可以拿来当作一个子模型参与融合。后期它精度跟不上了,我猜是调参的方法加上缺少几个算法造成的。希望它可以加入更多的模型供选择,应该会强大更多,更多细节可以浏览同学写过得一个详细教程:http://codewithzhangyi.com/2018/07/26/AutoML/codewithzhangyi.com
机器学习这些东西,更新太快,必须得紧跟时代,哪天出了什么新的东西,千万不能守着自己原来做过的东西不放,一直保持开放的学习态度还是重要的。
原来上学时候有个做传统信号处理的老师说“什么什么神经网络?都是XXX扯淡。。。”然后第二年,神经网络大热,拿下各种冠军。。可能他对自己的研究投入太多,确实难放下,所以排斥新方法。