ExplainableBoostingClassifier#

算法描述链接:EBM

在 2024 年 2 月 8 日发布的 v0.5.1 版本中,EBM 训练算法默认启用了贪婪和平滑功能。贪婪和平滑可以提高准确性,但与早期使用纯循环 (cyclic boosting) 算法且不带平滑功能学习到的特征函数图相比,可能会改变学习到的特征函数图。要训练类似于 v0.5.0 及更早版本默认设置的 EBM,请将 greedy_ratio 参数设置为 0。

class interpret.glassbox.ExplainableBoostingClassifier(feature_names=None, feature_types=None, max_bins=1024, max_interaction_bins=64, interactions=0.9, exclude=None, validation_size=0.15, outer_bags=14, inner_bags=0, learning_rate=0.015, greedy_ratio=10.0, cyclic_progress=False, smoothing_rounds=75, interaction_smoothing_rounds=75, max_rounds=25000, early_stopping_rounds=100, early_stopping_tolerance=1e-05, min_samples_leaf=4, min_hessian=0.0001, reg_alpha=0.0, reg_lambda=0.0, max_delta_step=0.0, gain_scale=5.0, min_cat_samples=10, cat_smooth=10.0, missing='separate', max_leaves=2, monotone_constraints=None, objective='log_loss', n_jobs=- 2, random_state=42)#

一个可解释增强分类器。

