使用多个分类器时 - 如何衡量集成的性能? [SciKit 学习]

Posted

技术标签:

【中文标题】使用多个分类器时 - 如何衡量集成的性能? [SciKit 学习]【英文标题】:When using multiple classifiers - How to measure the ensemble's performance? [SciKit Learn] 【发布时间】:2014-02-25 06:11:10 【问题描述】:

我有一个分类问题(预测一个序列是否属于一个类),为此我决定使用多种分类方法,以帮助过滤掉误报。

(问题在于生物信息学 - 将蛋白质序列分类为神经肽前体序列。Here's the original article 如果有人感兴趣,and the code used to generate features and to train a single predictor)。

现在,分类器具有大致相似的性能指标(在 10 倍 CV 的训练集上具有 83-94% 的准确度/精度/等等),所以我的“幼稚”方法是简单地使用多个分类器(随机森林、 ExtraTrees、SVM(线性核)、SVM(RBF 核)和 GRB),并使用简单多数票。

我的问题是: 如何获得不同分类器的性能指标和/或其投票预测? 也就是说,我想看看使用多个分类器是否能提高我的性能,或者它们的哪种组合能提高。

我的直觉可能是使用 ROC 分数,但我不知道如何“组合”结果并从分类器的组合中得到它。 (也就是说,仅查看每个分类器的 ROC 曲线是什么 [已经知道],然后使用分类器组合查看训练数据的 ROC 曲线或 AUC)。

(我目前使用随机森林和 ExtraTrees 方法使用“预测概率”过滤预测,然后我任意过滤预测分数低于“0.85”的结果。另外一层过滤是“有多少分类器同意这一点蛋白质的阳性分类”)。

非常感谢!!

(website 实现,我们使用多个分类器 - http://neuropid.cs.huji.ac.il/)

整个 shebang 是使用 SciKit learn 和 python 实现的。引用和所有!)

【问题讨论】:

这在某种程度上是一个离题的问题,但是您是否在skilearn 中找到了适用于多个分类器系统的现成函数和类,或者您是否手动编写了代码? (专门用于学习融合之类的东西) 我手动编码的;令人惊讶的是,没有内置分类器堆叠/融合(除了现有的模型,如 AdaBoost、Forest ensembles 等)。 堆叠或 viting 并不难天真地做,例如; ***.com/questions/21506128/… 【参考方案1】:

要评估集成的性能,只需按照与通常相同的方法进行即可。但是,您需要首先获得 10 折数据集分区,并且对于每个折,在同一折上训练所有集成,测量准确度,冲洗并重复其他折,然后计算集成的准确度。因此,关键区别在于在评估集成时不使用 k 折交叉验证来训练单个算法。重要的是不要让 ensemble 直接看到测试数据,也不要让其中一种算法看到测试数据。

还要注意,RF 和 Extra Trees 本身已经是集成算法。

另一种方法(再次确保集成方法)是获取分类器输出的概率和 \ 或标签,并将它们输入另一个产生预测的分类器(例如 DT、RF、SVM 或其他分类器)通过结合来自这些其他分类器的最佳猜测。这被称为"Stacking"

【讨论】:

谢谢! (所以 - 要么结合集成的结果并将其视为一个预测器,要么学习堆叠?好的。) 堆叠没有太多要学的。只需优化单个算法,然后将其结果输入另一个机器学习器。如果回答了您的问题,请标记为答案。【参考方案2】:

您可以使用线性回归进行堆叠。对于每 10 倍,您可以使用以下方式拆分数据:

8 个训练集 1 个验证集 1 个测试集

使用训练集和验证集优化每个算法的超参数,然后使用线性回归(或逻辑回归)在验证集上叠加您的预测。你的最终模型将是 p = a_o + a_1 p_1 + … + a_k p_K,其中 K 是分类器的数量,p_k 是模型 k 给出的概率,a_k 是模型 k 的权重。如果模型没有给出概率,您也可以直接使用预测结果。

如果您的模型相同,您可以同时优化模型的参数和权重。

如果你有明显的差异,你可以为每个不同的参数做不同的 bin。例如,一个 bin 可以是短序列,而另一个 bin 可以是长序列。或不同类型的蛋白质。

您可以使用任何您想要的指标,只要它有意义,例如非混合算法。

您可能想查看 2007 年 Belkor 的 Netflix 挑战解决方案,混合部分。 2008年和2009年他们使用了更先进的技术,你可能也会感兴趣。

【讨论】:

当我已经选择了可以提供概率输出的模型时,使用 Log Reg 真的更好吗? (实际上,我在训练期间尝试使用 log.reg 和 sigmoidal kernel+SVM,但性能很差)。谢谢!

以上是关于使用多个分类器时 - 如何衡量集成的性能? [SciKit 学习]的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战第7章——利用AdaBoost元算法提高分类性能

Python机器学习(基础篇---监督学习(集成模型))

spark.mllib源码阅读-bagging方法

尝试使用管道和网格搜索运行随机森林分类器时出错

人工智能-集成学习

Ruby Web事务监控