我正在使用高度不平衡的数据构建一个分类器。我在测试中感兴趣的策略是使用 3 个不同的重采样数据集集成模型。换句话说,每个数据集将包含稀有类的所有样本,但只有丰富类的 n 个样本(本文中提到的技术 #4(。
我想在每个重采样数据集上拟合 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)
谢谢!
通常,本文中显示的 #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))
看这里。也许您可以在手动拟合估算器后重用_predict_proba()
和_collect_probas()
函数。