参数:
  • feature_names (str 列表, default=None) – 特征名称列表。

  • feature_types (FeatureType 列表, default=None) –

    特征类型列表。FeatureType 可以是

    • ’auto’:自动检测

    • ’quantile’:连续,等密度分箱

    • ’rounded_quantile’:连续,分位数分箱,但截断值尽可能四舍五入

    • ’uniform’:连续,等宽分箱

    • ’winsorized’:连续,等宽分箱,但最左和最右的截断值由分位数确定

    • ’continuous’:使用连续特征的默认分箱方式,当前为 ‘quantile’

    • [float 列表]:连续,使用指定的截断值。例如:[5.5, 8.75]

    • [str 列表]:有序分类特征,顺序有意义。例如:[“low”, “medium”, “high”]

    • ’nominal’:无序分类特征,顺序无意义。例如:国家名称

  • max_bins (int, default=1024) – 主要效应阶段每个特征的最大分箱数。

  • max_interaction_bins (int, default=64) – 交互项阶段每个特征的最大分箱数。

  • interactions (int, float, 或 特征索引元组列表, default=0.9) –

    模型中包含的交互项。选项如下:

    • 整数 (1 <= interactions):自动选择的交互项数量

    • 百分比 (interactions < 1.0):通过将特征数量乘以该百分比来确定交互项的整数数量

    • 元组列表:元组包含每个可加项中的特征索引。除了对,interactions 参数也接受更高阶的交互项。它还接受单变量项,这将导致算法在增强交互项的同时增强主要项。当同时增强主要项和交互项时,exclude 参数应设置为 ‘mains’,并且当前 max_bins 需要等于 max_interaction_bins。

  • exclude ('mains'特征索引|名称元组列表, default=None) – 要排除的特征或项。

  • validation_size (intfloat, default=0.15) –

    验证集大小。用于增强期间的早期停止,也需要用于创建外部袋。

    • 整数 (1 <= validation_size):放入验证集的样本数量

    • 百分比 (validation_size < 1.0):放入验证集的数据百分比

    • 0:关闭早期停止。外部袋没有作用。误差界将消除。

  • outer_bags (int, default=14) – 外部袋数量。外部袋用于生成误差界并帮助平滑图表。

  • inner_bags (int, default=0) – 内部袋数量。0 表示关闭内部袋。

  • learning_rate (float, default=0.015) – 增强学习率。

  • greedy_ratio (float, default=10.0) – 贪婪增强步骤相对于循环增强步骤的比例。值为 0 将禁用贪婪增强。

  • cyclic_progress (boolfloat, default=False) – 此参数指定将积极有助于提高模型性能的增强循环比例。它表示为介于 0 和 1 之间的布尔值或浮点数,默认设置为 True(1.0),表示期望 100% 的循环都能取得进展。如果在某个循环中未能取得进展,该循环也不会浪费;相反,它将用于更新与每个特征在预测目标变量方面的有效性相关的内部增益计算。将此参数设置为小于 1.0 的值有助于防止过拟合。

  • smoothing_rounds (int, default=75) – 用于设定主要效应特征图基本形状的初始高度正则化轮数。

  • interaction_smoothing_rounds (int, default=75) – 用于设定拟合过程中交互效应特征图基本形状的初始高度正则化轮数。

  • max_rounds (int, default=25000) – 总增强轮数,每轮包含 n_terms 增强步骤。

  • early_stopping_rounds (int, default=100) – 在没有改进的情况下触发早期停止的轮数。0 表示关闭早期停止,增强将精确执行 max_rounds 轮。

  • early_stopping_tolerance (float, default=1e-5) – 容忍度,用于决定被视为改进所需的最小增量,从而阻止算法早期停止。early_stopping_tolerance 表示为早期停止指标的百分比。负值表示在停止之前,个体模型应过拟合。EBM 是模型的 bagged 集成。将 early_stopping_tolerance 设置为零(甚至负值),可以允许学习使每个个体模型轻微过拟合,这可以提高整个集成的准确性。过度拟合每个个体模型会以增加个体模型的方差(由于过拟合)为代价降低每个模型的偏差。但对集成中的模型进行平均可以在不大幅改变偏差的情况下降低方差。由于目标是找到模型集成的最佳偏差-方差权衡——而不是个体模型——因此个体模型的少量过拟合可以提高整个集成的准确性。

  • min_samples_leaf (int, default=4) – 叶子节点中允许的最小样本数。

  • min_hessian (float, default=1e-4) – 考虑潜在分割有效所需的最小 Hessian 值。

  • reg_alpha (float, default=0.0) – L1 正则化。

  • reg_lambda (float, default=0.0) – L2 正则化。

  • max_delta_step (float, default=0.0) – 用于限制树叶子节点的最大输出。<=0.0 表示没有约束。

  • gain_scale (float, default=5.0) – 应用于无序分类特征的缩放因子。大于 1.0 的缩放因子将使算法更侧重于无序分类特征。

  • min_cat_samples (int, default=10) – 单独处理一个类别所需的最小样本数。如果低于此阈值,该类别将与样本数较少的其他类别合并。

  • cat_smooth (float, default=10.0) – 用于分类特征。这可以减少分类特征中的噪声影响,特别是对于数据有限的类别。

  • missing (str, default="separate") –

    增强过程中处理缺失值的方法。缺失值箱的位置会影响生成的模型图。例如,将箱放在“低”侧可能会导致缺失值影响较低的分箱,反之亦然。此参数不影响模型中缺失箱的最终位置(缺失箱在 term_scores_ 属性中将保持在索引 0)。missing 的可能值有

    • ’low’:将缺失箱放在图的左侧。

    • ’high’:将缺失箱放在图的右侧。

    • ’separate’:在每个增强步骤中将缺失箱放在其自己的叶子节点中,使其位置无关。这可能导致过拟合,尤其当缺失值比例很小时。

    • ’gain’:在每个增强步骤中,根据增益选择缺失值贡献的最佳叶子节点。

  • max_leaves (int, default=2) – 每棵树中允许的最大叶子节点数。

  • monotone_constraints (int 列表, default=None) –

    此参数允许您在模型拟合期间为每个特征与目标变量的关系指定单调约束。但是,通常建议在拟合后使用 monotonize 函数应用单调约束,而不是在拟合过程中设置它们。此建议基于以下观察:在拟合过程中,增强算法可能会通过利用另一个相关特征来补偿一个特征上的单调约束,从而可能掩盖任何单调违规。

    如果您选择定义单调约束,monotone_constraints 应该是一个长度等于特征数量的列表。列表中的每个元素对应一个特征,并应采用以下值之一:

    • 0:对相应特征的部分响应不施加单调约束。

    • +1:相应特征的部分响应应随目标单调递增。

    • -1:相应特征的部分响应应随目标单调递减。

  • objective (str, default="log_loss") – 要优化的目标函数。

  • n_jobs (int, default=-2) – 并行运行的作业数。负整数的解释遵循 joblib 的公式 (n_cpus + 1 + n_jobs),就像 scikit-learn 一样。例如:-2 表示使用除 1 之外的所有线程。

  • random_state (intNone, default=42) – 随机状态。None 使用 device_random 并生成不可重复的序列。

