在scikit-learn中结合概率分类器的最佳方法

use*_*844 24 python classification machine-learning scikit-learn

我有一个逻辑回归和一个随机森林,我想通过取平均值将它们(整体)组合起来进行最终的分类概率计算.

在sci-kit学习中是否有内置的方法可以做到这一点?在某些方面我可以使用两者的集合作为分类器本身?或者我需要滚动自己的分类器?

use*_*844 34

注意:scikit-learn Voting Classifier现在可能是最好的方法


老答案:

对于它的价值我最终做到如下:

class EnsembleClassifier(BaseEstimator, ClassifierMixin):
    def __init__(self, classifiers=None):
        self.classifiers = classifiers

    def fit(self, X, y):
        for classifier in self.classifiers:
            classifier.fit(X, y)

    def predict_proba(self, X):
        self.predictions_ = list()
        for classifier in self.classifiers:
            self.predictions_.append(classifier.predict_proba(X))
        return np.mean(self.predictions_, axis=0)
Run Code Online (Sandbox Code Playgroud)

  • 您是否考虑在平均预测分布之前校准估算器?http://scikit-learn.org/stable/modules/calibration.html (4认同)
  • @ user1507844你的表现可能会越来越差,因为你对所有分类器的预测都有同样的权重.更好的方法可能是在组合预测时尝试使用权重向量最小化损失函数.请看第50行之后的代码:https://www.kaggle.com/hsperr/otto-group-product-classification-challenge/finding-ensamble-weights您甚至可以使用像这样的包来优化各个分类器的超参数http://hyperopt.github.io/hyperopt/ (4认同)

Gri*_*ker 5

考虑到同样的问题,我使用了多数投票法。任意组合概率/分数是非常有问题的,因为不同分类器的性能可能不同(例如,具有 2 个不同内核的 SVM,+ 随机森林 + 在不同训练集上训练的另一个分类器)。

“权衡”不同分类器的一种可能方法可能是使用它们的 Jaccard 分数作为“权重”。(但请注意,据我了解,不同的分数并不是“全部相等”,我知道我的集合中的梯度增强分类器给出的所有分数为 0.97, 0.98, 1.00 或 0.41/0 。即它是非常自信..)

  • 多数投票可以很好​​地预测观察值属于哪个类别,但如果我想知道它属于该类别的概率怎么办?我正在调整我的个人分类器以最大限度地减少对数损失,我认为这可以避免您描述的“过度自信”问题。 (4认同)
  • @user1507844:是的,并且(使用**堆叠**)这些权重可以从第二阶段分类器(通常是逻辑回归,但也可以是加权平均)学习;此外,逻辑回归比固定权重具有更多功效;我们可以隐式地学习每个分类器好坏的具体情况。我们使用 1 级分类器的特征和结果来训练 2 级分类器。事实上,您甚至可以创建 2 级(元)功能。 (2认同)

Gab*_*iel 5

sklearn.ensemble.VotingClassifier 怎么样?

http://scikit-learn.org/stable/modules/ generated/sklearn.ensemble.VotingClassifier.html#sklearn.ensemble.VotingClassifier

根据描述:

投票分类器实现背后的想法是结合概念上不同的机器学习分类器,并使用多数投票或平均预测概率(软投票)来预测类别标签。这样的分类器对于一组性能同样良好的模型很有用,以平衡它们各自的弱点。