在 Weka 中级联分类器的错误方法

Posted

技术标签:

【中文标题】在 Weka 中级联分类器的错误方法【英文标题】:Wrong way to cascade classifiers in Weka 【发布时间】:2014-12-11 02:31:32 【问题描述】:

我有一个包含两个类的数据集,并试图使用 Weka 获得最佳分类器。我能获得的最佳分类器的准确率约为 79%。然后我尝试通过对数据进行分类并将此分类生成的概率分布保存在数据本身中来为我的数据添加属性。 当我对修改后的数据重新运行训练过程时,我得到了超过 93% 的准确率!!我确定这是错误的,但我不知道为什么。 这些是我经历的确切步骤:

    在 Weka 中打开数据。 点击添加过滤器并从Supervised->attribute中选择AddClassification。 选择一个分类器。我使用默认设置选择J48。 将“输出分类”设置为 false,并将 Output Distribution 设置为 true。 运行过滤器并将类恢复为您原来的名义类。请注意添加到属性列表末尾的附加属性。它们将具有以下名称:distribution_yourFirstClassNamedistribution_yourSecondClassName。 转到分类选项卡并选择一个分类器:我再次选择了J48。 运行它。在这一步中,我发现比以前更加准确。

这是创建分类器的有效方法吗?我不是通过在原始数据中添加分类信息来“作弊”吗?如果它是有效的,人们将如何继续创建一个可以预测未标记数据的分类器?它如何添加附加属性(分布)?

我确实尝试使用FilteredClassifier 重现相同的效果,但没有成功。 谢谢。

【问题讨论】:

【参考方案1】:

您似乎已经采取的过程似乎有点接近 Stacking ensemble 方法,其中分类器输出用于生成 ensemble 输出(更多关于 here)。

但是,在您的情况下,属性和先前训练的分类器输出被用于预测您的类别。很可能第二个 J48 模型的大部分规则将基于第一个(因为类输出与 J48 的相关性比其他属性更强),但需要进行一些微调以提高模型准确性。在这种情况下,使用“两个头优于一个”的概念来提高模型的整体性能。

但这并不是说一切都很好。如果您需要将 J48 用于不可见的数据,那么您将无法使用与您的属性相同的 J48(除非您之前保存了它)。此外,您通过使用多个分类器而不是单个 J48 来添加更多处理工作。还需要根据您正在解决的问题考虑这些成本。

希望这会有所帮助!

【讨论】:

我不确定这种方法是否像 Stacking。在堆叠中(据我所知),你训练了几个分类器,然后训练一个元分类器来“选择”第一个分类器的结果。在我的例子中,第一个分类器生成的分布被保存在数据中,然后第二个分类器将运行。这意味着第二个分类器不仅基于先前的结果做出决定,而且基于前一阶段所有结果的“分布”。如果这就像堆叠,如果我堆叠两个 J48,我应该得到相同的结果。我试过了,结果不一样。 完全正确,ABT。我用一级分类器来描述它的相似性,然后有一个二级分类器,除了它的属性之外,它还接受第一个输出。它不会产生与使用堆叠方法有两个分类器相同的结果。我在其中一个标准数据集上使用建议的方法尝试了您的方法,并从 72% 的准确度提高到了 91%,因此该方法肯定会改善结果,但数据需要通过两个分类器才能获得结果为反对一个。【参考方案2】:

好的,这就是我进行级联学习的方法:

    我有数据集 D,没有重复地分成 10 个大小相等的分层折叠(D1 到 D10)。 我应用算法 A1 在 D1 到 D9 上训练分类器 C1,然后就像您一样,在 D10 上应用 C1 来为我提供正负类的额外分布。我将此 D10 与另外两个(或更多,取决于您希望包含在 D10 中的 C1 中的哪些信息)属性/功能命名为 D10_new。 接下来,我应用相同的算法在 D1 到 D8 和 D10 上训练分类器 C2,然后就像您一样,在 D9 上应用 C2 来为我提供正负类的额外分布。我将此带有附加属性/功能的 D9 命名为 D9_new。 通过这种方式,我将 D1_new 创建到 D10_new。 然后我在这些 D1_new 到 D10_new 上应用了另一个分类器(可能使用算法 A2)来预测标签(10 倍 CV 是一个不错的选择)。

在此设置中,您消除了在测试之前查看数据的偏见。此外,建议 A1 和 A2 应该不同。

【讨论】:

有趣的方法。自从我问这个问题以来,我已经弄清楚了,自从第一个分类器“看到”了我基本上是在测试我的训练集的整个数据,即使它使用的是新的分类器。所以也许现在的问题是:它有效吗?准确性的“提升”有多显着?最后:如何使用这种方法预测未标记的数据? 是的,我得到了具有统计学意义的提升。进行了 t 检验来确认这一点(尽管即使没有测试也可以看到提升)。由于 10 倍的 CV 结果令人满意,我会遵循经验法则:我会将 D1_new 和 D10_new 放在一起创建一个 D_new,用 A2 训练一个分类器并将其应用于一个完全看不见的测试数据集。 我可以补充一点:在我的研究中,我发现当我在 10 倍 CV 设置中的数据集上独立应用 A1 和 A2 时,A1 很好地分类了正类,而 A2 很好地分类了负类。也许这就是级联给我带来好的结果的原因。

以上是关于在 Weka 中级联分类器的错误方法的主要内容,如果未能解决你的问题,请参考以下文章

Weka 分类器的参数

在 Weka 中实现元分类器的参数

Weka - 如何查找分类器的输入格式

在 MOA 中使用我的 weka 分类器

如何提高 Weka 中 SMO 分类器的性能?

运行 weka 分类器的 C# 代码