APP下载

深入研究Catboost用于模型解释的功能

消息来源:baojiabao.com 作者: 发布时间:2024-05-16

报价宝综合消息深入研究Catboost用于模型解释的功能

点选上方关注,All in AI中国

我们真的了解在我们构建的ML模型中发生了什么吗?让我们来探索吧。

在我之前的部落格中,我们看到了对XGBoost、LightGBM和Catboost的比较研究。通过这种分析,我们得出结论,catboost在速度和准确性方面都优于其他两个。在这一部分中,我们将深入探讨catboost,探索catboost为高效建模和理解超引数提供的新功能。

对于新读者来说,catboost是由Yandex团队在2017年开发的一种开源梯度增强算法。它是一种机器学习算法,允许使用者快速处理大型资料集的分类特征,这与XGBoost和LightGBM不同。 Catboost可用于解决回归、分类和排序问题。

作为资料科学家,我们可以轻松地训练模型并进行预测,但是,我们经常无法理解这些奇特算法中发生的事情。这是我们看到离线评估和最终生产之间模型效能差异巨大的原因之一。现在是我们不再将ML视为“黑匣子”并且在提高模型准确性的同时重视模型解释的时候了。这也有助于我们识别资料偏差。在这一部分中,我们将看到catboost如何通过以下功能帮助我们分析模型并提高可视性:

特征重要性

你为什么要知道它?

删除不必要的特征以简化模型并缩短训练/预测时间为您的目标价值获取最具影响力的功能并操纵它们以获得业务收益(例如:医疗保健提供商希望确定哪些因素会导致每位患者患某种疾病的风险,以便他们可以直接通过针对性药物解决这些风险因素)除了选择特征重要性的型别之外,我们还应该知道我们想要使用哪些资料来查询特征重要性 - 训练、测试或完成资料集。选择一个在另一个上有利有弊,但最后,您需要决定是否要知道模型依赖于每个特征进行预测的多少(使用训练资料)或该特征对效能的贡献程度模型对未见资料的影响(使用测试资料)。我们稍后将看到,只有一些方法可用于查询未用于训练模型的资料的特征重要性。

如果您关心第二个并假设您拥有所有时间和资源,那么找到特征重要性的最原始且最可靠的方法是训练多个模型,一次留下一个特征并比较测试集上的效能。如果效能相对于基线(当我们使用所有功能时的效能)发生很大变化,则意味着该特征非常重要。但是,由于我们生活在一个需要优化精度和计算时间的实际环境中,这种方法是不必要的。以下是一些智慧方法,其中catboost可让您找到适合您模型的最佳功能:

cb.get_feature_importance(type= "___")

"type" possible values:

- PredictionValuesChange

- LossFunctionChange

- FeatureImportance

PredictionValuesChange for non-ranking metrics and LossFunctionChange for ranking metrics

- ShapValues

Calculate SHAP Values for every object

- Interaction

Calculate pairwise score between every feature

PredictionValuesChange

对于每个要素,PredictionValuesChange显示预测在特征值更改时平均变化的程度。重要性值越大,平均值越大,如果此特征发生变化,则预测值会发生变化。

优点:计算成本低廉,因为您无需进行多次训练或测试,也不会储存任何额外资讯。您将获得标准化值作为输出(所有重要性加起来将为100)。

缺点:它可能会给排名目标带来误导性结果,它可能会将groupwise特性置于顶部,即使它们对最终的损失值有一点影响。

LossFunctionChange损失函式变化

为了获得这个特征的重要性,catboost简单地采用了在正常情况下(当我们包括特征时)使用模型获得的度量(Loss函式)与没有此特征的模型之间的差异。差异越大,特征越重要。在catboost文件中没有明确提到我们如何在没有特征的情况下找到模型。

优点和缺点:这对于大多数型别的问题都很有效,这与预测值变化不同,在这种情况下,您可以获得排名问题的误导性结果,同时,它的计算量很大。

