平衡随机森林分类器#

class imblearn.ensemble.BalancedRandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=False, oob_score=False, sampling_strategy='all', replacement=True, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None, monotonic_cst=None)[source]#

一个平衡的随机森林分类器。

平衡随机森林与经典随机森林的不同之处在于,它会从少数类中抽取一个引导样本,并从多数类中抽取相同数量的样本进行替换。

更多内容请参阅用户指南

在版本0.4中添加。

Parameters:
n_estimatorsint, default=100

森林中树木的数量。

criterion{“gini”, “entropy”}, default=”gini”

用于衡量分割质量的函数。支持的标准是用于基尼不纯度的“gini”和用于信息增益的“entropy”。 注意:此参数是特定于树的。

max_depthint, default=None

树的最大深度。如果为None,则节点将一直扩展,直到所有叶子都是纯的或所有叶子包含的样本少于min_samples_split。

min_samples_splitint or float, default=2

分割内部节点所需的最小样本数:

  • 如果是整数,则将min_samples_split视为最小数量。

  • 如果是浮点数,则 min_samples_split 是一个百分比,并且 ceil(min_samples_split * n_samples) 是每次分割的最小样本数。

min_samples_leafint or float, default=1

叶节点所需的最小样本数:

  • 如果是整数,则将min_samples_leaf视为最小数量。

  • 如果是浮点数,那么min_samples_leaf是一个分数,并且 ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。

min_weight_fraction_leaffloat, default=0.0

叶节点所需的最小权重分数(所有输入样本的权重总和)。当未提供sample_weight时,样本具有相同的权重。

max_features{“auto”, “sqrt”, “log2”}, int, float, or None, default=”sqrt”

在寻找最佳分割时要考虑的特征数量:

  • 如果是整数,则在每次分割时考虑max_features个特征。

  • 如果是浮点数,那么max_features是一个百分比,并且在每次分割时考虑int(max_features * n_features)个特征。

  • 如果为“auto”,则 max_features=sqrt(n_features)

  • 如果选择“sqrt”,则max_features=sqrt(n_features)(与“auto”相同)。

  • 如果为“log2”,则 max_features=log2(n_features)

  • 如果为None,则max_features=n_features

注意:即使需要实际检查超过max_features特征,对分割的搜索也不会停止,直到找到至少一个有效的节点样本分区。

max_leaf_nodesint, default=None

以最佳优先的方式种植具有max_leaf_nodes的树。 最佳节点定义为杂质相对减少。 如果为None,则叶节点数量不受限制。

min_impurity_decreasefloat, default=0.0

如果一个节点的分裂导致不纯度的减少大于或等于此值,则该节点将被分裂。 加权不纯度减少的方程如下:

N_t / N * (impurity - N_t_R / N_t * right_impurity
                    - N_t_L / N_t * left_impurity)

其中 N 是样本的总数,N_t 是当前节点的样本数,N_t_L 是左子节点的样本数,N_t_R 是右子节点的样本数。如果传递了 sample_weight,则 NN_tN_t_RN_t_L 都指的是加权和。

bootstrapbool, default=True

在构建树时是否使用引导样本。

在版本0.13中更改:在版本0.13中,bootstrap的默认值将从True更改为False。内部采样器已经通过replacement=True处理了引导。此实现遵循[1]中提出的算法。

oob_scorebool, default=False

是否使用袋外样本来估计泛化精度。

sampling_strategyfloat, str, dict, callable, default=”auto”

采样信息以对数据集进行采样。

  • float 时,它对应于重采样后少数类样本数量与多数类样本数量的期望比率。因此,该比率表示为 \(\alpha_{us} = N_{m} / N_{rM}\),其中 \(N_{m}\) 是少数类样本的数量,\(N_{rM}\) 是重采样后多数类样本的数量。

    警告

    float 仅适用于二分类。对于多类分类会引发错误。

  • str 时,指定重采样所针对的类别。不同类别中的样本数量将被均衡化。可能的选择有:

    'majority': 仅对多数类进行重采样;

    'not minority': 对除少数类之外的所有类进行重采样;

    'not majority': 重新采样除多数类之外的所有类;

    'all': 对所有类别进行重采样;

    'auto': 等同于 'not minority'.

  • dict时,键对应于目标类别。值对应于每个目标类别所需的样本数量。

  • 当可调用时,函数接受 y 并返回一个 dict。键对应于目标类别。值对应于每个类别所需的样本数量。

在版本0.11中更改:sampling_strategy的默认值将从"auto"更改为 "all"在版本0.13中。这将强制使用少数类的引导,如[1]中所提出的。

replacementbool, default=False

是否进行随机有放回抽样。

在版本0.11中更改:在版本0.13中,replacement的默认值将从False更改为True。这将强制使用少数类的引导并进行替换抽样,如[1]中所提出的。

