MachineLearning入门-7(数据理解)

为了得到更准确的结果,必须理解数据的特征、分布情况,以及需要解决的问题,以便建立和优化算法模型。

  • 简单的查看数据
  • 审查数据的维度
  • 审查数据的类型和属性
  • 总结查看数据分类的分布情况
  • 通过描述性统计分析数据
  • 理解数据属性的相关性
  • 审查数据的分布状态

简单的查看数据

 对数据的简单审视,是加强对数据的理解最有效的方法之一。通过对数据的观察,可以发现数据内在关系。

from pandas import read_csv
#使用pandas导入CSV数据,显示数据的前10行
filename=‘/home/aistudio/work/pima_data1.csv‘
names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘]
data=read_csv(filename,names=names)
peak=data.head(10)
print(peak)
preg  plas  pres  skin  test  mass   pedi  age  class
  148    72    35     0  33.6  0.627   50      1
   85    66    29     0  26.6  0.351   31      0
  183    64     0     0  23.3  0.672   32      1
   89    66    23    94  28.1  0.167   21      0
  137    40    35   168  43.1  2.288   33      1
  116    74     0     0  25.6  0.201   30      0
   78    50    32    88  31.0  0.248   26      1
  115     0     0     0  35.3  0.134   29      0
  197    70    45   543  30.5  0.158   53      1
  125    96     0     0   0.0  0.232   54      1

数据的维度

在机器学习中要注意数据的行和列,必须对所有的数据非常了解,要知道有多少行和多少列,这是因为:

太多的行会导致花费大量时间来训练得到模型;太少的数据会导致对算法的训练不充分,得不到合适模型。

如果数据具有太多的特征,会引起某些算法性能低下的问题。

通过DataFrame的shape属性,可以很方便查看数据集中有多少行、列。

1 print(data.shape)
(768, 9)

数据的类型和属性

数据的类型是很重要的一个属性。字符串会被转化为浮点数或整数,以便于计算和分类。可以通过DataFrame的Type属性来查看每一个字段的数据类型。

1 print(data.dtypes)
preg       int64
plas       int64
pres       int64
skin       int64
test       int64
mass     float64
pedi     float64
age        int64
class      int64
dtype: object

描述性统计

描述性统计可以给出一个更加直观、更加清晰的视觉,以加强对数据的理解。可通过DataFrame的describe()方法给我们展示八方面得信息:数据记录数、平均值、标准方差、最小值、下四分位数、中位数、上四分位数、最大值。这些信息主要用来描述数据的分布情况。

from pandas import set_option
set_option(‘display.width‘,100)
#设置数据的精度
set_option(‘precision‘,4)
print(data.describe())
preg      plas      pres   ...         pedi       age    class
count  768.0000  768.0000  768.0000   ...     768.0000  768.0000  768.000
mean     3.8451  120.8945   69.1055   ...       0.4719   33.2409    0.349
std      3.3696   31.9726   19.3558   ...       0.3313   11.7602    0.477
min      0.0000    0.0000    0.0000   ...       0.0780   21.0000    0.000
25%      1.0000   99.0000   62.0000   ...       0.2437   24.0000    0.000
50%      3.0000  117.0000   72.0000   ...       0.3725   29.0000    0.000
75%      6.0000  140.2500   80.0000   ...       0.6262   41.0000    1.000
max     17.0000  199.0000  122.0000   ...       2.4200   81.0000    1.000

数据分组分布(适用于分类算法)

在分类算法中,需要知道每个分类的数据大概有多少条记录,以及数据分布是否平衡。如果数据分布的平衡性很差,需要在数据加工阶段进行数据处理,来提高数据分布的平衡性。

1 print(data.groupby(‘class‘).size())
class
0    500
1    268
dtype: int64

数据属性的相关性

数据属性中的相关性是指数据的两个属性是否互相影响,以及这种影响是什么方式的等。非常通用的计算两个属性的相关性的方法是皮尔森相关系数,皮尔森相关系数是度量两个变量间相关程度的方法。它是一个介于1和-1之间的值,其中,1表示完全正相关,0表示无关,-1表示完全相关。

在自然科学领域,该系数广泛用于度量两个变量之间的相关程度。

在机器学习中,当数据的关联程度比较高时,有些算法(如linear,逻辑回归等)的性能会降低,所以在开始训练前,查看一下算法的关联性是一个很好的方法。当数据特征的相关性比较高时,应该考虑对特征进行降维处理。

下面通过使用DataFrame的corr()方法来计算数据集中数据属性之间的关联关系矩阵。

1 print(data.corr(method=‘pearson‘))
preg    plas    pres    skin   ...      mass    pedi     age   class
preg   1.0000  0.1295  0.1413 -0.0817   ...    0.0177 -0.0335  0.5443  0.2219
plas   0.1295  1.0000  0.1526  0.0573   ...    0.2211  0.1373  0.2635  0.4666
pres   0.1413  0.1526  1.0000  0.2074   ...    0.2818  0.0413  0.2395  0.0651
skin  -0.0817  0.0573  0.2074  1.0000   ...    0.3926  0.1839 -0.1140  0.0748
test  -0.0735  0.3314  0.0889  0.4368   ...    0.1979  0.1851 -0.0422  0.1305
mass   0.0177  0.2211  0.2818  0.3926   ...    1.0000  0.1406  0.0362  0.2927
pedi  -0.0335  0.1373  0.0413  0.1839   ...    0.1406  1.0000  0.0336  0.1738
age    0.5443  0.2635  0.2395 -0.1140   ...    0.0362  0.0336  1.0000  0.2384
class  0.2219  0.4666  0.0651  0.0748   ...    0.2927  0.1738  0.2384  1.0000

[9 rows x 9 columns]上面就是执行之后会得到一个每个属性相互影响的矩阵

数据的分布分析

通过分析数据的高斯分布情况来确认数据的偏离情况。高斯分布又叫正态分布,是在数据、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响。高斯分布的曲线呈钟形,两头低,中间高,左右对称。

在高斯分布图中,y轴两点之间的面积是发生的概率。在很多机器学习算法中都会假定数据遵循高斯分布,先计算数据的高斯偏离状况,再根据偏离状况准备数据。

我们可以使用DataFrame的skew()方法来计算所有数据属性的高斯分布偏离情况。

1 print(data.skew())
preg     0.9017
plas     0.1738
pres    -1.8436
skin     0.1094
test     2.2723
mass    -0.4290
pedi     1.9199
age      1.1296
class    0.6350
dtype: float64shew()函数的结果显示数据分布是左偏还是右偏。当数据接近0时,表示数据的偏差非常小。

相关推荐