【机器学习】数据的数据表示和可视化

【机器学习】数据的数据表示和可视化

机器学习是关于使模型适应数据。出于这个原因,我们首先展示如何表示数据以便计算机理解。

在本章的开头,我们引用了 Tom Mitchell 对机器学习的定义:“适定学习问题:一个计算机程序被称为从经验 E 中学习关于某些任务 T 和某些性能度量 P,如果它在 T 上的性能,为由 P 衡量,随着经验 E 改进。” 数据是机器学习的“原材料”。它从数据中学习。在 Mitchell 的定义中,“数据”隐藏在“体验 E”和“绩效衡量 P”这两个术语之后。如前所述,我们需要标记数据来学习和测试我们的算法。

但是,建议您在开始训练分类器之前先熟悉数据。

Numpy 提供了理想的数据结构来表示您的数据,而 Matplotlib 为可视化您的数据提供了巨大的可能性。

在下面,我们想展示如何使用 sklearn 模块中的数据来做到这一点。

虹膜数据集,机器学习的“Hello World”

你看到的第一个程序是什么?我敢打赌,这可能是一个用某种编程语言发出“Hello World”的程序。很可能我是对的。几乎所有关于编程的介绍性书籍或教程都以这样的程序开头。这种传统可以追溯到 1968 年 Brian Kernighan 和 Dennis Ritchie 合着的“C 编程语言”一书!

您将在机器学习介绍性教程中看到的第一个数据集是“Iris 数据集”的可能性同样很高。鸢尾花数据集包含来自 3 个不同物种的 150 朵鸢尾花的测量结果:

  • 鸢尾花,
  • 变色鸢尾,和
  • 鸢尾花-弗吉尼亚。

鸢尾花

【机器学习】数据的数据表示和可视化

变色鸢尾

【机器学习】数据的数据表示和可视化

鸢尾花

【机器学习】数据的数据表示和可视化

鸢尾花数据集因其简单性而经常被使用。该数据集包含在 scikit-learn 中,但在深入研究 Iris 数据集之前,我们将查看 scikit-learn 中可用的其他数据集。

使用 Scikit-learn 加载虹膜数据

例如,scikit-learn 有一组非常简单的关于这些鸢尾花的数据。数据包括以下内容:

  • 鸢尾花数据集中的特征:

    1. 萼片长度厘米
    2. 萼片宽度厘米
    3. 花瓣长度厘米
    4. 花瓣宽度厘米
  • 要预测的目标类别:

    1. 鸢尾花
    2. 变色鸢尾
    3. 鸢尾花

【机器学习】数据的数据表示和可视化

scikit-learn 嵌入 iris CSV 文件的副本以及帮助函数以将其加载到 numpy 数组中:

from  sklearn.datasets  import  load_iris 
iris  =  load_iris ()

结果数据集是一个 Bunch 对象:

类型(虹膜)

输出:

sklearn.utils.Bunch

您可以使用以下方法查看此数据类型可用的内容 keys() :

虹膜。键()

输出:

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])

Bunch 对象类似于字典,但它还允许访问属性样式中的键:

打印(虹膜[ “target_names” ])
打印(虹膜。target_names )

输出:

['setosa''杂色''弗吉尼亚']
['setosa''杂色''弗吉尼亚']

每个样本花的特征存储在 data 数据集的属性中:

n_samples ,  n_features  =  iris 。数据。形状
打印(“样品数:” , N_SAMPLES次)
打印(“的特征数:” , n_features )
#萼片长度,萼片宽度,花瓣长度和第一样本(第一花)的花瓣宽度
打印(虹膜。数据[ 0 ])

输出:

样本数:150
功能数量:4
[5.1 3.5 1.4 0.2]

每朵花的特征都存储在 data 数据集的属性中。让我们来看看一些示例:

# 指数为 12、26、89 和 114 
iris 的花。数据[[ 12 ,  26 ,  89 ,  114 ]]

输出:

