Imbalanced-learn 5. Ensemble of samplers
Ensemble of samplers
- 5. 采样器的集成方法
- 5.1. 包含内部平衡采样器的分类器
- 5.1.1. 袋外分类器(Bagging classifier)
- 5.1.2. 随机树森林
- 5.1.3. 提升(Boosting)
5. 采样器的集成方法
5.1. 包含内部平衡采样器的分类器
5.1.1. 袋外分类器(Bagging classifier)
在集成分类器中,bagging 方法会在数据的不同随机子集上构建多个估计器。在 scikit-learn 中,该分类器被称为 BaggingClassifier
。然而,这个分类器不允许对每个数据子集进行平衡处理。因此,在不平衡数据集上训练时,该分类器会偏向多数类:
>>> from sklearn.datasets import make_classification
>>> X, y = make_classification(n_samples=10000, n_features=2, n_informative=2,
... n_redundant=0, n_repeated=0, n_classes=3,
... n_clusters_per_class=1,
... weights=[0.01, 0.05, 0.94], class_sep=0.8,
... random_state=0)
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import balanced_accuracy_score
>>> from sklearn.ensemble import BaggingClassifier
>>> from sklearn.tree import DecisionTreeClassifier
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
>>> bc = BaggingClassifier(DecisionTreeClassifier(), random_state=0)
>>> bc.fit(X_train, y_train) #doctest:
BaggingClassifier(...)
>>> y_pred = bc.predict(X_test)
>>> balanced_accuracy_score(y_test, y_pred)
0.77...
在 BalancedBaggingClassifier
中,每一个自助样本还会进一步进行重采样,以实现所需的 sampling_strategy
。因此,BalancedBaggingClassifier
拥有与 scikit-learn 的 BaggingClassifier
相同的参数。此外,采样方式可以通过参数 sampler
,或者通过 sampling_strategy
和 replacement
这两个参数来控制,后者适用于希望使用 RandomUnderSampler
的情况:
>>> from imblearn.ensemble import BalancedBaggingClassifier
>>> bbc = BalancedBaggingClassifier(DecisionTreeClassifier(),
... sampling_strategy='auto',
... replacement=False,
... random_state=0)
>>> bbc.fit(X_train, y_train)
BalancedBaggingClassifier(...)
>>> y_pred = bbc.predict(X_test)
>>> balanced_accuracy_score(y_test, y_pred)
0.8...
更改 sampler
将会引出不同的已知实现方法[MO97], [HKT09], [WY09]。你可以参考以下示例,以了解这些不同方法在实际中的应用:使用采样器的Bagging分类器
5.1.2. 随机树森林
BalancedRandomForestClassifier
是另一种集成方法,森林中的每棵树都会获得一个平衡的自助样本 [CLB+04]。此类提供了 RandomForestClassifier
的所有功能:
>>> from imblearn.ensemble import BalancedRandomForestClassifier
>>> brf = BalancedRandomForestClassifier(
... n_estimators=100, random_state=0, sampling_strategy="all", replacement=True,
... bootstrap=False,
... )
>>> brf.fit(X_train, y_train)
BalancedRandomForestClassifier(...)
>>> y_pred = brf.predict(X_test)
>>> balanced_accuracy_score(y_test, y_pred)
0.8...
5.1.3. 提升(Boosting)
已有多种基于提升(Boosting)的方法被设计出来。
RUSBoostClassifier
会在执行增强迭代之前对数据集进行随机欠采样 [SKVHN09]:
>>> from imblearn.ensemble import RUSBoostClassifier
>>> rusboost = RUSBoostClassifier(n_estimators=200, algorithm='SAMME.R',
... random_state=0)
>>> rusboost.fit(X_train, y_train)
RUSBoostClassifier(...)
>>> y_pred = rusboost.predict(X_test)
>>> balanced_accuracy_score(y_test, y_pred)
0...
一种特别的方法是在装袋分类器中使用 AdaBoostClassifier
作为基学习器,这种方法被称为“EasyEnsemble”。 EasyEnsembleClassifier
允许对在平衡自助样本上训练的 AdaBoost 学习器进行装袋集成 [LWZ08]。与 BalancedBaggingClassifier
的 API 类似,可以按如下方式构建集成模型:
>>> from imblearn.ensemble import EasyEnsembleClassifier
>>> eec = EasyEnsembleClassifier(random_state=0)
>>> eec.fit(X_train, y_train)
EasyEnsembleClassifier(...)
>>> y_pred = eec.predict(X_test)
>>> balanced_accuracy_score(y_test, y_pred)
0.6...
示例
- 使用重采样比较集成分类器
该篇文章由ChatGPT翻译,如有疑问,欢迎提交Issues