概述
本系列的前一篇文章 讨论了 DNN 模型的超参数,并用若干示例对其进行了训练,且对其进行了测试。 所得模型的品质非常高。
赫兹量化交易软件还讨论了如何提高分类品质的可能性。 其中之一是使用神经网络的融合。 这个增幅的变体将在本文中讨论。
1. 神经网络分类器的融合
研究表明,分类器融合通常比单体分类器更准确。 这样的一个融合如图例 1a 所示。 它使用了若干个分类器,每个分类器都针对输入的对象进行决策。 然后,这些独立决策在合并器中聚合。 融合输出对象的类标签。
直观上,分类器融合不能被严格定义。 这般不确定性如图例 1b-d 所示。 本质上,任何融合本身都是一个分类器 (图例 1b)。 包含它的基本分类器将提取 (通常是隐式的) 规则性的复杂函数,并且合并器将成为这些函数的简单分类器聚合。
另一方面,没有什么能阻止赫兹量化交易软件将传统的标准神经网络分类器称为融合 (图例 1c)。 倒数第二层上的神经元可被认为是单独的分类器。 它们的决策必须在合并器中 "解密",合并器的角色由顶层扮演。
最终,函数可被视为原始分类器,而分类器可被视为它们的复杂合并器 (图例 1d)。
赫兹量化交易软件结合简单的可训练分类器来获得准确的分类决策。 但这是前进的正确道路吗?
Tin Kam Ho 在 2002 年出版的论文 "多个分类器合并: 课题与后续步骤" 中写道:
"现在我们寻找最佳的分类器集合,然后寻找最佳的合并方法,来替代寻找最佳的特征集合与最佳的分类器。 可以想象,赫兹量化软件很快就会寻找到最好的合并方法,然后是使用它们的最好方法。 如果我们不抓住机会回顾这一挑战所引发的根本问题,我们必然会陷入这种无休止的往复,拖着越来越复杂的合并方案和理论,逐渐忽视原有的问题。"
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图例 1. 什么是分类器的融合?
这一课题就是我们必须在创建新的复杂项目之前找到使用现有工具和方法的最佳方式。
众所周知,神经网络的分类器是 "泛逼近"。 这意味着任何分类边界,无论其复杂度如何,都可以通过具有任何所需精度的有限神经网络来逼近。 不过,这些知识并没有为我们提供创建或训练这种网络的方法。 合并分类器的思路是尝试通过组成托管网络建筑区块来解决问题。
组成融合的方法是元算法,它将若干机器学习方法合并成一个预测模型,以便:
-
减少差异 — 引导聚合 (bagging);
-
减少偏见 — 提振 (boosting);
-
改善预测 — 堆叠 (stacking)。
这些方法可划分为两组:
-
构造融合的并行方法,其中基本模型是并行生成的 (例如,随机森林)。 赫兹量化软件的思路是 利用基础模型之间的独立性 并通过平均值来减少误差。 因此,对于模型的主要要求 — 互关联性低,多元化高。
-
顺序融合方法,其基本模型是顺序生成的 (例如,AdaBoost,XGBoost)。 这里的主要思想是 利用基础模型之间的依赖性。 在此,为先前分类有误的示例分配较高权重,可以提高整体品质。
大多数融合方法在创建同质基础模型时使用单一基础学习算法。 这导致了同质融合。 还有使用异构模型的方法 (不同类型的模型)。 结果就是,形成了异质融合。 为了令融合比任意单体成员更准确,基础模型应尽可能多元化。 换言之,来自基础分类器的信息越多,融合的准确性就越高。
图例 2 示意了创建一个分类器融合的 4 个级别。 问题会出现在它们当中的每一个上,下面将对它们进行讨论。
添加图片注释,不超过 140 字(可选)
图例 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 子集时,我们使用第一次机会来提高分类品质 — 增加训练样本数量。 'pretrain' 子集中的样本数量将增加到 4000。
通过更改 SplitData() 函数中的 start 参数,可以获得向右顺移 'start' 量的集合。 这可在将来检查价格范围不同部分的品质,并判断其在历史中是如何变化的。
创建用于训练和测试的数据集合 (pretrain/train/test/ test1),收集在 X 列表中。 将目标从分数转换为数字类型 (0.1)。
按照信息重要性安排预测器
测试函数 clusterSim::HINoV.Mod() (参阅软件包获取详细信息)。 它基于具有不同距离和方法的集群对变量进行排序。 我们将使用默认参数。 您可以自由地尝试使用其它参数。 常数 numFeature <- 10 允许改变馈送到模型的最佳预测器 bestF 的数量。
计算依据 X$pretrain 集合执
用于从测试结果计算度量衡的 Evaluate() 函数取自本系列的 上一篇文章。 mean(F1) 的数值将用作优化 (最大化) 标准。 将此函数加载到 'env' 环境中。
创建,训练和测试融合
训练神经网络的融合 (n < - 500 个单位),将它们合并在 Ens 中。 每个神经网络都依据自己的样本进行训练。 通过随机替换训练集合中提取的 7/10 个例子来生成样本。 必须为模型设置两个参数: 'nh' — 隐藏层中的神经元数量和 'act' — 激活函数。 该软件包为激活函数提供以下选项:
-
- sig: sigmoid
-
- sin: sine
-
- radbas: radial basis
-
- hardlim: hard-limit
-
- hardlims: symmetric hard-limit
-
- satlins: satlins
-
- tansig: tan-sigmoid
-
- tribas: triangular basis
-
- poslin: positive linear
-
- purelin: linear
考虑到有 10 个输入变量,我们首先取 nh = 5。 激活函数取 actfun = "sin"。 融合学得很快。 我根据神经网络的经验直觉地选择了参数。 您可以尝试其它选项。
我们简要地研究脚本中的计算。 定义常数 n (融合中神经网络的数量) 和 r (用于训练神经网络的引导样本的大小)。 对于融合中的每个神经网络,样本将会不同。 nh 是隐藏层中的神经元数量。 然后使用主集合 X$pretrain 定义输入数据集合 Xtrain,并仅保留某些预测器 bestF。
这产生了由 500 个单体神经网络分类器组成的融合 Ens[[500]]。 测试基于从主集合 X$train 中利用最佳预测器 bestF 获得的测试集合 Xtest 上进行。 生成的结果是 y.pr[1001,500] - 500 个连续预测变量的数据帧。
合并分类器的单体输出。 方法 (平均/表决)
融合的基础分类器可以具有以下输出类型:
-
类标签
-
按 classes >2 分类时,类标签排序
-
连续数值预测/支持度。
基础分类器在输出处具有连续的数值变量 (支持度)。 输入 X 的支持度能以不同方式解释。 它可以是提议标签的可靠性,或评估类的可能概率。 对于我们的情况,提议的分类标签的可靠性将作为输出。
第一种合并方式是 平均: 获取单体输出的平均值。 然后将其转换为类标签,而 转换阈值 取为 0.5。
合并的第二种变体是简单的 多数表决。 为此,每个输出首先从连续变量转换为类标签 [-1,1] (转换阈值为 0.5)。 然后将所有输出累加,如果结果大于 0,则分配类 1,否则分配类 0。
使用获得的类标签,确定度量衡 (准确率, 精确率, 召回率 和 F1)。
融合修剪。 方法
基础分类器的数量最初是富余的,以便稍后从中选择最好的。 执行此操作时应用以下方法:
-
基于顺序的修剪 — 按特定品质得分排行中选择融合:
-
降低误差修剪 — 按分类误差对分类器进行排序,并选择若干最好的 (误差最小);
-
kappa 修剪 — 根据 Kappa 统计信息对融合成员进行排序,选择得分最低的所需数字。
-
基于集群的修剪 — 通过任意方法对融合的预测结果进行集群,之后自每个集群里选择若干代表。 集群方法:
-
分区 (partitioning) (例如 SOM, k-mean);
-
分层 (hierarchical);
-
基于密度 (density-based) (例如, dbscan);
-
基于 GMM。
-
基于优化的修剪 — 运用进化或遗传算法选择最佳。
融合修剪与预测器的选择相同。 所以,在选择预测器时,可以应用相同的方法 (这已在本系列的前几篇文章中介绍过)。
按分类误差 (降低误差修剪) 排序的融合当中进行选择,将之用于进一步的计算。
总之,在实验中将使用以下方法:
-
合并方法 — 平均和简单多数表决;
-
度量衡 — 准确率 (Accuracy), 精确率 (Precision), 召回率 (Recall) 和 F1;
-
修剪 — 从基于 mean(F1) 的分类误差排序的融合中进行选择。
将单体输出从连续变量转换为类标签的阈值是 0.5。 预先警告: 这不是最好的选择,而是最简单的选择。 它可以在以后改进。
a) 确定融合的最佳单体分类器
确定所有 500 个神经网络的 mean(F1),选择若干具有最佳得分的 "bestNN"。 多数表决的最佳神经网络的数量必须是奇数,因此它将被定义为: (numEns*2 + 1)。