变量:
  • classes_ (形状为 (n_classes,) 的 bool、int 或 unicode 数组) – 类别标签。

  • n_features_in_ (int) – 特征数量。

  • feature_names_in_ (str 列表) – 解析后的特征名称。名称可以来自 feature_names、X,或自动生成。

  • feature_types_in_ (str 列表) – 解析后的特征类型。可以是:‘continuous’、‘nominal’ 或 ‘ordinal’。

  • bins_ (List[Union[List[Dict[str, int]], List[形状为 (n_cuts,) 的 float 数组]]]) – 每个特征的分箱定义列表。列表中的每个特征都包含一个分箱分辨率列表。分箱分辨率列表中的第一项用于主要效应特征的分箱。如果分箱分辨率列表中有更多项,它们将定义连续级别分辨率的分箱。如果存在,索引 1 的项定义对的分箱。最后一个分箱分辨率定义了所有连续交互级别的分箱。如果分箱分辨率列表包含字典,则特征是“nominal”或“ordinal”分类特征。如果分箱分辨率列表包含数组,则特征是“continuous”,数组将包含将连续值分隔到分箱中的浮点截断点。

  • feature_bounds_ (形状为 (n_features, 2) 的 float 数组) – 每个特征的最小/最大边界。feature_bounds_[feature_index, 0] 是特征的最小值,feature_bounds_[feature_index, 1] 是特征的最大值。分类特征的最小和最大值为 NaN。

  • histogram_edges_ (None 列表或形状为 (n_hist_edges,) 的 float 数组) – 每个特征的直方图边缘列表。分类特征在其特征索引处的列表中包含 None。

  • histogram_weights_ (形状为 (n_hist_bins,) 的 float 数组列表) – 每个特征的直方图分箱中总样本权重列表。

  • unique_val_counts_ (形状为 (n_features,) 的 int 数组) – 每个特征的唯一特征值数量计数。

  • term_features_ (特征索引元组列表) – 模型中使用的可加项及其组成特征索引。

  • term_names_ (str 列表) – 项名称列表。

  • bin_weights_ (形状为 (n_feature0_bins, ..., n_featureN_bins) 的 float 数组列表) – 每个项的张量分箱中总样本权重列表。

  • bagged_scores_ (形状为 (n_outer_bags, n_feature0_bins, ..., n_featureN_bins, n_classes)(n_outer_bags, n_feature0_bins, ..., n_featureN_bins) 的 float 数组列表) – 每个项的 bagged 模型得分列表。对于二元分类,长度为 n_classes 的最后一维被丢弃。

  • term_scores_ (形状为 (n_feature0_bins, ..., n_featureN_bins, n_classes)(n_feature0_bins, ..., n_featureN_bins) 的 float 数组列表) – 每个项的模型得分列表。对于二元分类,长度为 n_classes 的最后一维被丢弃。

  • standard_deviations_ (形状为 (n_feature0_bins, ..., n_featureN_bins, n_classes)(n_feature0_bins, ..., n_featureN_bins) 的 float 数组列表) – 每个项的 bagged 模型得分标准差列表。对于二元分类,长度为 n_classes 的最后一维被丢弃。

  • link_ (str) – 用于将预测或目标转换为线性空间可加得分,并通过逆链接进行反向转换的链接函数。可能的值包括:“monoclassification”、“custom_binary”、“custom_ovr”、“custom_multinomial”、“mlogit”、“vlogit”、“logit”、“probit”、“cloglog”、“loglog”、“cauchit”

  • link_param_ (float) – 链接函数可以使用的浮点值。对于分类,仅由“custom_classification”使用。

  • bag_weights_ (形状为 (n_outer_bags,) 的 float 数组) – 每个袋中总权重的记录。

  • best_iteration_ (形状为 (n_stages, n_outer_bags) 的 int 数组) – 在每个阶段执行的增强迭代次数,直到早期停止或达到 max_rounds。通常,主要效应增强迭代计数在 best_iteration_[0] 中,交互增强迭代计数在 best_iteration_[1] 中。

  • intercept_ (形状为 (n_classes,)(1,) 的 float 数组) – 模型截距。二元分类形状为 (1,),多元分类形状为 (n_classes,)

  • bagged_intercept_ (形状为 (n_outer_bags, n_classes)(n_outer_bags,) 的 float 数组) – 模型 bagged 截距。二元分类形状为 (n_outer_bags,),多元分类形状为 (n_outer_bags, n_classes)

