我有一个逻辑回归和一个随机的森林,我想通过平均来将它们(集成)组合为最终分类概率计算。
在Sci-kit学习中是否有内置的方式?我可以将两者的合奏用作分类器本身的某种方式?还是我需要滚动自己的分类器?
注意:Scikit-Learn投票分类器可能是现在做到这一点的最佳方法
旧答案:
对于值得我最终这样做的值:
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)
给出同样的问题,我使用了多数投票方法。任意梳理概率/得分是非常有问题的,因为您的不同分类器的性能可能会有所不同(例如,具有2个不同内核的SVM, 随机森林 另一个在不同训练集中训练的分类器)。
"称量"不同分类器的一种可能的方法可能是将其jaccard得分用作"权重"。(但是,据我了解,请警告不同的分数"全部相等",我知道我在合奏中拥有的梯度增强分类器的所有分数都使其所有分数为0.97、0.98、1.00或0.41/0。非常自信..)
sklearn.ensember.votingClassifier呢?
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.votingclassifier.html#sklearn.ensemble.votingclassifier
根据描述:
投票分类器实施背后的想法是在概念上结合不同的机器学习分类器,并使用多数投票或平均预测概率(软投票)来预测类标签。这样的分类器对于一组同样良好的模型很有用,以平衡其各个弱点。
现在 scikit-learn 具有堆叠classifier,可用于堆叠多个估计器。
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)