赞
踩
https://www.toutiao.com/a6706346424298127876/
我们真的了解在我们构建的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:
例如,以下值将方法设置为TopKLeaves,并将叶数限制为3:
TopKLeaves:top= 3
模型分析图
Catboost最近在其最新更新中推出了此功能。通过此功能,我们将能够可视化算法如何分割每个要素的数据,并查看特定于要素的统计信息。更具体地说,我们将能够看到:
这个图将为我们提供信息,例如我们的分裂是多么均匀(我们不希望所有对象都进入一个区域),我们的预测是否接近目标(蓝色和橙色线),红线将告诉我们,我们的预测多敏感。
数值特征分析
单热编码特征分析
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。