Shap Values

https://github.com/slundberg/shap

SHAP值将预测值分解为每个要素的贡献。它测量特征对单个预测值的影响并比较基线预测(训练资料集的目标值的平均值)进行比较。

shap值的两个主要用例:

1.特征的物件级贡献

shap_values = model.get_feature_importance(Pool(X_test, label=y_test,cat_features=categorical_features_indices),

type="ShapValues")

expected_value = shap_values[0,-1]

shap_values = shap_values[:,:-1]

shap.initjs()

shap.force_plot(expected_value, shap_values[3,:], X_test.iloc[3,:])

https://github.com/slundberg/shap

2.整个资料集的摘要(整体特征重要性)

shap.summary_plot(shap_values,X_test)

虽然我们可以通过shap获得准确的特征重要性,但它们在计算上比catboost内建特征重要性更昂贵。

奖金

基于相同概念但不同实现的另一个特征重要性是基于排列的特征重要性。catboost没有使用它,这纯粹是与模型无关并且易于计算。

我们如何选择?

虽然BothPredictionValuesChange和LossFunctionChange可用于所有型别的指标,但建议使用LossFunctionChange对度量进行排序。除了PredictionValuesChange之外,所有其他方法都可以使用测试资料,使用在训练资料上训练的模型来查询特征重要性。

为了更好地理解这些差异,以下是我们讨论的所有方法的结果:

catboost特征的结果。预测人们是否会从经典的“成人”人口普查资料集中报告超过5万美元的收入(使用对数损失)

从上面的图中,我们可以看到大多数方法都同意顶级特征。它看起来像LossFunctionChange最接近shap(更可靠)。但是,直接比较这些方法是不公平的,因为预测值的变化是基于训练资料,而所有其他方法都是基于测试资料。

我们还应该看到执行所有这些所需的时间:

互动

使用此引数,您可以找到一对要素的强度(两个要素的重要性)。

在输出中,您将获得每对特性的列表。该列表将具有3个值,第一个值是该对中第一个要素的索引,第二个值是该对中第二个要素的索引,第三个值是该对的特征重要性得分。有关实施细节,请检视嵌入式笔记本。

值得注意的是,单个特征重要性中的前两个特征不一定是最强的一对。

笔记本

在笔记本中使用的资料集

物件重要性

你为什么要知道它?

从训练资料中删除最无用的训练物件根据哪些新物件预期最“有用”,优先考虑一批新物件进行标记,这类似于主动学习使用此功能,您可以计算每个物件对测试资料的优化指标的影响。正值反映优化度量增加,负值反映优化度量减少。此方法是本文中描述的方法的一种实现。这些算法的详细资讯超出了本文的讨论范围。

物件重要性的Catboost教程

cb.get_object_importance中有三种类型的update_method:

SinglePoint:最快、最不准确的方法TopKLeaves:指定叶数。值越高、计算越准确、越慢AllPoints:最慢、最准确的方法例如,以下值将方法设定为TopKLeaves,并将叶数限制为3:

TopKLeaves:top= 3

模型分析图

Catboost最近在其最新更新中推出了此功能。通过此功能,我们将能够视觉化算法如何分割每个要素的资料,并检视特定于要素的统计资讯。更具体地说,我们将能够看到:

每个bin的平均目标值(bin用于连续功能)或类别(目前仅支援OHE功能)每个箱/类别的平均预测值每个bin中的物件数不同特征值的预测:对于每个物件,特征值都是变化的,因此它会落入某个区域。然后,模型根据该特征的新值预测目标,并获取区域中预测的平均值(由红点给出)。这个图将为我们提供资讯,例如我们的分裂是多么均匀(我们不希望所有物件都进入一个区域),我们的预测是否接近目标(蓝色和橙色线),红线将告诉我们,我们的预测多敏感。

数值特征分析

单热编码特征分析

2019-09-04 09:54:00

相关文章