copy()#

创建 EBM 的深拷贝。

返回:

新的拷贝。

decision_function(X, init_score=None)#

在调用链接函数之前预测模型得分。

参数:
  • X – 样本的 NumPy 数组。

  • init_score – 可选。可以是能够生成得分的模型,或每个样本的初始化得分。如果是样本得分,其长度应与 X 相同。

返回:

可加项贡献的总和。

eval_terms(X)#

项得分与调用 ebm.explain_local(x) 获得的局部解释值相同。

调用 interpret.utils.inv_link(ebm.eval_terms(X).sum(axis=1) + ebm.intercept_, ebm.link_) 等同于回归中的 ebm.predict(X) 或分类中的 ebm.predict_proba(X)

参数:

X – 样本的 NumPy 数组。

返回:

每个样本的每个项的局部解释得分。

explain_global(name=None)#

提供模型的全局解释。

参数:

name – 用户定义的解释名称。

返回:

一个解释对象,将特征-值对可视化为水平条形图。

explain_local(X, y=None, name=None, init_score=None)#

为提供的样本提供局部解释。

参数:
  • X – 用于解释的 X 的 NumPy 数组。

  • y – 用于解释的 y 的 NumPy 向量。

  • name – 用户定义的解释名称。

  • init_score – 可选。可以是能够生成得分的模型,或每个样本的初始化得分。如果是样本得分,其长度应与 X 相同。

返回:

一个解释对象,将每个样本的特征-值对可视化为水平条形图。

fit(X, y, sample_weight=None, bags=None, init_score=None)#

使用提供的样本拟合模型。

参数:
  • X – 训练样本的 NumPy 数组。

  • y – 作为训练标签的 NumPy 数组。

  • sample_weight – 可选的每个样本权重数组。应与 X 和 y 长度相同。

  • bags – 可选的袋定义。第一维长度应等于 outer_bags 数量。第二维长度应等于样本数量。内容应为 +1 表示训练,-1 表示验证,如果未包含在袋中则为 0。除 1 以外的数字表示样本在训练或验证集中包含的次数。

  • init_score – 可选。可以是能够生成得分的模型,或每个样本的初始化得分。如果是样本得分,其长度应与 X 相同。

返回:

对象本身。

monotonize(term, increasing='auto', passthrough=0.0)#

使用等渗回归调整一个项使其单调。

一个重要考虑是此函数仅调整单个项,不会修改成对项。当一个特征需要全局单调时,任何包含该特征的成对项都应从模型中排除。

参数:
  • term – 要进行单调处理的项的索引或名称

  • increasing – ‘auto’ 或 bool。‘auto’ 根据 Spearman 相关性估计决定方向。

  • passthrough – 单调化过程可能导致模型在训练集上的平均响应发生变化。如果 passthrough 设置为 0.0,则模型在训练集上的平均响应不会改变。如果 passthrough 设置为 1.0,则单调化导致的平均响应变化将完全传递给 self.intercept_。介于 0 和 1 之间的值将导致该百分比的变化被传递。

返回:

对象本身。

predict(X, init_score=None)#

对提供的样本进行预测。

参数:
  • X – 样本的 NumPy 数组。

  • init_score – 可选。可以是能够生成得分的模型,或每个样本的初始化得分。如果是样本得分,其长度应与 X 相同。

返回:

每个样本的预测类别标签。

predict_proba(X, init_score=None)#

对提供的样本进行概率估计。

参数:
  • X – 样本的 NumPy 数组。

  • init_score – 可选。可以是能够生成得分的模型,或每个样本的初始化得分。如果是样本得分,其长度应与 X 相同。