数组([[4.8, 3., 1.4, 0.1],
       [5. , 3.4, 1.6, 0.4],
       [5.5, 2.5, 4., 1.3],
       [5.8, 2.8, 5.1, 2.4]])

每个样本的类别信息,即标签,存储在数据集的“目标”属性中:

打印(虹膜.数据.形状)
打印(虹膜.目标.形状)

输出:

(150, 4)
(150,)
打印(虹膜。目标)

输出:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
 numpy 导入 np

NP . bincount (虹膜。目标)

输出:

数组([50, 50, 50])

使用 NumPy 的 bincount 函数(上图)我们可以看到这个数据集中的类是均匀分布的——每个物种有 50 朵花,其中

  • 第 0 类:鸢尾花
  • 第 1 类:变色鸢尾
  • 第 2 类:弗吉尼亚鸢尾

这些类名存储在最后一个属性中,即 target_names :

打印(虹膜。target_names )

输出:

['setosa''杂色''弗吉尼亚']

我们的鸢尾花数据集的每个样本的类信息都存储在数据集的 target 属性中:

打印(虹膜。目标)

输出:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

除了数据的形状,我们还可以检查标签的形状,即 target.shape :

每个花卉样本在数据数组中占一行,列(特征)代表以厘米为单位的花卉测量值。例如,我们可以表示这个 Iris 数据集,由 150 个样本和 4 个特征组成,一个二维数组或矩阵电阻150×4 格式如下:

X=[X1(1)X2(1)X3(1)X4(1)X1(2)X2(2)X3(2)X4(2)⋮⋮⋮⋮X1(150)X2(150)X3(150)X4(150)]

上标分别表示第 i 行,下标分别表示第 j 个特征。

一般来说,我们有 n 行和 克 列:

X=[X1(1)X2(1)X3(1)…X克(1)X1(2)X2(2)X3(2)…X克(2)⋮⋮⋮⋮⋮X1(n)X2(n)X3(n)…X克(n)]

打印(虹膜.数据.形状)
打印(虹膜.目标.形状)

输出:

(150, 4)
(150,)

bincount of NumPy 计算非负整数数组中每个值的出现次数。我们可以使用它来检查数据集中类的分布:

将 numpy 导入为 np

NP . bincount (虹膜。目标)

输出:

数组([50, 50, 50])

我们可以看到类是均匀分布的——每个物种有 50 朵花,即

  • 第 0 类:鸢尾花-Setosa
  • 第 1 类:变色鸢尾
  • 第 2 类:Iris-Virginica

这些类名存储在最后一个属性中,即 target_names :

打印(虹膜。target_names )

输出:

['setosa''杂色''弗吉尼亚']

可视化虹膜数据集的特征

特征数据是四维的,但我们可以使用简单的直方图或散点图一次可视化一两个维度。

从 sklearn.datasets 导入 load_iris
虹膜 =  load_iris ()
打印(虹膜。数据[虹膜。目标== 1 ] [:5 ])

打印(虹膜。数据[虹膜。靶向== 1 , 0 ] [:5 ])

输出:

[[7. 3.2 4.7 1.4]
 [6.4 3.2 4.5 1.5]
 [6.9 3.1 4.9 1.5]
 [5.5 2.3 4. 1.3]
 [6.5 2.8 4.6 1.5]]
[7. 6.4 6.9 5.5 6.5]

特征的直方图

导入 matplotlib.pyplot 作为 plt

图,  ax  =  plt 。副区()
x_index  =  3个
色 =  [ '蓝' , '红' , '绿色' ]

为 标签, 颜色 在 拉链(范围(len个(虹膜。target_names )), 颜色):
    斧。HIST (虹膜。数据[虹膜。目标==标签, x_index ], 
            标签=虹膜。target_names [标签],
            颜色=颜色)

斧头。set_xlabel ( iris . feature_names [ x_index ]) 
ax 。图例(loc = '右上角' )
plt 。显示()

【机器学习】数据的数据表示和可视化

锻炼

查看其他特征的直方图,即花瓣长度、萼片宽度和萼片长度。

