你真的对你构建的ML模型足够了解么?!
发布日期:2022-03-11 作者:WLT 点击:
点击以上,尽在AI中国
我们真的知道我们建立的ML模型中发生了什么吗?我们来探索一下。
在我之前的博客中,我们看到了对XGBoost、LightGBM和Catboost的对比研究。通过这种分析,我们得出结论,catboost在速度和准确性上优于其他两种。在这一部分中,我们将深入讨论catboost,并探索catboost为高效建模和理解超参数提供的新功能。
对于新读者,catboost是Yandex团队在2017年开发的开源梯度增强算法。它是一种机器学习算法,允许用户快速处理大数据集的分类特征,不同于XGBoost和LightGBM。Catboost可用于解决回归、分类和排序问题。
作为数据科学家,我们可以很容易地训练模型并做出预测,但我们往往无法理解这些奇怪的算法中发生了什么。这也是为什么我们看到离线评测和最终生产的模型性能存在巨大差异的原因之一。现在我们应该停止将ML视为“黑箱”,在提高模型准确性的同时,关注模型解释。这也有助于我们识别数据偏差。在本节中,我们将了解catboost如何通过以下函数帮助我们分析模型并提高可见性:
特征重要性
你为什么想知道它?删除不必要的特征以简化模型和缩短训练/预测时间,获得对您的目标值最有影响的函数并操纵它们以获得商业利益(例如,医疗医疗保健提供商希望确定哪些因素会导致每个患者患某些疾病的风险,以便他们可以通过靶向药物直接解决这些风险因素)。
除了选择特征重要性的类型,我们还应该知道我们想要使用哪些数据来发现特征重要性——训练、测试或完成数据集。选择一个对另一个有利有弊,但是最后你需要决定你是想知道模型在多大程度上依赖于每个特征来预测(使用训练数据)还是该特征对性能的贡献程度以及模型对看不见的数据的影响(使用测试数据)。正如我们将在后面看到的,只有一些方法可用于发现不用于训练模型的数据的特征重要性。
如果你关心第二个,并假设你有所有的时间和资源,找出特征重要性的最原始和可靠的方法是训练多个模型,一次留下一个特征,并在测试集上比较性能。如果性能从基线(我们使用所有函数时的性能)变化很大,说明这个特性非常重要。但是,因为我们生活在一个需要优化精度和计算时间的实际环境中,所以这种方法是不必要的。以下是一些智能方法,其中catboost可以帮助您找到最适合您的模型的函数:
CB . get _ feature _ importance(type = " _ _ _ _ _ _ ")
“类型”可能值:
-预测值更改
-损失功能变化
-功能重要性
预测值更改非排名指标和损失函数更改排名指标
-形状值
计算每个对象的SHAP值
-互动
计算每个特征之间的成对得分
预测值变化
对于每个特征,PredictionValuesChange显示了特征值变化时预测的平均变化程度。重要性值越大,平均值越大。如果这个特性改变了,预测值也会改变。
优点:计算成本低,因为不需要多次训练或测试,不会存储任何额外的信息。您将得到标准化的值作为输出(所有的重要性加起来为100)。
缺点:可能会给排名目标带来误导性的结果,可能会把groupwise的特性放在最前面,即使它们对最终的损失值有一点影响。
损失函数损失函数变化
为了获得该特征的重要性,catboost简单地采用在正常条件下(当我们包括该特征时)使用该模型获得的度量(损失函数)和没有该特征的模型之间的差异。差异越大,特征越重要。在catboost文档中,没有明确提到如何找到没有特征的模型。
优缺点:这对于大部分题型都很有效,不同于预测值的变化。在这种情况下,你可以得到排名问题的误导性结果,同时,它的计算量很大。
形状值
https://github.com/slundberg/shap
SHAP值将预测值分解为每个元素的贡献。它测量特征对单个预测值的影响,并比较基线预测(训练数据集的目标值的平均值)。
shap值的两个主要使用案例:
1.特征的对象级贡献
shap _ values = model . get _ feature _ importance(Pool(X _ test,label=y_test,cat _ features = category _ features _ indexes),
type="ShapValues ")
expected_value = shap_values[0,-1]
形状值=形状值[:,:-1]
shap.initjs()
shap.force_plot(expected_value,shap_values[3,:,X_test.iloc[3,:))
https://github.com/slundberg/shap
2.整个数据集的概要(整体特征重要性)
形状摘要图(形状值,X测试)
虽然我们可以通过shap得到准确的特征重要度,但是它们在计算上比catboost内置的特征重要度更昂贵。
捕获赏金
基于相同概念但不同实现的另一个特征重要性是基于排列的特征重要性。Catboost不使用,纯模型无关,计算简单。
我们如何选择?
虽然PredictionValuesChange和losfunctionchange都可以用于所有类型的指标,但建议使用losfunctionchange对指标进行排序。除了PredictionValuesChange,其他所有方法都可以使用测试数据,并使用根据训练数据训练的模型来查找特征重要性。
为了更好地理解这些差异,下面是我们讨论的所有方法的结果:
catboost功能的结果。从经典的“成人”人口普查数据集中预测人们是否会上报5万美元以上的收入(使用对数损失)。
从上图可以看出,大多数方法都符合顶层特性。看起来LossFunctionChange最接近shap(更可靠)。但是直接比较这些方法是不公平的,因为预测值的变化是基于训练数据的,而其他方法都是基于测试数据的。
我们还应该看到运行所有这些所需的时间:
互相地
有了这个参数,就可以求出一对元素的强弱(两个元素的重要性)。
在输出中,您将获得每对特征的列表。该列表将有三个值,第一个值是该对中第一个元素的索引,第二个值是该对中第二个元素的索引,第三个值是该对的要素重要性分数。请查看嵌入式笔记本了解实施详情。
值得注意的是,单个特征重要性中的前两个特征不一定是最强的一对。
笔记本
笔记本电脑中使用的数据集
对象重要性
你为什么想知道它?从训练数据中删除最无用的训练对象。根据哪些新对象预计最“有用”,优先给一批新对象做标记,类似于主动学习。
通过这个函数,可以计算出每个对象对测试数据优化指标的影响。正值反映优化指标的增加,负值反映优化指标的减少。该方法是本文中描述的方法的实现。这些算法的细节超出了本文的范围。
关于对象重要性的Catboost教程
cb.get_object_importance中有三种类型的update _ methods:single point:最快最不精确的方法TopKLeaves:指定叶子的个数。该值越高,计算越精确,速度越慢。AllPoints:最慢最准确的方法。
例如,以下值将方法设置为TopKLeaves,并将叶数限制为3:
TopKLeaves:top= 3
模型分析图
Catboost最近在其最新更新中引入了这一功能。有了这个函数,我们将能够可视化算法如何划分每个特征的数据,并查看特定于特征的统计数据。更具体地说,我们将能够看到:每个bin的平均目标值(bin用于连续函数)或每个类别的平均预测值(目前仅支持OHE函数);通过不同的特征值预测每个箱中的对象数量;对于每一个物体,特征值都是变化的,所以会落在某个区域。然后,模型根据新的特征值对目标进行预测,得到预测在区域内的平均值(由红点给出)。
这个图表将为我们提供信息,例如我们如何平均分割(我们不希望所有对象都进入一个区域),我们的预测是否接近目标(蓝色和橙色线),红线将告诉我们我们的预测有多敏感。
数字特征分析
单一热编码特征分析