赞
踩
在进行机器学习建模之前,需要对数据进行分析,判断各特征(属性,维度)的数据分布及其之间的关系成为十分必要的环节,本文利用Pandas和Numpy的散布矩阵函数及相关系数函数对数据集特征及其关系进行实例分析。
Pandas中散布矩阵的函数原型为:
def scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, diagonal='hist', marker='.', density_kwds=None,hist_kwds=None, range_padding=0.05, **kwds)
各参数如下:
diagonal参数取’hist’值时,表示散布矩阵的对角线上的图形为数据集各特征的直方图。直方图是一种可对值频率进行离散化显示的柱状图,数据点被拆分到离散的,间隔均匀的面元中,绘制的是各面元中数据点的数量。
例如有1维整型数组,共有元素440个,按照值从大至小的顺序排列后,其散布图与直方图如下所示:
diagonal参数取’kde’值时,表示散布矩阵的对角线上的图形为数据集各特征的核密度估计(Kernel Density Estimation,KDE)。核密度估计是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。简单来说,核密度估计就是在当前数据集(连续型数据样本)已知的情况下,通过计算来获取该样本分布的概率密度函数;在计算获取时需要用到核函数,如Gaussian Kernel Density、Exponential Kernel Density、Cosine Kernel Density等,不同核函数可以得到样本整体趋势和密度分布规律性基本一致的结果;影响该结果的还包括带宽(bandwidth),带宽值过大或过小都会影响估计结果;关于核密度估计的进一步论述请参考这里。
以相同的1维整型数组为例,使用Gaussian Kernel Density估计得到的密度函数如下所示:
以优达学城的数据集为例,来说明散布矩阵函数的使用方法。该数据集是某供货商统计的各类客户的年度采购额,每行数据为1个客户的采购记录,共440行;数据集包括6个维度——Fresh(生鲜)、Milk(奶制品)、Grocery(杂货)、Frozen(冷藏食品)、Detergents_Paper(清洁纸)、Delicatessen(熟食品),记录了客户采购不同门类产品的情况;数据集元素均为整型数据,无缺失值。
import pandas as pd
import matplotlib.pyplot as plt
try:
data = pd.read_csv("customers_dataset.csv")
except:
print "Dataset could not be loaded."
pd.plotting.scatter_matrix(data, alpha=0.7, figsize=(14,8), diagonal='kde')
plt.show()
在上文介绍diagonal参数取’hist’、’kde’值时,绘图所用数据为Fresh列数据;从图中可以看出,单列数据绘制的密度函数曲线与本图左上角第1个子图一致。
图中对角线上的子图均为经高斯核密度估计后的密度函数曲线,scatter_matrix函数源码中对应部分如下:
……
# Deal with the diagonal by drawing a histogram there.
if diagonal == 'hist':
ax.hist(values, **hist_kwds)
elif diagonal in ('kde', 'density'):
from scipy.stats import gaussian_kde
y = values
gkde = gaussian_kde(y)
ind = np.linspace(y.min(), y.max(), 1000)
ax.plot(ind, gkde.evaluate(ind), **density_kwds)
……
散布矩阵图呈对称结构,除对角上的密度函数图之外,其他子图分别显示了不同特征列之间的关联关系,如Grocery与Detergents_Paper之间、Grocery与Milk之间、Milk与Detergents_Paper之间近似成线性关系,说明该些特征之间关联性很强;相反地,其他各特征列之间的散布状态比较杂乱,基本无规律可循,说明各特征之间的关联性不强。
分析数据集各特征(列)之间的关系时,散布矩阵能以图形的形式“定性”给出各特征之间的关系,如要进一步“定量”分析,则需要使用相关系数。
在统计学中,皮尔逊积矩相关系数(Pearson product-moment correlation coefficient,又称作 PPMCC或PCCs, 常用r或Pearson’s r表示)用于度量两个变量X和Y之间的相关关系(线性相关),其值介于-1与1之间。在进行数据分析时,常用作度量各特征之间的相关程度。
Numpy中的计算相关系数的函数为:
corrcoef(x, y=None, rowvar=True, bias=<class numpy._globals._NoValue>, ddof=<class numpy._globals._NoValue>)
各参数如下:
仍以优达学城的数据集为例,计算各特征之间的相关系数并绘图:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
try:
data = pd.read_csv("customers_dataset.csv")
except:
print "Dataset could not be loaded."
cov = np.corrcoef(data.T)
img = plt.matshow(cov,cmap=plt.cm.winter)
plt.colorbar(img, ticks=[-1,0,1])
plt.xticks(np.arange(len(data.keys())), data.keys())
plt.yticks(np.arange(len(data.keys())), data.keys())
plt.show()
该图形也为对称结构,依据相关系数的计算式,其对角线上的相关系数为1;子图颜色越接近绿色表示相关系数越接近1,特征相关性越强且为正相关,子图颜色接近另一个极端(-1)时,特征之间相关性也很强且为负相关;本例相关系数最小值为-0.132,蓝色最浓的子图即为该值,0处的颜色表示特征之间不相关(相关系数为0)。
从图中可以看出,Grocery与Detergents_Paper特征相关性最强,Grocery与Milk、Milk与Detergents_Paper特征之间也有较强相关性,其余各特征之间相关性较弱、甚至不相关,该结论与散布矩阵图得出的结论一致。
对于给定数据集,Pandas的scatter_matrix函数能够显示各特征的密度函数曲线,能大致显示各特征之间的相关关系,Numpy的corrcoef函数能够准确计算各特征之间的相关系数,且能借助Matplotlib库以图形形式直观表达。
http://blog.csdn.net/sinat_25059791/article/details/71336557
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。