我正在使用高度不平衡的数据构建分类器。我在测试中感兴趣的策略是使用 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)
谢谢!
答案 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()
函数。