可解释的提升回归器#

链接到算法描述:EBM

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

class interpret.glassbox.ExplainableBoostingRegressor(feature_names=None, feature_types=None, max_bins=1024, max_interaction_bins=64, interactions=0.9, exclude=None, validation_size=0.15, outer_bags=16, inner_bags=0, learning_rate=0.04, greedy_ratio=10.0, cyclic_progress=False, smoothing_rounds=500, interaction_smoothing_rounds=100, max_rounds=25000, early_stopping_rounds=100, early_stopping_tolerance=1e-05, min_samples_leaf=4, min_hessian=0.0, 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='rmse', n_jobs=- 1, random_state=42)#

一个可解释的提升回归器。

Parameters:
  • feature_names (list of str, default=None) – 特征名称列表。

  • feature_types (list of FeatureType, default=None) –

    特征类型的列表。FeatureType 可以是:

    • ’auto’: 自动检测

    • ’quantile’: 具有等密度区间的连续特征

    • ’rounded_quantile’: 具有分位数区间的连续特征,但切割值尽可能四舍五入

    • ’uniform’: 具有等宽区间的连续特征

    • ’winsorized’: 具有等宽区间的连续特征,但最左和最右的切割值由分位数选择

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

    • [List of float]: 具有指定切割值的连续特征。例如:[5.5, 8.75]

    • [List of str]: 有序分类特征,其中顺序有意义。例如:[“低”, “中”, “高”]

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

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

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

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

    模型中要包含的交互项。选项有:

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

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

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

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

  • validation_size (int or float, default=0.15) –

    验证集大小。用于在提升过程中进行早期停止,并且需要创建外部包。

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

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

    • 0: 关闭早期停止。外部包没有效用。误差界限将被消除

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

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

  • learning_rate (float, default=0.04) – 用于提升的学习率。

  • greedy_ratio (float, default=10.0) – 贪婪提升步骤相对于循环提升步骤的比例。 值为0时禁用贪婪提升,实际上将其关闭。

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

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

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

  • 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 表示为提前停止指标的百分比。负值表示在停止之前应过度拟合各个模型。 EBMs 是模型的袋装集合。将 early_stopping_tolerance 设置为零(甚至为负),允许学习稍微过度拟合每个单独的模型,这可以提高整个集合的准确性。 过度拟合每个单独的模型会减少每个模型的偏差,但会增加各个模型的方差(由于过度拟合)。但是,在集合中平均模型可以减少方差,而偏差变化不大。由于目标是找到模型集合的最佳偏差-方差权衡——而不是单个模型——稍微过度拟合各个模型可以提高整个集合的准确性。

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

  • min_hessian (float, default=0.0) – 考虑一个潜在分割有效所需的最小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 (list of int, default=None) –

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

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

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

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

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

  • 目标 (str, default="rmse") – 要优化的目标。选项包括:“rmse”,“poisson_deviance”,“tweedie_deviance:variance_power=1.5”,“gamma_deviance”,“pseudo_huber:delta=1.0”,“rmse_log”(使用对数链接函数的rmse)

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

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

Variables:
  • n_features_in_ (int) – 特征数量。

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

  • feature_types_in_ (List of str) – 解析后的特征类型。可以是:'continuous'(连续型)、'nominal'(名义型)或'ordinal'(有序型)。

  • bins_ (List[Union[List[Dict[str, int]], List[array of float with shape (n_cuts,)]]]) – 每个特征的列表,定义了如何对每个特征进行分箱。列表中的每个特征包含一个分箱分辨率列表。分箱分辨率列表中的第一项用于分箱主效应特征。如果分箱分辨率列表中有更多项,它们定义了连续分辨率级别的分箱。索引1处的项(如果存在)定义了对的分箱。最后一个分箱分辨率定义了所有连续交互级别的分箱。如果分箱分辨率列表包含字典,则该特征是“名义”或“有序”分类。如果分箱分辨率列表包含数组,则该特征是“连续”的,数组将包含将连续值分隔为箱的浮点切割点。

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

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

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

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

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

  • term_names_ (List of str) – 术语名称列表。

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

  • bagged_scores_ (形状为 (n_outer_bags, n_feature0_bins, ..., n_featureN_bins) 的浮点数数组列表) – 每个项的袋装模型分数列表。

  • term_scores_ (形状为 (n_feature0_bins, ..., n_featureN_bins) 的浮点数数组列表) – 模型得分的每项列表。

  • standard_deviations_ (形状为 (n_feature0_bins, ..., n_featureN_bins) 的浮点数数组列表) – 每个项的袋装模型得分的标准差列表。

  • link_ (str) – 用于将预测或目标转换为线性空间加性分数的链接函数,反之亦然通过逆链接。可能的取值包括: “custom_regression”, “power”, “identity”, “log”, “inverse”, “inverse_square”, “sqrt”

  • link_param_ (float) – 浮点值,可以被链接函数使用。主要用途是用于幂链接。

  • bag_weights_ (形状为 (n_outer_bags,) 的浮点数数组) – 每个袋子中总重量的记录。

  • best_iteration_ (形状为 (n_stages, n_outer_bags) 的整数数组) – 在每个阶段内执行的提升迭代次数,直到达到早停或 max_rounds。 通常,主效应提升迭代的次数将在 best_iteration_[0] 中, 而交互提升迭代的次数将在 best_iteration_[1] 中。

  • intercept_ (float) – 模型的截距。

  • bagged_intercept_ (形状为 (n_outer_bags,) 的浮点数数组) – 模型的袋装截距。

  • min_target_ (float) – 在‘y’中找到的最小值。

  • max_target_ (float) – 在‘y’中找到的最大值。