n_jobsint, default=None

在交叉验证循环中使用的CPU核心数量。 None 表示1,除非在 joblib.parallel_backend 上下文中。 -1 表示使用所有处理器。更多详情请参见 术语表

random_stateint, RandomState instance, default=None

控制算法的随机化。

  • 如果是整数,random_state 是随机数生成器使用的种子;

  • 如果 RandomState 实例,random_state 是随机数生成器;

  • 如果 None,随机数生成器是 np.random 使用的 RandomState 实例。

verboseint, default=0

控制树构建过程的详细程度。

warm_startbool, default=False

当设置为True时,重用之前调用的解决方案来拟合并添加更多的估计器到集成中,否则,只需拟合一个全新的森林。

class_weightdict, list of dicts, {“balanced”, “balanced_subsample”}, default=None

与类关联的权重以字典形式表示,其中键为类标签,值为权重。 如果未提供,则假设所有类的权重均为1。对于 多输出问题,可以按照y列的顺序提供字典列表。 请注意,对于多输出(包括多标签)问题,权重应为 每个列的每个类在其自己的字典中定义。例如, 对于四类多标签分类,权重应为 [{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] 而不是[{1:1}, {2:5}, {3:1}, {4:1}]。 “balanced”模式使用y的值自动调整 权重与输入数据中的类频率成反比,如 n_samples / (n_classes * np.bincount(y)) “balanced_subsample”模式与“balanced”模式相同,只是 权重是基于每棵树的引导样本计算的。 对于多输出,y的每一列的权重将被相乘。 请注意,如果指定了sample_weight,这些权重将与sample_weight(通过 fit方法传递)相乘。

ccp_alphanon-negative float, default=0.0

用于最小成本复杂度剪枝的复杂度参数。将选择成本复杂度小于ccp_alpha的最大成本复杂度的子树。默认情况下,不进行剪枝。

在版本0.6中添加:scikit-learn的0.22版本中添加

max_samplesint or float, default=None

如果 bootstrap 为 True,则从 X 中抽取的样本数量用于训练每个基础估计器。

  • 如果为None(默认),则绘制X.shape[0]个样本。

  • 如果是整数,则抽取 max_samples 个样本。

  • 如果是浮点数,则绘制 max_samples * X.shape[0] 个样本。因此, max_samples 应该在区间 (0, 1) 内。

请注意,最终使用的样本数量将是max_samples中给出的样本数量与重采样后获得的样本数量之间的最小值。

在版本0.6中添加:scikit-learn的0.22版本中添加

monotonic_cstarray-like of int of shape (n_features), default=None
Indicates the monotonicity constraint to enforce on each feature.
  • 1: 单调递增

  • 0: 无约束

  • -1: 单调递减

如果 monotonic_cst 为 None,则不应用任何约束。

Monotonicity constraints are not supported for:
  • 多类分类(即当 n_classes > 2 时),

  • 多输出分类(即当 n_outputs_ > 1 时),

  • 在包含缺失值的数据上训练的分类。

约束条件适用于正类的概率。

在版本0.12中添加:仅在安装了scikit-learn >= 1.4时支持。否则,会引发ValueError

Attributes:
estimator_DecisionTreeClassifier instance

用于创建拟合子估计器集合的子估计器模板。

在版本0.10中添加。

estimators_list of DecisionTreeClassifier

拟合的子估计器的集合。

base_sampler_RandomUnderSampler

用于构建后续采样器列表的基础采样器。

samplers_list of RandomUnderSampler

已拟合采样器的集合。

pipelines_list of Pipeline.

拟合的管道集合(采样器 + 树)。

classes_ndarray of shape (n_classes,) or a list of such arrays

类别标签(单输出问题),或类别标签数组的列表(多输出问题)。

n_classes_int or list

类的数量(单输出问题),或包含每个输出的类数量的列表(多输出问题)。

n_features_in_int

输入数据集中的特征数量。

在版本0.9中添加。

feature_names_in_ndarray of shape (n_features_in_,)

fit期间看到的特征名称。仅在X具有全部为字符串的特征名称时定义。

在版本0.9中添加。

n_outputs_int

执行fit时的输出数量。

feature_importances_ndarray of shape (n_features,)

基于杂质特征的重要性。

oob_score_float

使用袋外估计获得的训练数据集的分数。

oob_decision_function_ndarray of shape (n_samples, n_classes)

使用训练集上的袋外估计计算的决策函数。如果n_estimators较小,可能在引导过程中从未遗漏过某个数据点。在这种情况下,oob_decision_function_可能包含NaN。

另请参阅

BalancedBaggingClassifier

Bagging分类器,其中每个基础估计器都在平衡的bootstrap上进行训练。

EasyEnsembleClassifier

在平衡自助法上训练的AdaBoost分类器集成。

RUSBoostClassifier

AdaBoost分类器在每一轮提升中使用随机欠采样来平衡每个自举样本。

参考文献

[1] (1,2,3)

陈超、Andy Liaw 和 Leo Breiman。 “使用随机森林学习不平衡数据。” 加州大学伯克利分校 110 (2004): 1-12.

示例

>>> from imblearn.ensemble import BalancedRandomForestClassifier
>>> from sklearn.datasets import make_classification
>>>
>>> X, y = make_classification(n_samples=1000, n_classes=3,
...                            n_informative=4, weights=[0.2, 0.3, 0.5],
...                            random_state=0)
>>> clf = BalancedRandomForestClassifier(
...     sampling_strategy="all", replacement=True, max_depth=2, random_state=0,
...     bootstrap=False)
>>> clf.fit(X, y)
BalancedRandomForestClassifier(...)
>>> print(clf.feature_importances_)
[...]
>>> print(clf.predict([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
...                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]))
[1]

方法

兼容性

将森林中的树应用于X,返回叶子的索引。

decision_path(X)

返回森林中的决策路径。

fit(X, y[, sample_weight])

从训练集 (X, y) 构建一个树的森林。

get_metadata_routing()

获取此对象的元数据路由。

get_params([deep])

获取此估计器的参数。

predict(X)

预测X的类别。

predict_log_proba(X)

预测X的类别对数概率。

predict_proba(X)

预测X的类别概率。

score(X, y[, sample_weight])

返回给定测试数据和标签的平均准确率。

set_fit_request(*[, sample_weight])

传递给fit方法的请求元数据。

set_params(**params)

设置此估计器的参数。

set_score_request(*[, sample_weight])

传递给score方法的请求元数据。

apply(X)[source]#

将森林中的树应用于X,返回叶子的索引。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

输入样本。在内部,其数据类型将被转换为 dtype=np.float32。如果提供了稀疏矩阵,它将被转换为稀疏的 csr_matrix

Returns:
X_leavesndarray of shape (n_samples, n_estimators)

对于X中的每个数据点x和森林中的每棵树,返回x最终所在的叶子的索引。

decision_path(X)[source]#

返回森林中的决策路径。

在版本0.18中添加。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

输入样本。在内部,其数据类型将被转换为 dtype=np.float32。如果提供了稀疏矩阵,它将被转换为稀疏的 csr_matrix

Returns:
indicatorsparse matrix of shape (n_samples, n_nodes)

返回一个节点指示矩阵,其中非零元素表示样本经过这些节点。该矩阵为CSR格式。

n_nodes_ptrndarray of shape (n_estimators + 1,)

来自 indicator[n_nodes_ptr[i]:n_nodes_ptr[i+1]] 的列给出了第 i 个估计器的指标值。

property estimators_samples_#

每个基础估计器的抽取样本子集。

返回一个动态生成的索引列表,用于标识用于拟合集成中每个成员的样本,即袋内样本。

注意:每次调用该属性时都会重新创建列表,以便通过不存储采样数据来减少对象的内存占用。因此,获取该属性可能比预期的要慢。

property feature_importances_#

基于杂质特征的重要性。

越高,特征越重要。 特征的重要性计算为该特征带来的准则的(归一化)总减少量。它也被称为基尼重要性。

警告:基于不纯度的特征重要性可能会对高基数特征(许多唯一值)产生误导。请参见sklearn.inspection.permutation_importance作为替代方案。

Returns:
feature_importances_ndarray of shape (n_features,)

此数组的值总和为1,除非所有树都是仅由根节点组成的单节点树,在这种情况下,它将是一个零数组。

fit(X, y, sample_weight=None)[source]#

从训练集 (X, y) 构建一个树的森林。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

训练输入样本。在内部,其数据类型将被转换为dtype=np.float32。如果提供了稀疏矩阵,它将被转换为稀疏的csc_matrix

yarray-like of shape (n_samples,) or (n_samples, n_outputs)

目标值(分类中的类标签,回归中的实数)。

sample_weightarray-like of shape (n_samples,)

样本权重。如果为None,则样本权重相等。在搜索每个节点的分割时,会忽略那些会导致子节点净权重为零或负的分割。在分类的情况下,如果分割会导致任一子节点中任何单一类别的权重为负,则也会忽略这些分割。

Returns:
selfobject

拟合的实例。

get_metadata_routing()[source]#

获取此对象的元数据路由。

请查看用户指南了解路由机制的工作原理。

Returns:
routingMetadataRequest

一个封装路由信息的MetadataRequest

get_params(deep=True)[source]#

获取此估计器的参数。

Parameters:
deepbool, default=True

如果为True,将返回此估计器及其包含的子对象的参数。

Returns:
paramsdict

参数名称映射到它们的值。

predict(X)[source]#

预测X的类别。

输入样本的预测类别是森林中树木的投票结果,根据它们的概率估计进行加权。也就是说,预测类别是在所有树木中具有最高平均概率估计的类别。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

输入样本。在内部,其数据类型将被转换为 dtype=np.float32。如果提供了稀疏矩阵,它将被转换为稀疏的 csr_matrix

Returns:
yndarray of shape (n_samples,) or (n_samples, n_outputs)

预测的类别。

predict_log_proba(X)[source]#

预测X的类别对数概率。

输入样本的预测类别对数概率计算为森林中树木的预测类别概率的平均值的对数。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

输入样本。在内部,其数据类型将被转换为 dtype=np.float32。如果提供了稀疏矩阵,它将被转换为稀疏的 csr_matrix

Returns:
pndarray of shape (n_samples, n_classes), or a list of such arrays

输入样本的类别概率。类别的顺序与属性 classes_ 中的顺序相对应。

predict_proba(X)[source]#

预测X的类别概率。

输入样本的预测类别概率计算为森林中树木的预测类别概率的平均值。单棵树的类别概率是叶节点中相同类别样本的比例。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

输入样本。在内部,其数据类型将被转换为 dtype=np.float32。如果提供了稀疏矩阵,它将被转换为稀疏的 csr_matrix

Returns:
pndarray of shape (n_samples, n_classes), or a list of such arrays

输入样本的类别概率。类别的顺序与属性 classes_ 中的顺序相对应。

score(X, y, sample_weight=None)[source]#

返回给定测试数据和标签的平均准确率。

在多标签分类中,这是子集准确性,这是一个严格的度量标准,因为您要求每个样本的每个标签集都被正确预测。

Parameters:
Xarray-like of shape (n_samples, n_features)

测试样本。

yarray-like of shape (n_samples,) or (n_samples, n_outputs)

X 的真实标签。

sample_weightarray-like of shape (n_samples,), default=None

样本权重。

Returns:
scorefloat

self.predict(X) 相对于 y 的平均准确率。

set_fit_request(*, sample_weight: bool | None | str = '$UNCHANGED$') BalancedRandomForestClassifier[source]#

传递给fit方法的请求元数据。

请注意,此方法仅在 enable_metadata_routing=True 时相关(参见 sklearn.set_config)。 请参阅 用户指南 了解路由机制的工作原理。

每个参数的选项是:

  • True: 请求元数据,并在提供时传递给 fit。如果未提供元数据,则忽略该请求。

  • False: 不请求元数据,元估计器不会将其传递给 fit

  • None: 不请求元数据,如果用户提供了元数据,元估计器将引发错误。

  • str: 元数据应该使用这个给定的别名传递给元估计器,而不是原始名称。

默认情况下(sklearn.utils.metadata_routing.UNCHANGED)保留现有的请求。这允许您更改某些参数的请求,而不更改其他参数。

在版本1.3中添加。

注意

此方法仅在此估计器用作元估计器的子估计器时相关,例如在Pipeline内部使用。否则它没有效果。

Parameters:
sample_weightstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED

fit 方法中 sample_weight 参数的元数据路由。

Returns:
selfobject

更新后的对象。

set_params(**params)[source]#

设置此估计器的参数。

该方法适用于简单的估计器以及嵌套对象(如Pipeline)。后者具有__形式的参数,以便可以更新嵌套对象的每个组件。

Parameters:
**paramsdict

估计器参数。

Returns:
selfestimator instance

估计器实例。

set_score_request(*, sample_weight: bool | None | str = '$UNCHANGED$') BalancedRandomForestClassifier[source]#

传递给score方法的请求元数据。

请注意,此方法仅在 enable_metadata_routing=True 时相关(参见 sklearn.set_config)。 请参阅 用户指南 了解路由机制的工作原理。

每个参数的选项是:

  • True: 请求元数据,并在提供时传递给 score。如果未提供元数据,则忽略该请求。

  • False: 不请求元数据,元估计器不会将其传递给 score

  • None: 不请求元数据,如果用户提供了元数据,元估计器将引发错误。

  • str: 元数据应该使用这个给定的别名传递给元估计器,而不是原始名称。

默认情况下(sklearn.utils.metadata_routing.UNCHANGED)保留现有的请求。这允许您更改某些参数的请求,而不更改其他参数。

在版本1.3中添加。

注意

此方法仅在此估计器用作元估计器的子估计器时相关,例如在Pipeline内部使用。否则它没有效果。

Parameters:
sample_weightstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED

scoresample_weight 参数的元数据路由。

Returns:
selfobject

更新后的对象。

使用imblearn.ensemble.BalancedRandomForestClassifier的示例#

在不平衡数据集上拟合模型以及如何对抗偏差

Fitting model on imbalanced datasets and how to fight bias

使用重采样比较集成分类器

Compare ensemble classifiers using resampling