具有两个特征的散点图

外观图在一张图中显示了两个特征:

导入 matplotlib.pyplot 作为 plt 
fig , ax  =  plt 。子图()

x_index  =  3 
y_index  =  0

颜色 =  [ '蓝色' 、 '红色' 、 '绿色' ]

为 标签, 颜色 在 拉链(范围(len个(虹膜。target_names )), 颜色):
    斧。散射(虹膜。数据[虹膜。目标==标签, x_index ], 
                虹膜。数据[虹膜。目标==标签, y_index ],
                标签=虹膜。target_names [标签], 
                c =颜色)

斧头。set_xlabel ( iris . feature_names [ x_index ]) 
ax 。set_ylabel ( iris . feature_names [ y_index ]) 
ax 。图例(loc = '左上' )
plt 。显示()

【机器学习】数据的数据表示和可视化

锻炼

更改上面脚本中的 x_index 和 y_index

更改上面脚本中的 x_index 和 y_index 并找到最大程度地分隔三个类的两个参数的组合。

概括

我们现在将在一个组合图中查看所有特征组合:

导入 matplotlib.pyplot 作为 plt

n  =  len ( iris . feature_names ) 
fig ,  ax  =  plt 。子图( n ,  n ,  figsize = ( 16 ,  16 ))

颜色 =  [ '蓝色' 、 '红色' 、 '绿色' ]

对于 X 在 范围(Ñ ):
    用于 Ý 在 范围(Ñ ):
        的XName  = 虹膜。特征名称[ x ] 
        yname  = 虹膜。feature_names [ ÿ ]
        为 color_ind 在 范围(len个(虹膜。target_names )):
            斧[ X , ÿ ] 。分散(虹膜。数据[虹膜。目标== color_ind ,  x ],  
                             iris 。数据[虹膜. 目标== color_ind ,  y ],
                             标签= iris 。目标名称[ color_ind ], 
                             c =颜色[ color_ind ])

        轴[ x ,  y ] 。set_xlabel ( xname ) 
        ax [ x ,  y ] 。set_ylabel ( yname ) 
        ax [ x ,  y ] 。图例(loc = '左上' )


PLT 。显示()

【机器学习】数据的数据表示和可视化

散点图'矩阵

除了手动操作,我们还可以使用pandas 模块提供的 散点图矩阵 。

散点图矩阵显示数据集中所有特征之间的散点图,以及显示每个特征分布的直方图。

 熊猫 导入 pd

    
iris_df  =  pd 。数据帧(虹膜。数据, 列=虹膜。feature_names )
PD 。绘图。scatter_matrix ( iris_df ,  
                           c = iris . target ,  
                           figsize = ( 8 ,  8 ) 
                          );

【机器学习】数据的数据表示和可视化

3维可视化

import  matplotlib.pyplot  as  plt 
from  sklearn.datasets  import  load_iris 
from  mpl_toolkits.mplot3d  import  Axes3D 
iris  =  load_iris () 
X  =  [] 
for  iclass  in  range ( 3 ): 
    X 。附加([[],  [],  []]) 
    for  i  in  range ( len ( iris . data )): 
        if  iris . 目标[ i ] ==  iclass : 
            X [ iclass ][ 0 ] 。追加(虹膜。数据[ i ][ 0 ])
            X [ iclass ][ 1 ] 。追加(虹膜。数据[ i ][ 1 ])
            X [ iclass ][ 2 ] 。追加(总和(虹膜。数据[ i ][ 2 :]))

颜色 =  ( "r" ,  "g" ,  "y" ) 
fig  =  plt . 图() 
ax  = 图. add_subplot ( 111 , 投影= '3d' )

为 的iCLASS 在 范围(3 ):
    斧。scatter ( X [ iclass ][ 0 ],  X [ iclass ][ 1 ],  X [ iclass ][ 2 ],  c = colors [ iclass ]) 
plt . 显示()

【机器学习】数据的数据表示和可视化

上一篇:集合基本使用-练习-高级使用


下一篇:【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3