技术文章

如何信任机器学习模型的预测结果

作者 : 马文辉、MathWorks


机器学习已经在企业中得到了广泛应用。最近在与不同企业的交流中发现,机器学习模型预测结果的可信性得到越来越多的关注。也即是说,如何确定机器学习模型预测的结果是符合常理的,进而确定所选择的机器学习模型是可信的。关于这个问题,我将通过两个篇幅向大家介绍机器学习模型的可信性,即机器学习预测结果的解释,以及MATLAB如何支持对机器学习模型预测结果的解释,并通过一个例子说明在MATLAB中的实现过程。首先介绍机器学习模型预测结果的解释及MATLAB的支持情况

机器学习模型的可信性

机器学习的目的是在训练数据集中学习到一个最优的模型,并且这个最优模型对未知数据有很好的预测能力(即模型具有很好的泛化能力)。广泛使用的衡量模型好坏的标准是模型精度,即模型在训练集上的准确度。而在追求模型准确度的过程中,往往会产生过拟合问题,在训练样本不足的情况这个问题尤为严重。模型在训练集上有很好的精度,但是在测试集上精度确很差。因此,仅仅是通过模型的精度进行模型的选择,往往会使得模型的可信度变低,尤其是在过拟合的情况下。

为了避免过拟合,提高机器学习模型的精度,正则化和交叉验证是最常采用的方法。正则化是遵循结构化风险最小化原则,即减少模型中非零参数的数量(也就是减少变量的个数或者特征的个数),进而从模型结构上降低复杂度。尤其在训练样本不足的情况下,过多的变量或数据特征容易造成模型的过拟合。交叉验证是通过引入验证集提高模型的泛化能力。交叉验证将训练集进行k份(也叫k-fold)的切分,其中k-1份用于训练,1份用于验证。并且不断的交叉选择训练集和验证集,得到k个模型训练结果精度,使用k个结果的平局值作为最终的模型精度。

不论是正则化的方法,还是交叉验证的方法,选择模型的依据都是比较模型的精度。但是,模型预测结果的合理性或可信性,是决定能否将机器学习模型应用到生产环境下的重要因素。特别是,对于复杂的非线性模型,我们并不清楚为什么能够取得某种预测结果,是那些变量或那些数据特征影响模型的预测结果。这往往使得复杂机器学习模型变成一个黑盒。黑盒模型带来了可信度的问题:我是否可以相信机器学习模型的预测结果?进而,我是否可以相信训练生成的机器学习模型?

这就引出了今天将要给大家介绍的内容:机器学习模型的可信性。这里的可信性是指:是否可以对机器学习模型的预测结果给出一个合理的解释,能够定性地呈现出模型输入数据的特征和模型输出的预测结果之间的关系。通俗的说,我得到的预测结果是受到哪些因素的影响。领域专家往往对研究的领域具有先验知识,当对模型预测结果的解释与先验知识相匹配时,机器学习模型预测结果的可信性就会大大提升,否则就会拒绝预测结果。

如何实现对机器学习模型的预测结果进行解释呢?Ribeiro等人在论文[1]中提出了LIME(Local Interpretable Model-Agnostic Explanations)。LIME的目标是:对于一个训练好的机器学习模型,找到一个适合的可解释模型,用于解释机器学习模型的预测结果,也就是定性分析输入数据的特征与预测结果的相关性。这里提到的可解释模型是指模型本身具有自解释性,这中自解释性是由模型结构特性决定的。这类模型主要是指线性模型和决策树模型。

  • 线性模型

线性模型 f 可以简单表示为如下的数学表达:

\[f(x_{1}, x_{2}, ..., x_{m}) = w_{1} \times x_{1} + w_{2} \times x_{2} + ... + w_{m} \times x_{m} + b \]

其中,\(x_{1}, x_{2}, ..., x_{m}\) 表示输入数据的特征(m维),\(w_{1}, w_{2}, ..., w_{m}\) 为模型的系数,系数绝对值的大小表明了输入特征对结果的影响程度。因此,线性模型的可解释性是通过系数的绝对值大小表示的。

  • 决策树模型

