当各个分类器适合不同数据集时,如何在sklearn中构建投票分类器?

时间:2019-02-05 13:36:21

标签: machine-learning scikit-learn ensemble-learning

我正在使用高度不平衡的数据构建分类器。我在测试中感兴趣的策略是使用 3个不同的重采样数据集来集成模型。换句话说,每个数据集将具有稀有类别的 all 个样本,而丰富类别(technique #4 mentioned in this article)的 all 个样本。

我想在每个重新采样的数据集上拟合3个不同的VotingClassifiers,然后使用另一个 VotingClassifier(或类似方法)合并各个模型的结果。我知道建立一个投票分类器看起来像这样:

# First Model
rnd_clf_1 = RandomForestClassifier()
xgb_clf_1 = XGBClassifier()

voting_clf_1 = VotingClassifier(
    estimators = [
        ('rf', rnd_clf_1), 
        ('xgb', xgb_clf_1),
    ],
    voting='soft'
)

# And I can fit it with the first dataset this way:
voting_clf_1.fit(X_train_1, y_train_1)

但是如果它们三个适合不同的数据集,如何将它们三个堆叠?例如,如果我有三个拟合的模型(请参见下面的代码),则可以构建一个函数,在每个模型上调用.predict_proba()方法,然后“手动”对各个概率求平均值。

但是...还有更好的方法吗?

# Fitting the individual models... but how to combine the predictions?
voting_clf_1.fit(X_train_1, y_train_1)
voting_clf_2.fit(X_train_2, y_train_2)
voting_clf_3.fit(X_train_3, y_train_3)

谢谢!

1 个答案:

答案 0 :(得分:0)

通常,本文显示的#4方法是使用相同类型的分类器实现的。看来您想对每个样本数据集尝试VotingClassifier

imblearn.ensemble.BalancedBaggingClassifier中已经有此方法的实现,它是Sklearn Bagging方法的扩展。

您可以将估计量输入为VotingClassifier,将估计数输入为要执行数据集采样的次数。使用sampling_strategy参数来说明您要在多数类中使用的下采样比例。

工作示例:

from collections import Counter
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from imblearn.ensemble import BalancedBaggingClassifier # doctest: +NORMALIZE_WHITESPACE
X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape %s' % Counter(y))

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    random_state=0)

rnd_clf_1 = RandomForestClassifier()
xgb_clf_1 = xgb.XGBClassifier()

voting_clf_1 = VotingClassifier(
    estimators = [
        ('rf', rnd_clf_1), 
        ('xgb', xgb_clf_1),
    ],
    voting='soft'
)

bbc = BalancedBaggingClassifier(base_estimator=voting_clf_1, random_state=42)
bbc.fit(X_train, y_train) # doctest: +ELLIPSIS

y_pred = bbc.predict(X_test)
print(confusion_matrix(y_test, y_pred))

如果您想让sklearn用于投票分类器来汇总概率。参见here。手动拟合估计量后,可能可以重用_predict_proba()_collect_probas()函数。