【问题标题】:Best way to combine probabilistic classifiers in scikit-learn在 scikit-learn 中组合概率分类器的最佳方法
【发布时间】:2014-02-25 16:27:41
【问题描述】:

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

在 sci-kit learn 中有内置的方法吗?我可以通过某种方式将两者的集合用作分类器本身?还是我需要推出自己的分类器?

【问题讨论】:

  • 你需要自己滚动,没有办法组合两个任意分类器。
  • 在 sklearn github 上有几个正在进行的 PR 和未解决的问题,它们正在努力实现集成元估计器。不幸的是,它们都没有被合并。
  • @user1507844 你能在这里回答一个类似的问题吗? stackoverflow.com/questions/23645837/…

标签: python machine-learning classification scikit-learn


【解决方案1】:

注意: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)

【讨论】:

  • 您是否考虑过在平均预测分布之前校准您的估算器? scikit-learn.org/stable/modules/calibration.html
  • 尚未尝试,因为它仅在 0.16 中发布,但计划尽快尝试
  • 我试过校准,但至少对于我的具体问题,它实际上让事情变得更糟......
  • @user1507844 您的性能可能会越来越差,因为您对所有分类器的预测进行了同等加权。更好的方法可能是在组合预测时尝试使用权重向量最小化您的损失函数。查看第 50 行之后的代码:kaggle.com/hsperr/otto-group-product-classification-challenge/… 您甚至可以使用 hyperopt.github.io/hyperopt 之类的包来优化各个分类器的超参数
  • @Ryan 示例代码不是很有用。主要是因为算法具有不同的训练样本与有效样本的比率。例如,随机森林可以轻松拟合 100% 的训练数据,而逻辑回归只能拟合 70%。在验证数据集上,他们可以给出类似的结果,但是上面链接中的算法将大大超过 LR 上的 RF
【解决方案2】:

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

“权衡”不同分类器的一种可能方法是使用它们的 Jaccard 分数作为“权重”。 (但请注意,据我所知,不同的分数并不是“全部相等”,我知道我的集成中的梯度提升分类器的所有分数都为 0.97、0.98、1.00 或 0.41/0。IE 它是太自信了..)

【讨论】:

  • 多数投票可以很好​​地预测观察属于哪个类别,但如果我想知道它属于该类别的概率怎么办?我正在拟合我的个人分类器以最大限度地减少日志丢失,我认为这可以避免您描述的“过度自信”问题。
  • 问题主要在于不同预测器的性能水平不同。
  • 我不是专家,但也许有一种方法可以根据不同的预测变量的表现对其进行加权。你提到的 Jaccard 分数就是这样吗?
  • Jaccard 分数是一个统计分数/性能指标。比如准确率、精确度、召回率等。 (Jaccard 相似系数得分)。
  • @user1507844: 是的,并且(使用堆叠)这些权重可以从第二阶段分类器中学习(通常是逻辑回归,但也可以是加权平均);此外,逻辑回归比固定权重提供更多的力量;我们可以隐式地学习每个分类器好坏的具体情况。我们使用两个特征 + 来自 1 级分类器的结果来训练 2 级分类器。事实上,您甚至可以创建 2 级(元)功能。
【解决方案3】:

sklearn.ensemble.VotingClassifier 怎么样?

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

根据描述:

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

【讨论】:

  • 我最初发布这个问题时并不存在,但我认为这是我的代码的正确 sklearn 实现。很高兴现在在那里看到它!
  • 优秀。我在看过之后想知道,是否有可能为每个分类器提供不同的功能......
【解决方案4】:

现在 scikit-learn 具有 StackingClassifier,可用于堆叠多个估算器。

from sklearn.datasets import load_iris  
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import StackingClassifier
X, y = load_iris(return_X_y=True)
estimators = [
    ('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
    ('lg', LogisticRegression()))
   ]
clf = StackingClassifier(
estimators=estimators, final_estimator=LogisticRegression()
)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, stratify=y, random_state=42
)
clf.fit(X_train, y_train)
clf.predict_proba(X_test)

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2015-10-07
    • 2016-01-18
    • 1970-01-01
    • 2015-10-25
    • 2018-01-24
    • 2015-12-01
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多