概述
本系列的前一篇文章 赫兹量化软件讨论了 DNN 模型的超参数,并用若干示例对其进行了训练,且对其进行了测试。 所得模型的品质非常高。
我们还讨论了如何提高分类品质的可能性。 其中之一是使用神经网络的融合。 这个增幅的变体将在本文中讨论。
1. 神经网络分类器的融合
研究表明,分类器融合通常比单体分类器更准确。 这样的一个融合如图例 1a 所示。 它使用了若干个分类器,每个分类器都针对输入的对象进行决策。 然后,这些独立决策在合并器中聚合。 融合输出对象的类标签。
直观上,分类器融合不能被严格定义。 这般不确定性如图例 1b-d 所示。 本质上,任何融合本身都是一个分类器 (图例 1b)。 包含它的基本分类器将提取 (通常是隐式的) 规则性的复杂函数,并且合并器将成为这些函数的简单分类器聚合。
另一方面,没有什么能阻止我们将传统的标准神经网络分类器称为融合 (图例 1c)。 倒数第二层上的神经元可被认为是单独的分类器。 它们的决策必须在合并器中 "解密",合并器的角色由顶层扮演。
最终,函数可被视为原始分类器,而分类器可被视为它们的复杂合并器 (图例 1d)。
我们结合简单的可训练分类器来获得准确的分类决策。 但这是前进的正确道路吗?
Tin Kam Ho 在 2002 年出版的论文“多个分类器合并,课题与后续步骤”中写道:
"现在我们寻找最佳的分类器集合,然后寻找最佳的合并方法,来替代寻找最佳的特征集合与最佳的分类器。 可以想象,我们很快就会寻找到最好的合并方法,然后是使用它们的最好方法。 如果我们不抓住机会回顾这一挑战所引发的根本问题,我们必然会陷入这种无休止的往复,拖着越来越复杂的合并方案和理论,逐渐忽视原有的问题。"
图例 1. 什么是分类器的融合?
这一课题就是我们必须在创建新的复杂项目之前找到使用现有工具和方法的最佳方式。
众所周知,神经网络的分类器是 "泛逼近"。 这意味着任何分类边界,无论其复杂度如何,都可以通过具有任何所需精度的有限神经网络来逼近。 不过,这些知识并没有为我们提供创建或训练这种网络的方法。 合并分类器的思路是尝试通过组成托管网络建筑区块来解决问题。
组成融合的方法是元算法,它将若干机器学习方法合并成一个预测模型,以便:
- 减少差异 — 引导聚合 (bagging);
- 减少偏见 — 提振 (boosting);
- 改善预测 — 堆叠 (stacking)。
这些方法可划分为两组:
- 构造融合的并行方法,其中基本模型是并行生成的 (例如,随机森林)。 我们的思路是 利用基础模型之间的独立性 并通过平均值来减少误差。 因此,对于模型的主要要求 — 互关联性低,多元化高。
- 顺序融合方法,其基本模型是顺序生成的 (例如,AdaBoost,XGBoost)。 这里的主要思想是 利用基础模型之间的依赖性。 在此,为先前分类有误的示例分配较高权重,可以提高整体品质。
大多数融合方法在创建同质基础模型时使用单一基础学习算法。 这导致了同质融合。 还有使用异构模型的方法 (不同类型的模型)。 结果就是,形成了异质融合。 为了令融合比任意单体成员更准确,基础模型应尽可能多元化。 换言之,来自基础分类器的信息越多,融合的准确性就越高。
图例 2 示意了创建一个分类器融合的 4 个级别。 问题会出现在它们当中的每一个上,下面将对它们进行讨论。
图例 2. 创建分类器融合的四个级别
我们来更详尽地讨论这个问题。
1. 合并器
有些融合方法没有定义合并器。 但对于这样做的方法,有三种类型的合并器。
- 非可训练。 这种方法的一个例子是简单的 "多数表决"。
- 可训练。 该组包括 "加权多数表决" 和 "朴素贝叶斯" ,以及 "分类器选择" 方法,其中给定对象的决策是由融合的一个分类器做出的。
- 元分类器。 基础分类器的输出被认作训练新分类器的输入,其会变为合并器。 这种方法被称为 "复杂泛化" ,"通过训练泛化",或简称为 "堆叠"。 为元分类器构建训练集合是该合并器的主要问题之一。
2. 建立融合
基础分类器的训练应并行 (独立) 还是顺序? 顺序训练的一个示例是 AdaBoost,其中每个添加的分类器的训练集合取决于在它之前创建的融合。
3. 多元化
如何在融合中产生差异? 建议使用以下选项。
- 操纵训练参数。 在训练单体基础分类器时使用不同的方法和参数。 例如,可以用不同的随机变量为每个基础分类器的神经网络隐藏层中的神经元初始化权重。 也可以随机设置超参数。
- 操纵样本 — 从训练集合中为融合的每个成员取一个自定义引导样本。
- 操纵预测器 — 为每个基础分类器准备一组随机确定的预测器。 这就是所谓的训练集合垂直切分。
4. 融合大小
如何确定融合中的分类器数量? 融合能否由同时训练所需数量的分类器或通过添加/删除分类器迭代构建? 可能的选项:
- 该数量是提前预留的
- 这个数字是在训练过程中设定的
- 分类器过量生产然后被选中
5. 多功能性 (相对于基础分类器)
一些融合方法可与任何分类器模型一起使用,而其它方法则与某种类型的分类器相关联。 "分类器特定" 融合的示例是一个随机森林。 它的基础分类器是决策树。 因此,有两种方法变体:
- 仅能使用一个基础分类器的特定模型;
- 可以使用任意基础分类器模型。
在训练和优化分类器融合的参数时,应区分解决方案优化和覆盖优化。
- 决策优化是指为基础分类器的固定融合选择合并器 (图例 2 中的级别 A)。
- 备用的覆盖优化是指利用固定合并器创建的多元化基础分类器 (图例 2 中的级别 B,C 和 D)。
融合分解旨在降低问题的复杂性,因此它似乎是合理的。
在著作 组合形态分类器。 方法和算法,第二版。 Ludmila Kuncheva 和 中详尽分析并深入研究了融合的方法。 建议阅读它们。
2. 引导聚合 (Bagging)
该方法的名称衍生自短语 Bootstrap AGGregatING (引导聚合)。 引导聚合融合创建如下:
- 从训练集合中提取引导样本;
- 每个分类器都在自己的样本上进行训练;
- 来自单体分类器的各个输出被合并成一个类标签。 如果单体输出拥有类标签的形式,则使用简单多数表决。 如果分类器的输出是连续变量,则应用平均值,或者将变量转换为类标签,然后进行简单多数表决。
我们回到图例 2 并分析应用引导聚合方法来创建一个分类器融合的所有级别。
A: 聚合级别
在该级别,从分类器获得的数据被合并,且聚合成单一输出。
我们如何合并单体输出? 使用一个不可训练的合并器 (平均,简单多数表决)。
B: 分类器级别
在级别 B,所有使用分类器的工作都会发生。 这里出现了若干问题。
- 我们使用不同或相同的分类器吗? 在融合方法中使用相同的分类器。
- 哪个分类器作为基础分类器? 我们使用 ELM (极限学习机)。
我们来更详细地阐述这一点。 分类器选择及其论证是工作中的重要部分。 我们列出基础分类器的主要需求,以便创建高质量的融合。
首先,分类器必须简单: 不建议使用深度神经网络。
其次,分类器必须是不同的: 具有不同的初始化,学习参数,训练集合,等等。
第三,分类器速度很重要: 模型不应花费数小时来训练。
第四,分类模型应较弱,预测结果略好于 50%。
最后,分类器的不稳定性很重要,因此预测结果的范围很广。
有一个选项可以满足所有这些需求。 它是一种特殊类型的神经网络 — ELM (极端学习机器), 它被提议作为备选学习算法来替代 MLP。 形式上,它是有一个隐藏层的完全连接的神经网络。 但是,如果没有迭代权重确定 (训练),它变得异常快速。 它在初始化期间随机选择隐藏层中神经元的权重,然后根据所选择的激活函数分析确定它们的输出权重。 有关 ELM 算法的详细说明及其多种类型的概述,请参见附带的存档。
- 需要多少个分类器? 我们取 500,然后修剪融合。
- 是否使用分类器的并行或顺序训练? 我们使用并行训练,同时针对所有分类器进行。
- 基础分类器的哪些参数可以操纵? 隐藏层数量,激活函数,训练集合的样本大小。 所有这些参数都需要优化。
C: 辨别规则的功能级别
- 使用所有预测器还是仅使用每个分类器的单独子集? 所有分类器都使用一个预测器子集。 但是可以优化预测器的数量。
- 如何选择这样一个子集? 在这种情况下,使用特殊算法。
D: 输入数据及其操纵的级别
在此级别,源数据被馈送到神经网络的输入以便进行训练。
如何操纵输入数据以便提供高度多样性和高度个性化的精度?引导样本将单独用于每个分类器。 引导样本的大小对于所有集合成员都是相同的,但它将会被优化。
为了用 ELM 集合进行实验,R 语言中有两个软件包 (elmNN, ELMR),在 Python 中有一个 (hpelm)。 现在,我们来测试 elmNN 软件包的功能,它实现了经典的 ELM。 elmNN 软件包设计用于利用 ELM 的批处理方法进行创建、训练和测试。 因此,训练和测试样本在训练之前准备好,并一次性馈送入模型。 软件包很简单。
该实验将包括以下阶段。
- 生成源数据集合
- 按照信息重要性安排预测器
- 训练和测试融合分类器
- 合并单体分类器的输出 (平均/表决)
- 融合修剪及其方法
- 搜索融合分类品质的度量衡
- 确定融合成员的优化参数。 方法
- 使用优化参数训练和测试融合
生成源数据集合
实验中使用最新版本的 MRO 3.4.3。 它实现了几个适合我们工作的新软件包。
运行 RStudio, 进入 GitHub/Part_I 下载取自终端的报价文件 Cotir.RData, 并从 GitHub/Part_IV 中提取含有数据准备函数的 FunPrepareData.R 文件。
之前,已确定一套带有推算异常值和常规化数据的数据,可以在预训练中获得更好的结果。 我们会用到它。 您还可以测试之前考虑的其它预处理选项。
当划分为 pretrain/train/val/test 子集时&#x