Python 在scikit学习中组合概率分类器的最佳方法

Python 在scikit学习中组合概率分类器的最佳方法,python,machine-learning,classification,scikit-learn,Python,Machine Learning,Classification,Scikit Learn,我有一个逻辑回归和一个随机森林,我想通过取一个平均值,将它们(集合)结合起来进行最终分类概率计算 在sci工具包学习中是否有内置的方法?在某种程度上,我可以将两者的集合用作分类器本身?或者我需要滚动我自己的分类器吗?注意:现在可能是最好的方法 旧答案: 值得一提的是,我最终做了如下工作: class EnsembleClassifier(BaseEstimator, ClassifierMixin): def __init__(self, classifiers=None):

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

在sci工具包学习中是否有内置的方法?在某种程度上,我可以将两者的集合用作分类器本身?或者我需要滚动我自己的分类器吗?

注意:现在可能是最好的方法


旧答案:

值得一提的是,我最终做了如下工作:

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)
,我采用了多数票投票的方式。 任意组合概率/分数是非常有问题的,因为不同分类器的性能可能不同(例如,具有两个不同核的SVM,+随机森林+在不同训练集上训练的另一个分类器)

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

关于sklearn.employee.VotingClassifier呢

根据描述:

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

现在有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)

你需要自己动手,没有办法组合两个任意的分类器。sklearn github上有几个正在进行的PRs和未决问题,它们正致力于集成元估计器。不幸的是,它们都没有合并。@user1507844您能在这里尝试一下类似的问题吗?多数票投票可以预测观察结果属于哪一类,但如果我想知道它属于那一类的概率呢?我正在安装我的个人分类器,以最大限度地减少日志损失,我认为这避免了您描述的“过度自信”问题。问题主要在于不同预测因素的性能水平不同。我不是专家,但也许有一种方法可以根据不同预测因素的性能对其进行加权。这就是你提到的Jaccard分数吗?Jaccard分数是一个统计分数/绩效指标。例如准确性、精确性、召回率等。(Jaccard相似系数得分)。@user1507844:yes和(使用叠加)这些权重可以从第二阶段分类器中学习(通常是逻辑回归,但也可以是加权平均);此外,逻辑回归比固定权重具有更大的功效;我们可以隐式地了解每个分类器的好坏。我们使用两个特征+来自一级分类器的结果来训练二级分类器。事实上,你甚至可以创建二级(元)特征。你是否考虑在平均化它们的预测分布之前校准估计器?还没有尝试过,因为它只在0.16版本中出现,但计划尝试一下我已经尝试过校准,但至少对于我的特定问题,它实际上让事情变得更糟…@user1507844您可能会变得更差,因为您对所有分类器的预测进行了同等权重。更好的方法可能是在组合预测时尝试使用权重向量最小化损失函数。请看第50行后面的代码:您甚至可以使用@Ryan之类的包来优化单个分类器的超参数。示例代码不是很有用。主要是因为algos的训练和有效样本的比率不同。例如,随机森林可以很容易地拟合100%的训练数据,而逻辑回归只能拟合70%。在验证数据集上,他们可以给出类似的结果,但是上面链接中的algo会将RF置于LR之上,这在我最初发布这个问题时是不存在的,但我认为这是我代码的正确sklearn实现。很高兴现在在那里看到它!杰出的我想知道看了之后,是否有可能每个分类器都有不同的特征。。。