机器学习算法(原书第2版)
上QQ阅读APP看书,第一时间看更新

2.1 数据格式

在监督学习和无监督学习问题中,数据集定义为具有m个特征的实数向量的有限集合:

考虑到方法可能是基于概率的,因而需要考虑从统计多变量分布D中得出的每个X。基于此,在整个数据集X上添加一个非常重要的假设,即所有样本是独立同分布(independent and identically distributed)。这意味着所有变量具有相同的分布D。考虑含有k个变量的任意子集,有:

理解所有机器学习的任务都是基于使用明确定义的分布(即使它们可能部分未知),并且实际数据集由从中抽取的样本组成,这是基本的。在第1章中,我们定义了学习的概念,其考虑到智能体和未知情况之间的相互作用。这是可能的,因为学习表示分布的能力而不是数据集本身!因此,从现在开始,每当使用有限数据集时,读者必须始终考虑应对共享相同分布的新样本的可能性。

相应的输出可以是连续变量或类别。是连续变量时称为回归(regression),是类别时称为分类(classification)。输出为连续变量的例子如下:

当标签可以采用有限数量的值(例如,它是二进制或双极)时,问题是离散的(也称为分类,考虑到每个标签通常与明确定义的类或类别相关联),而yi∈R时问题是连续的。

输出为类别的例子如下:

定义通用回归器(regressor)为一个将输入值与连续输出相关联的向量值函数r(·),定义通用分类器(classifier)为预测输出为类别(离散值)的向量值函数c(·)。如果它们还依赖内部参数向量来确定一个通用预测器,那么称这种方法为参数学习(parametric learning):

向量θ是所有模型参数的汇总,这些参数通常是我们要学习的唯一元素。事实上,大多数模型假设一个不能修改的标准结构(即使有一些特定的动态神经网络允许添加或删除计算单元),并且适应性仅依赖于可能的参数范围。

另一方面,非参数学习不会对预测函数族进行初始化假设(例如,定义r(·)和c(·)的通用参数化形式)。一个常见的非参数族称为基于实例的学习(instance-based learning),不需要预先计算参数值,而仅基于由训练样本(实例集)确定的假设进行实时预测。一个简单而广泛使用的方法是采用半径固定的邻域概念,即在分类问题中,新的样本被已分类的训练样本自动包围,通过考虑附近的样本类别来确定输出类别。本书将讨论属于此类的另一个非常重要的算法族:基于核的支持向量机(kernel-based Support Vector Machine)。

每个算法都有特有的机理和对于参数的解释,因此,不需要现在就讨论阈值或概率等定义,或使用更抽象的定义。通用的参数训练过程应该找到在给定的特定训练数据集上能够最小化回归/分类误差的最佳参数向量,并生成能对未知样本进行泛化的预测器。

如果含有加性噪声,则输出可以表示为:

在上式中,期望输出可以表示为一个较精确的预测加上零均值和低方差的高斯噪声。训练任务变为通过优化参数来提高信噪比。当然,如果存在不具有零平均值(与其他X值无关)的项,那么可能意味着必须考虑一个隐含的趋势(可能是已被过早抛弃的特征)。另一方面,高噪声方差意味着X被污染,其测量值是不可靠的。

在无监督学习中,通常只有一个具有m维向量的输入集X,并且使用以下表达式定义聚类函数cl(·)(具有n个目标类):

正如第1章中所解释的,聚类算法试图发现样本之间的相似性并相应地对它们进行分组。因此cl(·)将始终输出0到n-1之间的标签(或者在1和n之间),表示与样本x最匹配的簇。由于x是假设从训练阶段使用的相同数据生成过程中提取的,因此我们在数学上接受结果在所达到的准确度极限内可靠。另一方面(在每个机器学习问题中都是如此),如果从完全不同的分布中抽取x,则任何预测都将与随机预测无法区分。这个概念非常重要,读者必须理解它(连同所有可能的含义)。假设我们将一级方程式赛车和军用飞机的图像分类,最终准确度为95%。这意味着只有五张代表实际汽车或飞机的照片被错误分类。这可能是由于细节、照片的质量、物体的形状、噪音的存在,等等。相反,如果我们尝试对SUV和大型货机的照片进行分类,那么所有结果都是毫无意义的(即使它们是正确的)。之所以发生这种情况,是因为分类器很少会输出50%概率的分类(意味着不确定性最大),最终的类将始终是两者中的一个。然而,分类器的意识与投掷硬币的神谕没有太大的不同。因此,每当我们需要处理特定样本时,必须确保使用从相同分布中提取的元素来训练模型。在前面的示例中,可以使用所有类型的汽车和飞机重新训练分类器,同时尝试达到相同的原始精度。

在大多数scikit-learn模型中,有一个包含所有训练参数的实例变量coef_。例如,在单参数线性回归问题中(将在第3章中详细讨论),输出是

多类策略

到目前为止,我们假设回归和分类都对m长度的向量进行操作,但产生单个值或单个标签(换句话说,输入向量始终只与一个输出元素相关联)。当输出类的数目大于1时,有两种策略来解决分类问题:

一对多(one-vs-all)

一对一(one-vs-one)

这两种策略返回给用户的输出都是最终的值或类。然而,为了优化模型总是选择最好的策略(scikit-learn可以自动管理这些选项,以避免在不必要时进行明确选择),有必要了解这两种策略蕴含的不同原理。

1.一对多

这可能是最常见的策略,并在scikit-learn中广泛应用于大多数算法。如果输出有n个类,并行训练n个分类器可以将实际所属的类与剩余的那些类分开。这种方法属于相对轻量级的方法(最多需要n-1个过程来找到正确的类,因此它具有O(n)的复杂度),因此通常是默认选项,并且不需要进一步的操作。

2.一对一

一对多的替代方案是为每两个类训练一个模型。算法的复杂度不再是线性的(实际上是O(n2)),根据多数类的结果来决定哪一个是正确的类。一般来说,选用这种方法,计算量大,因此只有当选用全部数据集效果不好时才考虑采用。

如果想了解更多关于scikit-learn的多类策略,请访问http://scikit-learn.org/stable/modules/multiclass.html