返回:

每个样本在每个类别的概率估计。

predict_with_uncertainty(X, init_score=None)#

从 bagged 基础模型获取原始得分和不确定性。通过对所有 bagged 模型的输出进行平均生成预测,并使用各袋预测的标准差估计不确定性。

参数:
  • X – 形状为 (n_samples, n_features) 的 ndarray,是要预测的输入样本。

  • init_score – 可选。可以是能够生成得分的模型,或每个样本的初始化得分。如果是样本得分,其长度应与 X 相同。

返回:

形状为 (n_samples, 2) 的 ndarray

第一列包含平均预测,第二列包含不确定性

remove_features(features)#

从已拟合的 EBM 中移除特征(及其关联组件)。

注意,这将改变 self 的以下组件的结构(即,通过移除指定的索引):histogram_edges_histogram_weights_unique_val_counts_bins_feature_names_in_feature_types_in_feature_bounds_。此外,任何使用被删除特征的项也将被删除。调用者传递给 __init__ 函数的以下属性不会被修改:feature_namesfeature_types

参数:

features – 特征名称、索引或布尔值的列表或可枚举对象,指示要移除哪些特征。

返回:

对象本身。

remove_terms(terms)#

从已拟合的 EBM 中移除项(及其关联组件)。

注意,这将改变 self 的以下组件的结构(即,通过移除指定的索引):term_features_term_names_term_scores_bagged_scores_standard_deviations_bin_weights_

参数:

terms – 项名称、索引或布尔值的列表(或其他可枚举对象)。

返回:

对象本身。

reorder_classes(classes)#

重新排序分类 EBM 中的类别位置。

参数:

classes – 新的类别顺序

返回:

对象本身。

scale(term, factor)#

按常数因子缩放个体项贡献。

例如,您可以通过将其对应的权重设置为零来抵消特定项的贡献;这将导致相关的全局解释(例如,变量重要性)也变为零。有几点值得注意:1) 此方法不影响拟合的截距,用户需要直接更改该属性(如果需要),2) 重新加权特定项贡献也会以类似方式重新加权其相关组件(例如,变量重要性得分、标准差等)。

参数:
  • term – 要缩放的项的索引或名称。

  • factor – 缩放该项的因子。

返回:

对象本身。

score(X, y, sample_weight=None)#

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

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

参数:
  • X (形状为 (n_samples, n_features) 的类数组对象) – 测试样本。

  • y (形状为 (n_samples,) (n_samples, n_outputs) 的类数组对象) – X 的真实标签。

  • sample_weight (形状为 (n_samples,) 的类数组对象, default=None) – 样本权重。

返回:

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

返回类型:

float

sweep(terms=True, bins=True, features=False)#

从已拟合的 EBM 中清除未使用的元素。

参数:
  • terms – 布尔值,指示是否应从模型中清除不影响输出的归零项。

  • bins – 布尔值,指示是否应从模型中清除不影响输出的未使用分箱级别。

  • features – 布尔值,指示是否应从模型中清除未在任何项中使用且因此不影响输出的特征。

返回:

对象本身。

term_importances(importance_type='avg_weight')#

提供项重要性。

参数:

importance_type – 请求的项重要性类型(‘avg_weight’,‘min_max’)

返回:

一个项重要性数组,每个可加项有一个重要性值

to_json(file, detail='all', indent=2)#

将模型导出到 JSON 文本文件。

参数:
  • file – 路径类对象 (str 或 os.PathLike),或实现了 .write() 方法的文件类对象。

  • detail – ‘minimal’、‘interpretable’、‘mergeable’、‘all’

  • indent – 如果 indent 是非负整数或字符串,则 JSON 数组元素和对象成员将以该缩进级别进行美观打印。缩进级别为 0、负数或 “” 将只插入换行符。None(默认值)选择最紧凑的表示形式。使用正整数 indent 将每级缩进那么多空格。如果 indent 是字符串(例如“t”),则使用该字符串缩进每个级别。

to_jsonable(detail='all')#

将模型转换为可 JSON 化表示。

参数:

detail – ‘minimal’、‘interpretable’、‘mergeable’、‘all’

返回:

可 JSON 化对象