机器学习中的实用技巧与挑战
1. 上下文相关领域与滑动窗口方法
在一些应用场景中,工程师希望窗口仅包含近期的示例,因为他们怀疑较旧的示例可能属于过时的上下文。分类器通常应仅反映窗口内包含的示例。在最简单的实现中,每次窗口内容更改时都会重新诱导分类器;或者,窗口内容的更改也可能仅触发分类器的修改或调整。
有时,旧的上下文可能会重新出现(例如,由于某种“季节性”)。因此,存储先前诱导的分类器版本是个不错的主意,以防将来可能会重新使用它们。
在实现滑动窗口方法时,工程师需要考虑以下几个关键问题:
-
窗口大小
:如果窗口太小,其中包含的示例可能不足以进行有效的学习;如果窗口太大,则可能包含来自过时上下文的示例。理想情况下,只要可以假设上下文没有改变,窗口就应该增长(不删除旧示例)。当检测到变化时,应删除一定数量的最旧示例,因为它们不再可靠。
-
上下文变化的识别
:一种简单的解决方案是依靠分类器行为的反馈。上下文的变化可以通过分类性能的突然下降来识别。
-
删除最旧示例的数量
:这取决于上下文变化的渐进程度和变化的幅度。在极端情况下,突然且显著的变化需要删除所有示例;而在另一个极端,两个非常相似上下文之间的非常缓慢的过渡只需要删除少数最旧的示例。
2. 未知属性值的处理
在许多领域中,某些属性值是未知的。这可能是由于患者拒绝提供信息、测量设备故障或信息丢失等原因导致的。这会导致训练集不完美,其中一些值被问号替换。
未知属性值会带来一些不利影响:
-
k - NN 分类器
:在普通版本的 k - NN 分类器中,只有当向量中的所有值都已知时才能计算两个向量之间的距离。虽然可以修改距离度量以量化例如红色和未知之间的距离,但这样计算的距离往往是临时的。
-
线性和多项式分类器
:没有所有属性值的知识,就无法计算加权和 $\sum w_ix_i$,而其符号决定了分类器选择的类标签。
-
贝叶斯分类器和神经网络
:未知属性值也会使它们的使用变得复杂。
-
决策树
:相对更灵活,在对示例进行分类时,其值未知的属性可能不需要进行测试(不会出现在从根节点到终端节点的路径上)。
处理缺失值有一些简单的方法:
-
删除示例
:在训练集足够大且只有少数问号的领域中,删除所有具有未知属性值的示例通常不会有太大问题。但在问号数量较多的领域中,这种方法会破坏大部分训练集,导致有价值的信息丢失。
-
填充缺失值
:
- 对于离散属性,可以用该属性最频繁的值替换问号。
- 对于连续值属性,可以使用平均值。但需要注意的是,使用最频繁或平均值会使示例的描述不可靠,因此应谨慎使用。当有许多值缺失时,应使用更复杂的方法。
一种更复杂的填充缺失值的方法是基于决策树归纳。具体步骤如下:
1. 设 $T$ 为原始训练集,$a_t$ 为具有未知值的属性。创建一个新的训练集 $T_0$,其中 $a_t$ 成为类标签,示例由所有其余属性描述,原来的类标签(例如,正与负)被视为另一个属性。
2. 从 $T_0$ 中删除所有 $a_t$ 值未知的示例。
3. 从 $T_0$ 的最终版本中诱导决策树。
4. 使用诱导的决策树确定那些 $a_t$ 值未知的示例中的 $a_t$ 值。
3. 属性选择
在许多领域中,训练示例由大量属性描述,这可能导致学习成本过高,并且存在可学习性问题以及与无关或冗余属性相关的问题。因此,选择最合适的属性非常重要。
属性可以分为无关属性和冗余属性:
-
无关属性
:其值对示例的类没有任何影响。
-
冗余属性
:其值可以从其他属性的值中获得,例如年龄可以从出生日期的值中获得。这些属性可能会误导某些归纳技术,例如无关属性(在较小程度上,冗余属性也是如此)会扭曲 k - NN 分类器计算的向量到向量的距离。
一些领域(如自动文本分类)具有数万个属性,这会导致以下问题:
-
可学习性降低
:诱导的分类器容易过拟合训练数据,在未来示例上的表现不佳。
-
计算成本高
:特别是在使用多层神经网络时,每个额外的属性都会增加需要训练的权重数量,从而增加计算量。
-
数据稀疏
:由数千个属性描述的示例不可避免地是稀疏的,这会误导许多机器学习方法。
有两种常见的属性选择方法:
-
过滤方法
:计算每个属性对当前分类任务的“效用”,然后根据此标准对它们进行排序,选择前 $N$ 百分比的属性。$N$ 的选择通常通过试错法进行。对于离散属性,可以使用信息增益进行排序;对于连续值属性,通常更喜欢使用统计方法来测量相关性。然而,这种方法忽略了属性之间的关系,难以识别冗余属性。可以通过诱导决策树并仅使用树内部节点测试中遇到的属性来克服这个弱点。
-
包装方法
:比较两个属性集 $A_1$ 和 $A_2$ 的质量。从原始训练集 $T$ 创建两个训练集 $T_1$ 和 $T_2$,其中所有示例的类标签与 $T$ 相同,但 $T_1$ 用 $A_1$ 描述示例,$T_2$ 用 $A_2$ 描述示例。从这两个新创建的训练子集诱导两个分类器,并在独立评估集 $T_E$ 上进行评估。性能更高的属性集更好。
下面是一个基于搜索的简单包装方法的伪代码:
Divide the available set of pre-classified examples into two parts, TT and TE. Let A be the set of attributes. Create an empty set, S.
1. For every attribute, ati 2 A:
(i) Add ati to S; let all examples in TT and TE be described by attributes from S;
(ii) Induce a classifier from TT, then evaluate its performance on TE; denote this performance by pi;
(iii) Remove ati from S.
2. Identify the attribute that resulted in the highest value of pi. Remove this attribute from A and add it to S.
3. If A D ;, stop; if the latest addition did not increase performance, remove this last attribute from S and stop, too. In both cases, S is the final set of attributes.
4. Return to step 1.
4. 其他杂项问题
- 数据缺乏规律性 :如果训练示例是由随机数生成器创建的,所有属性值和类标签都是随机的,那么数据中显然没有规律性。然而,机器学习技术通常能够从这些数据中诱导出在训练集上错误率为零的分类器,但在未来示例上的表现会很差。可以通过将数据分为训练集和测试集,诱导分类器并应用于测试集来测量数据中的规律性。随机数据在训练集上的错误率很小,但在测试集上的结果会很糟糕;数据中的规律性越强,在测试集上的结果就越好。
- 多标签领域 :在一些领域中,一个示例可以同时属于两个或多个类。例如,一个文本文档可以被标记为代表营养、饮食、运动、科普等多个类别。最常见的方法是为每个类诱导一个单独的二进制分类器。具体来说,第 $i$ 个类的分类器从训练集 $T_i$ 中诱导,$T_i$ 包含相同的示例,但有新的标签:如果示例在原始训练集中被标记为 $C_i$,则在 $T_i$ 中的类为“1”,否则为“0”。
- 层次组织的类 :在一些领域(通常是多标签领域)中,类之间不是完全独立的,可能存在一个层次结构。在诱导这些类时,需要相应地进行组织。例如,首先诱导最顶层的类,然后诱导其包含的类,并利用父类的标签以提高效率。但这个过程并不简单,存在错误传播和训练集不平衡等问题。
下面是一个多标签领域训练集转换的示例表格:
| 示例 | 原始类标签 | $T_1$ | $T_2$ | $T_3$ | $T_4$ | $T_5$ |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| ex1 | C1, C2 | 1 | 1 | 0 | 0 | 0 |
| ex2 | C2 | 0 | 1 | 0 | 0 | 0 |
| ex3 | C1, C3, C5 | 1 | 0 | 1 | 0 | 1 |
| ex4 | C2, C3 | 0 | 1 | 1 | 0 | 0 |
| ex5 | C2, C4 | 0 | 1 | 0 | 1 | 0 |
综上所述,在机器学习中,处理上下文相关领域、未知属性值、属性选择以及其他杂项问题是非常重要的,需要根据具体情况选择合适的方法来提高模型的性能和效率。
机器学习中的实用技巧与挑战(下半部分)
5. 滑动窗口方法的深入分析
滑动窗口方法在处理时间变化的领域中具有重要作用。其核心思想是通过一个窗口来动态地选择用于训练分类器的示例,以适应上下文的变化。
下面是滑动窗口方法的一个 mermaid 流程图:
graph TD;
A[开始] --> B[初始化窗口];
B --> C[判断上下文是否变化];
C -- 是 --> D[删除部分旧示例];
C -- 否 --> E[窗口正常增长];
D --> F[更新分类器];
E --> F;
F --> G[进行分类任务];
G --> H[获取新示例];
H --> C;
在这个流程中,首先初始化窗口,然后不断判断上下文是否发生变化。如果变化,就删除部分旧示例,更新窗口内容;如果未变化,窗口正常增长。接着更新分类器并进行分类任务,获取新示例后再次判断上下文变化,如此循环。
对于窗口大小的选择,是一个需要权衡的问题。可以通过以下步骤来进行初步的选择:
1. 设定一个较小的初始窗口大小,例如 10 个示例。
2. 在训练过程中,记录分类器的性能指标,如准确率、召回率等。
3. 逐渐增加窗口大小,每次增加 5 个示例,重复步骤 2。
4. 观察性能指标的变化趋势,选择性能最佳时对应的窗口大小。
判断上下文是否变化的方法除了前面提到的根据分类器性能突然下降来判断,还可以结合一些统计方法,如计算窗口内示例的分布变化。如果分布发生了显著变化,则认为上下文发生了变化。
6. 未知属性值处理的优化
在处理未知属性值时,除了前面介绍的简单方法和基于决策树归纳的方法,还可以考虑以下优化策略。
对于填充缺失值的方法,可以结合属性之间的相关性进行更精确的填充。例如,如果发现身高和体重之间存在较强的正相关关系,当体重值缺失时,可以根据身高值在具有相似身高的人群中计算平均体重来填充。
可以通过以下步骤实现基于相关性的填充:
1. 计算所有属性之间的相关性系数,可以使用皮尔逊相关系数等方法。
2. 对于每个具有未知值的属性,找出与其相关性最强的其他属性。
3. 根据相关属性的值,将示例分组。
4. 在每个分组中,计算该属性的平均值或最频繁值,用于填充缺失值。
另外,还可以使用机器学习模型来预测未知属性值。例如,使用神经网络模型,将已知属性作为输入,未知属性作为输出进行训练。具体步骤如下:
1. 准备训练数据,将具有完整属性值的示例作为训练集。
2. 构建神经网络模型,确定输入层、隐藏层和输出层的节点数。
3. 训练模型,使用训练集进行多次迭代训练,调整模型的权重。
4. 使用训练好的模型对具有未知属性值的示例进行预测。
7. 属性选择方法的比较与应用
过滤方法和包装方法在属性选择中各有优缺点。下面是一个对比表格:
| 方法 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 过滤方法 | 计算简单,速度快 | 忽略属性间关系,难以识别冗余属性 | 数据量较大,对计算效率要求高的场景 |
| 包装方法 | 考虑了属性组合对分类性能的影响,选择的属性更优 | 计算成本高 | 数据量较小,对分类性能要求高的场景 |
在实际应用中,可以根据具体情况选择合适的方法。如果数据量非常大,且对计算时间有严格要求,可以优先考虑过滤方法。例如,在处理大规模的图像数据时,图像的属性数量可能非常多,使用过滤方法可以快速筛选出一部分有用的属性。
如果数据量较小,且希望获得最佳的分类性能,可以使用包装方法。例如,在医学诊断领域,样本数量相对较少,但对诊断的准确性要求很高,使用包装方法可以更精确地选择属性。
还可以将两种方法结合使用,先使用过滤方法进行初步筛选,减少属性数量,然后使用包装方法进行精细选择。具体步骤如下:
1. 使用过滤方法,根据信息增益等指标对属性进行排序,选择前 50% 的属性。
2. 使用包装方法,在筛选后的属性集合中进行搜索,选择最优的属性子集。
8. 多标签领域和层次组织类的挑战与解决方案
在多标签领域中,诱导多个二进制分类器会面临计算成本高和性能评估复杂的问题。可以采用以下解决方案:
-
计算成本优化
:可以使用并行计算技术,同时诱导多个二进制分类器,提高计算效率。例如,使用多核处理器或分布式计算平台。
-
性能评估
:可以使用一些专门的多标签评估指标,如汉明损失、子集准确率等。汉明损失衡量了所有示例中预测错误的标签比例,子集准确率则衡量了完全正确预测标签集合的示例比例。
对于层次组织的类,错误传播和训练集不平衡是主要的挑战。可以通过以下方法解决:
-
错误传播
:在诱导每个类时,引入一定的验证机制,例如交叉验证。在将示例分类到某个父类后,使用验证集对分类结果进行验证,减少错误传播。
-
训练集不平衡
:可以使用过采样或欠采样方法来平衡训练集。过采样方法可以复制少数类的示例,欠采样方法可以删除多数类的示例。
下面是一个处理层次组织类的 mermaid 流程图:
graph TD;
A[开始] --> B[诱导顶层类];
B --> C[验证顶层类分类结果];
C -- 通过 --> D[诱导子层类];
C -- 不通过 --> E[调整顶层类分类器];
E --> B;
D --> F[处理训练集不平衡];
F --> G[诱导子层类分类器];
G --> H[进行分类任务];
在这个流程中,首先诱导顶层类,验证分类结果。若通过则诱导子层类,处理训练集不平衡后诱导子层类分类器并进行分类任务;若未通过则调整顶层类分类器,重新进行诱导。
综上所述,在机器学习中处理各种实际问题时,需要综合考虑多种因素,选择合适的方法和策略。通过不断地优化和改进,可以提高模型的性能和效率,更好地应对不同的应用场景。
超级会员免费看
1699

被折叠的 条评论
为什么被折叠?



