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

时间:2014-02-02 01:54:06

标签: python machine-learning classification scikit-learn

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

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

4 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:3)

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

“权衡”不同分类器的一种可能方法可能是将他们的Jaccard分数用作“重量”。 (但是要注意,据我所知,不同的分数并非“全部相等”,我知道我的合奏中的渐变增强分类器给出了它的所有分数为0.97,0.98,1.00或0.41 / 0.IE它是非常过分自信..)

答案 2 :(得分:3)

sklearn.ensemble.VotingClassifier怎么样?

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

根据说明:

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

答案 3 :(得分:0)

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