决策树模型是利用特征对数据进行划分,而选择特征的依据就是特征值能否将数据完全分隔。如果通过特征值可以将数据完全分隔开(相同标注的数据划分在一起),那么该特征的重要性就会升高;如果通过特征值不能分隔数据(不同标注的数据混在一起),那么这个特征的重要性就会降低。因此,特征划分数据的能力就体现了特征对结果的影响程度。因此,决策树的可解释性是通过特征的划分能力表示的。如何选择特征进行数据划分,这就要依据于所选择的决策树算法。决策树算法包括:ID3、C4.5和CART。关于这些算法,有很多资料可以参考,在这里就不进行说明了。MATLAB的决策树使用的CART算法,决策树既可以用于数据分类也可以用于数据回归。

LIME正是基于线性模型或决策树模型构建用于解释复杂机器学习模型的可解释模型。对于复杂的机器学习模型,例如支持向量机(SVM),LIME模型定性说明输入的数据特征对预测结果的影响程度。LIME实现对预测结果的解释的方式是:以单个预测数据为基础,通过增加扰动生成合成数据集。合成数据集包含扰动数据以及对应的预测结果。在合成数据集上找到一个可以与复杂的分类模型或回归模型近似的可解释模型,并利用可解释模型来解释原始的机器学习模型的预测结果。LIME主要包含三个部分:

  • Local fidelity

Local fidelity表示LIME的局部保真或局部相似性。意味着LIME生成的可解释模型必须与复杂机器学习模型在被预测实例附近的预测结果相一致。

  • Interpretable

Interpretable表示LIME的可解释性,这种解释是直接反应输入的数据特征(或变量)对预测结果的影响程度,并且这种解释会重点突出部分数据特征或输入变量而不是全部,因此说LIME模型可以给出比较容易理解的解释。

  • Model Agnostic

Model Agnostic表示LIME的模型无关性。LIME将被解释的原始模型视为一个黑盒(black box),并不关心原始模型的内部细节。LIME只是通过在输入预测数据的局部范围内生成扰动数据,以及对应的预测结果,进而训练出一个局部近似的可解释模型,该模型与原始机器学习模型的预测结果一致。

上述的三个组成部分也就决定的LIME的工作过程。LIME是对局部数据训练可解释模型。假设有机器学习模型f,对于一个预测数据x,x有m维或m个特征 :

\[x = (x_{1}, x_{2}, ..., x_{m})\]

(m表示数据的维度或特征数)

机器学习模型f对x的预测结果是\(p\),

\[\ x\overset{f}{\underset{ }{\to}}p \]

针对预测结果\(p\),LIME解释过程如下:

基于概率分布,在x的局部范围内随机生成的多个数据样本(称之为合成数据(synthetic data)),由这些数据构成合成数据集 X’:

\[X’ = \{x’_{1}, x’_{2}, ..., x’_{n}\}\]

