相比于XGBoost和LightGBM,在速度和准确性方面,Catboost优于其他两个。在这一部分中,我们将进一步研究Catboost,探索Catboost为有效建模和理解超参数提供的新功能。

对于新读者而言,Catboost是Yandex团队于2017年开发的一种开源梯度提升算法。它是一种机器学习算法,可让用户快速处理大型数据集的分类特征,这与XGBoost和LightGBM有所不同。Catboost可用于解决回归,分类和排名问题。

作为数据科学家,我们可以轻松地训练模型并做出预测,但是,我们常常无法理解这些奇特算法内部发生的事情。这就是为什么我们看到离线评估和最终生产之间的模型性能存在巨大差异的原因之一。现在是时候停止将ML视为“黑匣子”了,在提高模型准确性的同时,重视模型解释。这也将帮助我们识别数据偏差。在这一部分中,我们将看到Catboost如何通过以下功能帮助我们分析模型并提高可见性:
image.png

特征重要性 Future Importance

它有什么用?

  • 删除不必要的特征以简化模型并减少训练/预测时间
  • 为你的目标值获取最有影响力的特征,并操纵它们以获得业务收益(例如:医疗保健提供者想要确定是什么因素导致每个病人患某些疾病的风险,这样他们就可以用靶向药物直接解决这些风险因素)

除了选择特征重要性的类型,我们还应该知道我们想要使用哪些数据来寻找特征重要性——训练、测试或完整的数据集。选择哪一种都有其优点和缺点,这最终取决于您想知道在模型预测性能上不同特征的重要性(使用训练数据),还是在看不见的数据上影响模型表现的不同特征的重要性(使用测试数据)。我们将在这个博客的后面会提到一些方法,可以用来发现没有用于训练模型的数据的特征重要性。

如果您关心后者,并且假设您拥有充足的时间和资源,那么找到功能重要性的最粗略和最可靠的方法就是训练多个模型,一次只保留一个特征,然后在测试集中比较性能。如果性能相对于基准线发生了很大变化(使用所有特征时的性能),则表示该特征很重要。但是,由于我们生活在现实世界中,我们需要同时优化准确性和计算时间,因此这种方法是不必要的。以下是Catboost可以帮助您为模型找到最佳功能的一些聪明方法:

  1. cb = CatBoostRegressor()
  2. cb.get_feature_importance(type= "___")
  3. "type" 的可能值:
  4. - PredictionValuesChange
  5. - LossFunctionChange
  6. - FeatureImportance
  7. PredictionValuesChange用于非排名指标,而LossFunctionChange用于排名指标
  8. - ShapValues
  9. 计算每个对象(object)的SHAP
  10. - Interaction
  11. 计算每个特征之间的成对得分

PredictionValuesChange

对于每个特征,PredictionValuesChange显示如果特征值更改,则预测平均会更改多少。如果更改此特征,重要性的值越大,则预测值的平均变化就越大。

优点:计算成本低廉,因为您无需进行多次训练或测试,并且不会存储任何其他信息。您将获得标准化的值作为输出(所有重要性总计为100)。 缺点:即使对最终的损失值影响很小,它也可能给对象(objectives)排名带来误导的结果,也可能使成组的特征排在首位。

LossFunctionChange

要获得此特征的重要性,Catboost会简单地考虑在正常情况下(当包含此特征时)使用该模型获得的指标(损失函数)和不具有该特征的模型(模型是使用原始模型大致构建的,该特征已从集合中的所有树中删除)。差异越大,此特征越重要。Catboost文档中没有明确提到我们如何找到没有特征的模型。

优点****缺点:这对于大多数类型的问题都有效,这与predictionvalueschange不同,在predictionvalueschange中,您可能会获得对问题排名的误导性结果,但同时,LossFunctionChange计算量会很大。

ShapValues

