本节书摘来异步社区《python机器学习——预测分析核心算法》一书中的第2章,第2.4节,作者:【美】michael bowles(鲍尔斯),更多章节内容可以访问云栖社区“异步社区”公众号查看。
探测未爆炸的水雷数据集的工具同样可以用于回归问题。在给定物理测量值的情况下,预测鲍鱼的年龄就是此类问题的一个实例。鲍鱼的属性中包括因素属性,下面将说明属性中含有因素属性后与上例有什么不同。
鲍鱼数据集的问题是根据某些测量值预测鲍鱼年龄。当然可以对鲍鱼进行切片,然后数年轮获得鲍鱼年龄的精确值,就像通过数树的年轮得到树的年龄一样。但是问题是这种方法代价比较大,耗时(需要在显微镜下数年轮)。因此更方便经济的方法是做些简单的测量,如鲍鱼的长度、宽度、重量等指标,然后通过一个预测模型对其年龄做相对准确的预测。预测分析有大量的科学应用,学习机器学习的一个好处就是可以将其应用到一系列很有趣的问题上。
鲍鱼数据集可以从uc irvine数据仓库中获得,其url是<code>http://archive.ics.uci.edu/ml/machine-learning-database/abalone/abalone.data</code>。此数据集数据以逗号分隔,没有列头。每个列的名字存在另外一个文件中。代码清单2-11将鲍鱼数据集读入pandas数据框,然后进行分析,这些分析与“分类问题:用声纳探测未爆炸的水雷”节中的一样。由数据的性质决定的,“岩石vs.水雷”数据集的列名(属性名)更加通用。为了能够从直觉上判断提出的预测模型是否可接受,理解鲍鱼数据集各个列名(属性名)的意义是十分重要的。因此,在代码中将列名(属性名)直接拷贝到代码中,与相关的数据绑定在一起,帮助直接感受下一步机器学习算法应该怎么预测。建立预测模型所需的数据包括性别、长度、直径、高度、整体重量、去壳后重量、脏器重量、壳的重量、环数。最后一列“环数”是十分耗时采获得的,需要锯开壳,然后在显微镜下观察得到。这是一个有监督机器学习方法通常需要的准备工作。基于一个已知答案的数据集构建预测模型,然后用这个预测模型预测不知道答案的数据。
代码清单2-11不仅展示了产生统计信息的代码,而且展示了打印输出的统计信息。第一部分打印数据集的头和尾。为了节省空间只显示了头。当你自己运行代码时,就可以看到全部的输出。绝大多数数据框中的数据是浮点数。第一列是性别,标记为m(雄性)、f(雌性)和i(不确定的)。鲍鱼的性别在出生时是不确定的,成熟一些之后才能确定。因此对于小的鲍鱼其性别是不确定的。鲍鱼的性别是一个三值的类别变量。类别属性需要特别注意。一些算法只能处理实数值的属性(如支持向量机(support vector machines)、k最近邻、惩罚线性回归,这些将在第4章介绍)。第4章会讨论把类别属性转换成实数值属性的技巧。代码清单2-11还展示了实数值属性按列的统计信息。
代码清单2-11 鲍鱼数据集的读取与分析-abalonesummary.py
author = 'mike_bowles'
import pandas as pd
from pandas import dataframe
import matplotlib.pyplot as plot
from math import exp
target_url = ("http://archive.ics.uci.edu/ml/machine-"
abalone = pd.read_csv(target_url,header=none, prefix="v")
abalone.columns = ['sex', 'length', 'diameter', 'height',
summary = abalone.describe()
minrings = summary.iloc[3,7]
maxrings = summary.iloc[7,7]
nrows = len(abalone.index)
for i in range(nrows):
plot.xlabel("attribute index")
plot.ylabel(("attribute values"))
plot.show()
meanrings = summary.iloc[1,7]
sdrings = summary.iloc[2,7]
plot.show()<code>`</code>
图2-12的平行坐标图为鲍鱼年龄(壳的环数)和用于预测年龄的属性之间的关系。折线使用的颜色标尺从深红棕色、黄色、浅蓝色一直到深蓝色。图2-11的箱线图显示整个数据集的最大值和最小值分布十分广泛。图2-12有压缩的效果,导致绝大多数的数据都分布在颜色标尺的中间部分。尽管如此,图2-12还是能够显示每个属性和目标环数的相关性。在属性值相近的地方,折线的颜色也比较接近,则会集中在一起。这些相关性都暗示可以构建相当准确的预测模型。相对于那些体现了良好相关性的属性和目标环数,有些微弱的蓝色折线与深橘色的区域混合在一起,说明有些实例可能很难正确预测。
改变颜色映射关系可以从不同的层面来可视化属性与目标之间的关系。代码清单2-11的最后一部分用到了箱线图中用过的归一化。此归一化不是让所有的值都落到0和1之间。首先让取负值的数据与取正值的数据基本上一样多。代码清单2-11中使用分对数变换(logit transform)实现数值到(0,1)的映射。分对数变换如公式2-5所示,分对数函数如图2-13所示。
如图2-13所示,分对数函数将很大的负数映射成0(接近),很大的正数映射成1(接近),0映射成0.5。在第4章还会看到分对数函数,在将线性函数与概率联系起来它起到了关键的作用。
图2-14为归一化之后的结果。转换后可以更充分地利用颜色标尺中的各种颜色。注意到针对整体重量和去壳后的重量这两个属性,有些深蓝的线(对应具有大环数的品种)混入了浅蓝线的区域,甚至是黄色、亮红的区域。这意味着,当鲍鱼的年龄较大时,仅仅这些属性不足以准确地预测出鲍鱼的年龄(环数)。好在其他属性(如直径、壳的重量)可以很好地把深蓝线区分出来。这些观察都有助于分析预测错误的原因。
最后一步是看不同属性之间的相关性和属性与目标之间的相关性。代码清单2-13为针对鲍鱼数据产生关联热图和关系矩阵的代码。遵循的方法与“岩石vs.水雷”数据集相应章节里的方法一样,只有一个重要差异:因为鲍鱼问题是进行实数值预测,所以在计算关系矩阵时可以包括目标值。
代码清单2-13 鲍鱼数据的相关性计算-abalonecorrheat.py