密度图用于可视化数据集中连续数值变量的分布。它也称为核密度图。
在开始对数据应用任何机器学习技术之前,最好先充分了解您的数据。
作为一名优秀的机器学习从业者,我们应该问一些问题,例如:
- 我们的数据是什么样的?
- 它是正态分布还是具有某种不同的形状?
- 我们打算应用于数据的算法,它是否对数据分布有任何潜在的假设?
在我们获取数据后立即解决这些问题可以极大地改善后期的结果并节省我们大量的时间。
直方图和密度图等图为我们提供了回答上述问题的方法。
为什么在学习密度图之前先了解直方图?
密度图与直方图非常相似。我们使用直方图可视化分布的形状。可以通过对数据进行分箱并保留每个分箱中的观测值计数来创建直方图。在直方图中,y 轴通常表示 bin 计数,但也可以用每单位的计数(也称为密度)表示。
如果我们增加直方图中的箱数,分布形状会显得更平滑。
现在,想象一条平滑的连续线穿过每个箱的顶部,创建我们的分布形状的轮廓。我们得到的结果就是所谓的密度图。
了解密度图
我们可以将密度图视为平滑直方图的图,这现在非常直观。密度图主要使用 核密度估计。核密度估计可以通过消除噪声来实现更平滑的分布。
密度图不受箱数的影响,箱数是考虑直方图时的主要参数,因此使我们能够更好地可视化数据的分布。
总之,它就像一个直方图,但在每个箱的顶部绘制了一条平滑的曲线。
野外存在多种分布形式。我们很可能遇到的一些最常见的形状是:
使用 Python 绘制密度图
我们可以使用 python 以多种方式绘制密度图。我们来看看几种常用的方法。
1.使用Python scipy.stats模块
scipy.stats
模块为我们提供了gaussian_kde
类来找出给定数据的密度。
import numpy as np import matplotlib.pyplot as plt from scipy.stats import gaussian_kde data = np.random.normal( 10 , 3 , 100 ) # Generate Data density = gaussian_kde(data) x_vals = np.linspace( 0 , 20 , 200 ) # Specifying the limits of our data density.covariance_factor = lambda : . 5 #Smoothing parameter density._compute_covariance() plt.plot(x_vals,density(x_vals)) plt.show() |
covariance_factor
我们更改类的函数gaussian_kde
并传递不同的值以获得更平滑的绘图。_compute_covariance
记得更改函数后调用。
2.使用Seabornkdeplot
模块
Seaborn模块为我们提供了一种更简单的方法来执行上述任务,并且更加灵活。
import numpy as np import seaborn as sb import matplotlib.pyplot as plt data = np.random.normal( 10 , 3 , 300 ) #Generating data. plt.figure(figsize = ( 5 , 5 )) sb.kdeplot(data , bw = 0.5 , fill = True ) plt.show() |
Seabornkdeplot
需要一个单变量数据数组或一个 pandas 系列对象作为其输入参数。该bw
参数相当于上面演示的类covariance_factor
的gaussian_kde
参数。我们可以传递fill
=False
来不用颜色填充曲线下方的区域,而只是绘制一条曲线。
3.使用pandas绘图功能
Pandasplot
方法还可以通过提供kind = 'density'
输入参数来绘制密度图。
import numpy as np import pandas as pd import matplotlib.pyplot as plt x_values = np.random.random( 10 , 3 , 300 ) #Generating Data df = pd.DataFrame(x_values, columns = [ 'var_name' ] ) #Converting array to pandas DataFrame df.plot(kind = 'density) |
4.使用Seaborndistplot
我们还可以使用seaborndistplot
方法来可视化连续数值数据的分布。seaborn.distplot( )
方法需要一个单变量数据变量作为输入参数,它可以是 pandas 系列、一维数组或列表。
seaborn.distplot( )
我们可以根据需要传递一些重要参数来调整绘图:
hist
: ( Type – Bool ) 是否绘制直方图。kde
: ( Type – Bool) 是否绘制高斯核密度估计。bins
:(类型 – 数字)指定直方图中的箱数。hist_kws
:(类型 – 字典)matplotlib.axes.Axes.hist() 的关键字参数字典kde_kws
:(类型 – Dict)kdeplot()的关键字参数 作为字典传递。
import numpy as np import matplotlib.pyplot as plt import seaborn as sb data = np.random.normal( 10 , 3 , 1000 ) #Generating data randomly from a normal distribution. sb.set_style( "whitegrid" ) # Setting style(Optional) plt.figure(figsize = ( 10 , 5 )) #Specify the size of figure we want(Optional) sb.distplot(x = data , bins = 10 , kde = True , color = 'teal' \ , kde_kws = dict (linewidth = 4 , color = 'black' )) plt.show() |
要了解有关seaborn的更多信息,distplot
您可以参考这篇有关seaborn Distplots的文章。
结论
这使我们进入了文章的结尾!我们希望您今天已经了解了很多有关不同密度图的知识。您可以阅读这些文章以了解有关我们在本文中使用的Pandas和Matplotlib库的更多信息。