ExplainableBoostingRegressor#
算法描述链接:EBM
在 2024 年 2 月 8 日发布的 v0.5.1 版本中,EBM 训练算法中的贪婪和平滑特性默认启用。贪婪和平滑可以提高准确性,但与早期未使用平滑的纯循环增强 (cyclic boosting) 算法学习到的特征函数图相比,可能会改变学习到的特征函数图。要训练与 v0.5.0 及更早版本中默认设置相似的 EBMs,请将 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=14, 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=- 2, random_state=42)#
一个可解释的增强回归器。
- 参数:
feature_names (str 列表, 默认为 None) – 特征名称列表。
feature_types (FeatureType 列表, 默认为 None) –
特征类型列表。FeatureType 可以是
’auto’: 自动检测
’quantile’: 连续特征,使用等密度分箱
’rounded_quantile’: 连续特征,使用分位数分箱,但分位点值在可能时进行四舍五入
’uniform’: 连续特征,使用等宽分箱
’winsorized’: 连续特征,使用等宽分箱,但最左和最右分位点由分位数确定
’continuous’: 对连续特征使用默认分箱,当前为 ‘quantile’
[浮点数列表]: 连续特征,使用指定的分割点值。例如: [5.5, 8.75]
[字符串列表]: 有序类别特征,顺序有意义。例如: [“low”, “medium”, “high”]
’nominal’: 类别特征,顺序无意义。例如: 国家名称
max_bins (int, 默认为 1024) – 主效应阶段每个特征的最大分箱数。
max_interaction_bins (int, 默认为 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 或 float, 默认为 0.15) –
验证集大小。用于增强过程中的早停,并且需要创建外部袋 (outer bags)。
整数 (1 <= validation_size): 放入验证集的样本数量
百分比 (validation_size < 1.0): 放入验证集的数据百分比
0: 关闭早停。外部袋没有用处。误差界限将被移除
outer_bags (int, 默认为 14) – 外部袋的数量。外部袋用于生成误差界限并帮助平滑图。
inner_bags (int, 默认为 0) – 内部袋的数量。0 关闭内部装袋。
learning_rate (float, 默认为 0.04) – 增强的学习率。
greedy_ratio (float, 默认为 10.0) – 贪婪增强步骤相对于循环增强步骤的比例。值为 0 将禁用贪婪增强,从而有效地关闭它。
cyclic_progress (bool 或 float, 默认为 False) – 此参数指定将积极贡献于改进模型性能的增强周期的比例。它表示为一个布尔值或介于 0 和 1 之间的浮点数,默认设置为 True(1.0),意味着 100% 的周期预计会取得进展。如果在某个周期内未能取得进展,该周期不会浪费;相反,它将用于更新与每个特征预测目标变量的有效性相关的内部增益计算。将此参数设置为小于 1.0 的值有助于防止过拟合。
smoothing_rounds (int, 默认为 500) – 用于设置主效应特征图基本形状的初始高度正则化轮数。
interaction_smoothing_rounds (int, 默认为 100) – 在拟合过程中用于设置交互效应特征图基本形状的初始高度正则化轮数。
max_rounds (int, 默认为 25000) – 总的增强轮数,每轮有 n_terms 增强步骤。
early_stopping_rounds (int, 默认为 100) – 没有改进时触发早停的轮数。0 关闭早停,增强将精确执行 max_rounds 指定的轮数。
early_stopping_tolerance (float, 默认为 1e-5) – 决定被认为是改进所需的最小 delta 的容差,这可以防止算法过早停止。early_stopping_tolerance 以早停指标的百分比表示。负值表示在停止之前应使各个模型过拟合。EBMs 是模型的袋装集成。将 early_stopping_tolerance 设置为零(甚至负值),可以允许学习使每个模型略微过拟合,这可以提高整个集成的准确性。过拟合每个模型会降低每个模型的偏差,但会增加(由于过拟合)单个模型的方差。但对集成中的模型进行平均可以降低方差,而偏差变化不大。由于目标是找到模型集成的最佳偏差-方差权衡点——而不是单个模型——因此对单个模型进行少量过拟合可以提高整个集成的准确性。
min_samples_leaf (int, 默认为 4) – 叶节点中允许的最小样本数。
min_hessian (float, 默认为 0.0) – 考虑潜在分割有效所需的最小 Hessian。
reg_alpha (float, 默认为 0.0) – L1 正则化。
reg_lambda (float, 默认为 0.0) – L2 正则化。
max_delta_step (float, 默认为 0.0) – 用于限制树叶的最大输出。<=0.0 表示没有约束。
gain_scale (float, 默认为 5.0) – 应用于标称类别特征的缩放因子。大于 1.0 的缩放因子将使算法更关注标称类别特征。
min_cat_samples (int, 默认为 10) – 为了单独处理一个类别所需的最小样本数。如果低于此阈值,该类别将与样本数量较少的其他类别合并。
cat_smooth (float, 默认为 10.0) – 用于类别特征。这可以减少类别特征中噪声的影响,特别是对于数据有限的类别。
missing (str, 默认为 "separate") –
增强过程中处理缺失值的方法。缺失值箱的位置会影响生成的模型图。例如,将箱放在“低”侧可能会导致缺失值影响较低的箱,反之亦然。此参数不影响模型中缺失值箱的最终位置(缺失值箱在 term_scores_ 属性中将保持在索引 0)。missing 的可能值包括
’low’: 将缺失值箱放在图的左侧。
’high’: 将缺失值箱放在图的右侧。
’separate’: 在每个增强步骤中将缺失值箱放在其自身的叶节点中,使其位置无关。这可能导致过拟合,尤其当缺失值比例较小时。
’gain’: 在每个增强步骤中,根据增益选择缺失值贡献的最佳叶节点。
max_leaves (int, 默认为 2) – 每棵树中允许的最大叶节点数。
monotone_constraints (int 列表, 默认为 None) –
此参数允许您在模型拟合过程中指定每个特征与目标变量关系的单调约束。但是,通常建议在拟合后使用 monotonize 函数应用单调约束,而不是在拟合过程中设置。此建议基于以下观察:在拟合过程中,增强算法可能会通过利用另一个相关的特征来补偿一个特征上的单调约束,从而可能掩盖任何单调违规。
如果您选择定义单调约束,monotone_constraints 应该是一个列表,其长度等于特征数量。列表中的每个元素对应一个特征,并且应取以下值之一
0: 对相应特征的偏响应不施加单调约束。
+1: 相应特征的偏响应应相对于目标单调递增。
-1: 相应特征的偏响应应相对于目标单调递减。
objective (str, 默认为 "rmse") – 要优化的目标函数。选项包括:“rmse”、“poisson_deviance”、“tweedie_deviance:variance_power=1.5”、“gamma_deviance”、“pseudo_huber:delta=1.0”、“rmse_log”(使用对数链接函数的 rmse)
n_jobs (int, 默认为 -2) – 并行运行的作业数。负整数按照 joblib 的公式(n_cpus + 1 + n_jobs)解释,就像 scikit-learn 一样。例如:-2 表示使用除 1 之外的所有线程。
random_state (int 或 None, 默认为 42) – 随机状态。None 使用 device_random 并生成不可重复的序列。
- 变量:
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[array of float with shape
(n_cuts,)
]]]) – 定义如何对每个特征进行分箱的每个特征列表。列表中的每个特征包含一系列分箱分辨率。分箱分辨率列表中的第一个项用于主效应特征的分箱。如果分箱分辨率列表中有更多项,它们定义了 successive levels of resolutions 的分箱。如果存在,索引 1 处的项定义了成对项的分箱。最后的分箱分辨率定义了所有 successive interaction levels 的分箱。如果分箱分辨率列表包含字典,则该特征是“nominal”或“ordinal”类别特征。如果分箱分辨率列表包含数组,则该特征是“continuous”连续特征,并且数组将包含将连续值分隔到箱中的浮点分割点。feature_bounds_ (array of float with shape
(n_features, 2)
) – 每个特征的最小/最大边界。feature_bounds_[feature_index, 0] 是特征的最小值,feature_bounds_[feature_index, 1] 是特征的最大值。类别特征的最小/最大值为 NaN。histogram_edges_ (List of None or array of float with shape
(n_hist_edges,)
) – 每个特征的直方图边缘列表。类别特征在其特征索引处包含 None。histogram_weights_ (List of array of float with shape
(n_hist_bins,)
) – 每个特征直方图箱中总样本权重的每个特征列表。unique_val_counts_ (array of int with shape
(n_features,)
) – 每个特征唯一特征值的计数。term_features_ (特征索引元组列表) – 模型中使用的加性项及其组成特征索引。
term_names_ (str 列表) – 项名称列表。
bin_weights_ (List of array of float with shape
(n_feature0_bins, ..., n_featureN_bins)
) – 每个项张量箱中总样本权重的每个项列表。bagged_scores_ (List of array of float with shape
(n_outer_bags, n_feature0_bins, ..., n_featureN_bins)
) – 袋装模型分数的每个项列表。term_scores_ (List of array of float with shape
(n_feature0_bins, ..., n_featureN_bins)
) – 模型分数的每个项列表。standard_deviations_ (List of array of float with shape
(n_feature0_bins, ..., n_featureN_bins)
) – 袋装模型分数的标准差的每个项列表。link_ (str) – 用于将预测或目标转换到线性空间加性分数以及通过反向链接进行反向转换的链接函数。可能的值包括:“custom_regression”、“power”、“identity”、“log”、“inverse”、“inverse_square”、“sqrt”
link_param_ (float) – 可供链接函数使用的浮点值。主要用于 power 链接。
bag_weights_ (array of float with shape
(n_outer_bags,)
) – 每个袋内总权重的每个袋记录。best_iteration_ (array of int with shape
(n_stages, n_outer_bags)
) – 在每个阶段执行的增强迭代次数,直到早停或达到 max_rounds。通常,主效应增强迭代次数将位于 best_iteration_[0] 中,而交互增强迭代次数将位于 best_iteration_[1] 中。intercept_ (float) – 模型的截距。
bagged_intercept_ (array of float with shape
(n_outer_bags,)
) – 模型的袋装截距。min_target_ (float) – 在 'y' 中找到的最小值。
max_target_ (float) – 在 'y' 中找到的最大值。
- copy()#
对 EBM 进行深层复制。
- 返回:
新的副本。
- 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_with_uncertainty(X, init_score=None)#
从袋装基础模型获取原始分数和不确定性。通过对所有袋装模型的输出取平均生成预测,并使用袋间预测的标准差估计不确定性。
- 参数:
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_names
和feature_types
。- 参数:
features – 要移除的特征名称、索引或布尔值列表或可枚举对象。
- 返回:
模型自身。
- remove_terms(terms)#
从已拟合的 EBM 中移除项(及其相关的组件)。
请注意,这将改变
self
的以下组件的结构(即通过移除指定的索引):term_features_
、term_names_
、term_scores_
、bagged_scores_
、standard_deviations_
和bin_weights_
。- 参数:
terms – 要移除的项名称、索引或布尔值列表(或其他可枚举对象)。
- 返回:
模型自身。
- scale(term, factor)#
按常数因子缩放单个项的贡献。
例如,可以通过将特定项的相应权重设置为零来抵消其贡献;这将导致相关的全局解释(例如,变量重要性)也为零。有几点值得注意:1)此方法对已拟合的截距没有影响,用户必须直接更改该属性(如果需要),以及 2)重新加权特定项贡献将以类似方式重新加权其相关组件(例如,变量重要性得分、标准差等)。
- 参数:
term – 要缩放的项的索引或名称。
factor – 缩放项的因子。
- 返回:
模型自身。
- 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。- 参数:
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) – 样本权重。
- 返回:
score –
self.predict(X)
相对于 y 的 \(R^2\)。- 返回类型:
float
注意
在回归器上调用
score
时使用的 \(R^2\) 得分从 0.23 版本开始使用multioutput='uniform_average'
,以与r2_score()
的默认值保持一致。这影响了所有多输出回归器(MultiOutputRegressor
除外)的score
方法。
- 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 可表示对象