(n表示数据集中样本的个数,并且每个样本x_i^'都具有m个维度)

对X’中的样本使用机器学习模型f进行预测,并生成结果 \(P’\):

\[P’ = \{p’_{1}, p’_{2}, ..., p’_{n}\}\]

即:

\[\ X'\overset{f}{\underset{ }{\to}}P' \]

由此,产生了一个新的数据集 D = (X’, P’ ),LIME在新的数据集D上训练一个简单的可解释模型f’(例如,线性模型),并且,该可解释模型对于预测数据x的预测结果与机器学习模型f的预测结果近似。即:

\[f'(x) = w_{1} \times x_{1} + w_{2} \times x_{2} + ... + w_{m} \times x_{m} + b \approx p\]

因此,通过可解释模型,可以定性的给出数据特征对预测结果的影响程度,即参数ω_1,ω_2,…,ω_m的绝对值表示特征对结果的影响程度。

MATLAB 对此的支持

MATLAB2020b版本中的统计和机器学习工具箱(Statistics and Machine Learning Toolbox)实现了对LIME的支持, 主要是通过lime, fit和plot三个函数。

  1. lime

lime是实现LIME的主函数。通过lime可以生成一个LIME的对象(如(1)所示,results表示生成的LIME对象)。

\[results = lime(blackbox) \quad (1)\]

其中,blackbox是被解释的机器学习模型。lime提供了很多参数用于对LIME进行配置,包括:

  • 'QueryPoint'
    QueryPoint 是LIME用于生成可解释模型的基础输入数据(也是预测数据),QueryPoint的值对应单个输入数据。当在lime函数中设置’QueryPoint‘,可以直接生成可解释模型。
  • 'CategoricalPredictors'
    CategoricalPredictors指明输入数据的分类变量,可以是索引数组、列名向量等。
  • 'NumImportantPredictors'
    可解释模型的特征数量。NumImportantPredictors指定用于解释预测结果的特征个数
  • 'NumImportantPredictors'
    指定评估概率分布的数据范围,该概率分布用于随机生成合成数据。因此DataLocality 决定数据“局部性“的范围大小。”'gloal' 表示使用机器学习模型的训练集评估概率分布,因此针对不同的输入数据(QueryPoint),生成合成数据的概率分布式一样的;'local' 表示使用输入数据的局部范围内的数据评估概率分布。使用“局部的大小”的由参数'NumNeighbours' 确定(默认值为1500)。因此,当'DataLocality' 指定为'local' 时,需要与'NumNeighbours'配合使用,以生成概率分布的参数。
  • 'NumSyntheticData'
    合成数据集的样本数量。此参数仅在'DataLocality'为'local'时有效。
  • 'SimpleModelType'
    可解释模型的类型,包括线性模型和决策树模型
  • 'Type'
    被解释的‘黑盒’机器学习模型的类别,包括分类模型和回归模型
  1. fit

fit用于生成LIME的可解释模型。当lime没有指定'QueryPoint'时,需要使用fit函数生成可解释模型。fit的标准形式如下

\[newresults = fit(results, queryPoint, numImportantPredictors)\]

fit包含三个必须输入参数:

  • results,lime函数的输出结果;
  • queryPoint,输入数据;
  • numImportantPredictors,可解释模型的特征数量。

除了必选参数,fit也包含'NumNeighbors','NumSyntheticData','SimpleModelType'等在lime函数中出现的可选参数。并且fit会覆盖lime的对应的参数值。

  1. plot

plot用于可视化LIME的结果。plot输出两种结果:水平条形图,显示线性简单模型的系数值或决策树变量(特征)的重要性值;原始机器学习模型和新生成的可解释模型的的两个预测结果。通过plot的结果可以直观看到那些特征或变量对原始模机器学习模型预测结果的有重要影响,并且按照重要性进行排序。

示例:使用 LIME 进行复杂机器学习模型预测结果的结束

接下来我使用数据集carbig(MATLAB自带的数据集)训练一个回归模型,用于预测汽车的燃油效率。数据集carbig是70年代到80年代生产的汽车的一些数据,包括:

Cylinders Displacement Horsepower Model Year Weight Acceleration MPG
汽缸数量 排量 功率 年份 车重 加速 燃油效率

其中:MPG为响应变量(预测结果),其它变量为预测变量(数据特征),训练一个回归模型f,该回归模型可以通过汽车的气缸数量、排量、生产年份等信息预测汽车的燃油效率,数学表达如下:

\[MPG= f(Cylinders,Displacement,Horsepower,modelyear,Weight,Acceleration)\]

利用LIME技术对回归模型f的预测结果进行解释,查看是那些特征对预测结果产生影响。具体的实现过程如下。

训练机器学习模型

导入数据集并构建数据表:

rng(0);
load carbig
tbl = table(Acceleration,Cylinders,Displacement,…
Horsepower,Model_Year,Weight,MPG);

进行数据预处理,去除带有缺失值的行:

tbl = rmmissing(tbl);

生成预测变量数据表:

tblX = removevars(tbl,'MPG');
head(tblX)
image3

将变量按数据类型进行划分。其中第二列Cylinders和第五列Model_Year是分类变量,其它列是数值变量

tblX_num = removevars(tblX,{'Cylinders','Model_Year'});
tblX_cate = tblX(:,{'Cylinders','Model_Year'});

对于数值变量查看变量之间的相关性

cor = corr(tblX_num{:,:});
h = heatmap(cor);
h.XDisplayLabels = tblX_num.Properties.VariableNames;
h.YDisplayLabels = tblX_num.Properties.VariableNames;
(Image Caption: 图1)
图1

从图1的计算结果得出,Displacement与Weight具有强相关性,Displacement与Horsepower的相关性也较大。因此,去除Displacement变量。

tblX_num = removevars(tblX_num,{'Displacement'});

再次计算变量之间的相关性:

cor = corr(tblX_num{:,:});
h = heatmap(cor);
h.XDisplayLabels = tblX_num.Properties.VariableNames;
h.YDisplayLabels = tblX_num.Properties.VariableNames;
(Image Caption: 图2)
图2

图2显示,变量之间的相关性都小于0.9,因此保留相关性小于0.9的变量作为预测变量。

对数值型预测变量进行标准化,缩放到[0,1]之间,以消除量纲对预测结果的影响。

tblX_num = normalize(tblX_num,"range");
tbl.MPG = normalize(tbl.MPG,"range");
head(tblX_num)
image8

将数值变量和分类变量合并成训练数据集:

tblX = [tblX_num tblX_cate];
head(tblX)
image9

训练一个随机森林回归模型,预测变量是表tblX中的变量,响应变量是MPG,并指明第4和第5列是分类变量。

mdl_bag = fitrensemble(tblX,tbl.MPG,'Method',"Bag",…
'CategoricalPredictors',[4 5]);

对机器学习模型进行解释

利用LIME对训练好的回归模型进行解释。首先构建使用lime函数构建一个LIME,简单的解释模型选择决策树,同时lime中也指明了原始回归模型的训练样本的第4和第5列是分类变量。

lime_bag = lime(mdl_bag,'CategoricalPredictors',[4 5],…        
'SimpleModelType',"tree");

我们从训练集中选取一个样本作为预测数据(即QueryPoint),测试模型的预测结果,以及模型的解释结果。选择训练集中的第257个样本作为预测数据。

num = 257;
queryPoint = tblX(num,:)
image12

以预测数据为基础生成合成数据,并训练一个可解释模型(决策树模型)。对于可解释模型,指定变量个数为5。也就是说,我们最多只分析5个对预测结果产生影响的变量。

lime_bag = fit(lime_bag,queryPoint,5);

根据预测变量对预测结果的影响程度进行排序并可视化。

f = plot(lime_bag);
title('随机森林回归模型的LIME');
f.CurrentAxes.TickLabelInterpreter = 'none';
(Image Caption: 图3)
图3

从图3可以看出,预测变量Weight,对回归模型预测的结果影响最大,其次是Cylinders和Horsepower。可以解释为:基于输入数据预测出的汽车燃油效率,主要依次考虑了汽车的重量(Weight)、汽车的动力(Horsepower)、汽车汽缸数量(Cylinders)。这种解释也是符合我们的先验知识:汽车自重越大燃油效率越低,也就是每加仑行驶的里程数越少。汽车功率越大、汽缸数量越多,耗油越大。因此说,回归模型预测的结果是可信的。

模型自解释结果与LIME解释结果的对比

随机森林回归模型是基于决策树的集成模型,因此,模型本身也具有可解释性。我们对训练好的模型查看模型属性predictorImportance,并进行可视化:

bagTreeMdl = mdl_bag;
bar(bagTreeMdl.predictorImportance);
f = gca;
f.XTickLabel = bagTreeMdl.PredictorNames;
f.XTickLabelRotation = 45;
(Image Caption: 图4)
图4
 

从图4可以看出,对随机森林模型预测结果有重要影响的预测变量依次是Cylinders、Weight、Horsepower、Model_Year以及Acceleration。与LIME的解释相比,Weight和Cylinders重要顺序不同,但都是对预测结果有重要影响的。因此,对于当前的输入数据,LIME的解释结果与随机森林的自解释结果是相近的。

对不用机器学习模型的LIME解释结果对比

使用同样的训练集,训练一个支持向量机回归模型。并且,对同一个预测数据的预测结果使用LIME进行解释。对比两个机器学习模型预测结果以及解释结果。

支持向量机的回归模型指定采用高斯核函数,并指明第4和第5个预测变量是分类变量。

mdl_svm = fitrsvm(tblX,tbl.MPG,'CategoricalPredictors',[4 5],…
'KernelFunction',"gaussian");

对回归模型使用LIME进行解释。首先构建使用lime函数构建一个LIME对象,解释模型使用决策树,同时lime中也指明了原始机器学习模型的训练样本的第4和第5列是分类变量。

lime_svm = lime(mdl_svm,'CategoricalPredictors',[4 5],…
'SimpleModelType',"tree");

以预测数据为基础生成合成数据集,并训练一个可解释模型(决策树模型)。对于可解释模型,指定变量个数为5。

lime_svm = fit(lime_svm,queryPoint,5);

根据预测变量对预测结果的影响程度进行排序并可视化

f = plot(lime_svm);
title('支持向量机回归模型的LIME');
f.CurrentAxes.TickLabelInterpreter = 'none';
(image caption: 图5)
图5

从图5可以看出,预测变量Weight对支持向量机回归模型的预测结果影响最大,其次是Cylinders和Model_Year。也就是说,对于当前的预测数据,支持向量机模型产生预测结果时,重点考虑了Weight、Cylinders和Model_Year三个变量,而并没有考虑Horsepower。这与图3显示的随机森林模型预测结果的解释有些不同。

对于相同的预测数据,从预测结果和预测结果的解释两个角度,对比分析随机森林模型和支持向量机模型,结果如下表所示(标准化后的数据):,

机器学习模型 预测燃油效率 (MPG) 实际燃油效率(MPG) 重要变量1 重要变量2 重要变量3
支持向量机 0.27789 0.3085 Weight Cylinders Model_Year
随机森林 0.28596 0.3085 Weight Cylinders Horsepower

注:表中的变量是按照重要性降序排列。

从上表中可以看出,两个模型的预测结果差别不大,但是解释的结果却是不同。因此解释结果与领域先验知识的匹配程度,可以作为判定模型可信性的依据。

到这里,只是得到了LIME对单个预测数据的预测结果的可信性,也就是模型局部的可信性。那如何对整个模型的可信性如果获取呢?如果训练数据集的规模不是很大,最直接的想法就是获取全部训练样本的可信性,也就是获取每个训练集样本的影响较大的预测变量,综合所有的结果取得对模型影响比较大的预测变量,并根据先验知识判断模型整体的可信性。如果训练数据集规模较大,我们可以利用训练数据集的概率分布进行抽样,获取抽样数据预测结果影响较大的预测变量,综合所有的结果取得对模型影响比较大的预测变量,并根据先验知识判断模型整体的可信性。

以上的例子只是说明了MATLAB中利用LIME做机器学习模型解释的过程,lime函数还有很多参数可以使用以改变解释结果,例如,合成数据集的大小,概率分布的计算,数据点距离的计算方法等等,大家可以利用MATLAB自带的数据集,自行测试一下这些参数的功能。

对于例子中的回归模型,也可以采用不同的机器学习模型,具体采用哪个模型需要考虑不同模型的预测精度。基于预测精度选择最佳机器学习模型,MATLAB给出图形化的方式。通过友好的图形化界面,用户即可实现模型训练、不同模型的精度比较、以及实现模型深化训练的超参数调优等。图形化操作降低了构建精确模型所需的专业技能水平,因此无论您是专家还是只有有限的机器学习经验的用户,都可以使用它获取最佳模型。

另外MATLAB在2020a和2020b版本中推出的自动化模型选择和调优功能(AutoML),更加简化了机器学习工作流程,通过一次操作既可以实现模型对比和超参数调优。这大大降低了机器学习使用门槛,使用用户可以更加专注于领域知识的运用,避免数据科学的复杂内容。

[1] Ribeiro, Marco Tulio, S. Singh, and C. Guestrin. "'Why Should I Trust You?': Explaining the Predictions of Any Classifier." In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 1135–44. San Francisco California USA: ACM, 2016.

2022 年发布

查看文章,了解相关功能