image.png
SHAP值将预测值分解为每个要素的贡献。与基线预测(训练数据集的目标值的平均值)相比,它测量特征对单个预测值的影响。
shap值的两个主要用例:

  1. 特征的对象级(object-level)贡献 ```python shap_values = model.get_feature_importance(Pool(X_test, label=y_test,cat_features=categorical_features_indices),
    1. 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,:])

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/693043/1606393988648-9ec2f5f9-178e-4967-9f76-613530d8370f.png#align=left&display=inline&height=129&margin=%5Bobject%20Object%5D&name=image.png&originHeight=257&originWidth=1400&size=105176&status=done&style=none&width=700)
  2. 2. 整个数据集的总结(总体功能重要性)
  3. ```python
  4. shap.summary_plot(shap_values, X_test)

image.png
尽管我们可以通过shap获得准确的特征重要性,但它们在计算上比Catboost内置特征重要性要成本高。有关SHAP值的更多详细信息,请阅读此文章

Bonus

基于相同概念但实现方式不同的另一个特征重要性是:基于置换的功能重要性。尽管Catboost不使用此功能,但这完全是模型不可知的,并且易于计算。

如何选择

尽管PredictionValuesChange和LossFunctionChange都可以用于所有类型的指标,但建议将LossFunctionChange用于排名指标。除了PredictionValuesChange之外,所有其他方法都可以使用测试数据,通过在训练数据上训练的模型来得出特征重要性。

为了更好地理解他们的差异,以下是我们讨论的所有方法的结果:
image.png
image.png
Catboost结果的特征重要性。预测人们是否将从传统的“成人”普查数据集中报告超过5万美元的收入(使用对数损失)
image.png
image.png
从上面的图中可以看出,大多数方法在主要特征上都一致。看起来LossFunctionChange最接近shap(更可靠)。但是,直接比较这些方法是不公平的,因为PredictionValuesChange基于训练数据,而所有其他值都基于测试数据。

我们还应该看到运行所有这些所花费的时间:
image.png

相互作用 Interaction

使用此参数,您可以找到一对特征的强度(两个特征的重要性在一起)。
image.png
在输出中,您将获得每对特征的列表。该列表将具有3个值,第一个值是该对中第一个特征的索引,第二个值是该对中第二个特征的索引,第三个值是该对的特征重要性得分。有关实现的详细信息,请访问笔记本
image.png
有趣的是,单个功能重要性中的前两个功能并不一定构成最强的一对。

对象重要性 Object Importance

它有什么用?

  • 从训练数据中删除最无用的训练对象
  • 优先考虑一批新对象以进行标记,基于哪些对象最有帮助,类似于主动学习

使用此功能,您可以计算每个对象对测试数据优化指标的影响。正值反映出优化指标增加,而负值反映出优化指标减少。用于对象重要性的Catboost教程,请访问这个网站
cb.get_object_importance中提供了三种类型的update_method:

  • SinglePoint:最快,最不准确的方法
  • TopKLeaves:指定叶子数。值越高,计算越准确,计算速度越慢
  • AllPoints:最慢最准确的方法

例如,以下值将方法设置为TopKLeaves,并将叶子数限制为3:

  1. TopKLeaves:top=3

模型分析图

Catboost最近在其最新更新中启动了此功能。使用此功能,我们将能够直观地看到算法如何为每个特征拆分数据,并查看特定特征的统计信息。更具体地说,我们将能够看到:

  • 每个分类箱(bin)的平均目标值(分类箱用于连续特征)或类别(当前仅支持OHE特征)
  • 每个分类箱(bin)/类别的平均预测值
  • 每个分类箱(bin)中的对象数
  • 不同特征值的预测值:对于每个对象,特征值都会发生变化,以使其落入某个分类箱(bin)中。然后,该模型根据该特征的新值预测目标,并采用分类箱中预测的平均值(由红点表示)。

该图将为我们提供信息,例如,分裂的一致程度(我们不希望所有对象进入一个容器中),我们的预测是否接近目标(蓝色和橙色线),红色线将告诉我们,我们的预测值关于某项特征的敏感度如何。

数值特征分析

image.png

一键编码(one-hot encoded)特征分析

image.png

References

原文链接:https://towardsdatascience.com/deep-dive-into-catboost-functionalities-for-model-interpretation-7cdef669aeed