机器学习是关于使模型适应数据。出于这个原因,我们首先展示如何表示数据以便计算机理解。
在本章的开头,我们引用了 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 有一组非常简单的关于这些鸢尾花的数据。数据包括以下内容:
-
鸢尾花数据集中的特征:
- 萼片长度厘米
- 萼片宽度厘米
- 花瓣长度厘米
- 花瓣宽度厘米
-
要预测的目标类别:
- 鸢尾花
- 变色鸢尾
- 鸢尾花
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 . 显示()