copy()#

对EBM进行深度复制。

Returns:

新的副本。

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) 进行分类。

Parameters:

X – 样本的NumPy数组。

Returns:

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

explain_global(name=None)#

为模型提供全局解释。

Parameters:

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

Returns:

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

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

为提供的样本提供本地解释。

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

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

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

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

Returns:

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

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

将模型拟合到提供的样本。

Parameters:
  • X – 用于训练样本的NumPy数组。

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

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

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

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

Returns:

它本身。

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

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

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

Parameters:
  • term – 要单调化的项的索引或名称

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

  • passthrough – 单调化过程可能会导致模型平均响应的变化。如果 passthrough 设置为 0.0,则模型对训练集的平均响应将不会改变。如果 passthrough 设置为 1.0,则单调化对平均响应的任何变化都将传递到 self.intercept_。0 到 1 之间的值将导致该百分比被传递。

Returns:

它本身。

predict(X, init_score=None)#

对提供的样本进行预测。

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

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

Returns:

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

predict_with_uncertainty(X, init_score=None)#

从袋装基础模型中获取原始分数和不确定性。 通过平均所有袋装模型的输出来生成预测,并使用袋间预测的标准差来估计不确定性。

Parameters:
  • X – 形状为 (n_samples, n_features) 的 ndarray 用于预测的输入样本。

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

Returns:

形状为 (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

Parameters:

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

Returns:

它本身。

remove_terms(terms)#

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

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

Parameters:

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

Returns:

它本身。

scale(term, factor)#

将单个项的贡献按一个常数因子进行缩放。

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

Parameters:
  • term – 要缩放的术语索引或术语名称。

  • factor – 缩放项的比例。

Returns:

它本身。

score(X, y, sample_weight=None)#

返回预测的确定系数。

决定系数 \(R^2\) 定义为 \((1 - \frac{u}{v})\),其中 \(u\) 是残差 平方和 ((y_true - y_pred)** 2).sum(),而 \(v\) 是总平方和 ((y_true - y_true.mean()) ** 2).sum()。 最佳可能得分为1.0,且可能为负(因为 模型可能任意更差)。一个总是预测 y 的期望值而不考虑输入特征的常数模型,将获得 \(R^2\) 得分为0.0。

Parameters:
  • X (形状为 (n_samples, n_features) 的数组类) – 测试样本。对于某些估计器,这可能是预计算的内核矩阵或形状为 (n_samples, n_samples_fitted) 的通用对象列表,其中 n_samples_fitted 是用于估计器拟合的样本数量。

  • y (形状为 (n_samples,) 或 (n_samples, n_outputs) 的数组类) – X 的真实值。

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

Returns:

score\(R^2\)self.predict(X) 相对于 y

Return type:

浮点数

注释

在回归器上调用score时使用的\(R^2\)分数从0.23版本开始使用multioutput='uniform_average',以保持与r2_score()的默认值一致。这影响了所有多输出回归器的score方法(除了MultiOutputRegressor)。

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

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

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

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

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

Returns:

它本身。

term_importances(importance_type='avg_weight')#

提供术语的重要性。

Parameters:

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

Returns:

一个数组,包含每个加性项的重要性

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

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

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

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

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

to_jsonable(detail='all')#

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

Parameters:

详情 – ‘minimal’, ‘interpretable’, ‘mergeable’, ‘all’

Returns:

可JSON化的对象