MATLAB中文论坛 文章 技术专栏 机器学习 查看内容

如何信任机器学习模型的预测结果?(下)

2021-4-8 15:22| 发布者: MsM18| 查看: 4074| 评论: 13|原作者: 马文辉

摘要: 本篇将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。
本篇相关免费资源
点击此处免费获取电子书《精通机器学习:MATLAB 分步实施指南》
点击此处查看 LIME 帮助文档。

◆  ◆  ◆  ◆

上一篇中,我们向大家说明了机器学习模型预测结果的解释技术 LIME(Local Interpretable Model-Agnostic Explanations),并介绍了 MATLAB 实现 LIME 的三个主要函数:lime,fit 和 plot。
在本篇中,我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释
我使用数据集 carbig(MATLAB 自带的数据集)训练一个回归模型,用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽车的一些数据,包括:

其中:MPG 为响应变量(预测结果),其它变量为预测变量(数据特征),训练一个回归模型 f,该回归模型可以通过汽车的气缸数量、排量、生产年份等信息预测汽车的燃油效率,数学表达如下:
MPG = f(Cylinders,Displacement,Horsepower,modelyear,Weight,Acceleration)
利用 LIME 技术对回归模型 f 的预测结果进行解释,查看是那些特征对预测结果产生影响。具体的实现过程如下。

1
训练机器学习模型

导入数据集并构建数据表:
rng(0);
load carbig
tbl =table(Acceleration,Cylinders,Displacement,…
Horsepower,Model_Year,Weight,MPG);

进行数据预处理,去除带有缺失值的行:
tbl =rmmissing(tbl);

生成变量数据表:
tblX =removevars(tbl,'MPG');
head(tblX)

将变量按数据类型进行划分。其中第二列 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;

 图 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;

图 2
图 2 显示,变量之间的相关性都小于 0.9,因此保留相关性小于 0.9 的变量作为预测变量。
对数值型预测变量进行标准化,缩放到[0,1]之间,以消除量纲对预测结果的影响。
tblX_num= normalize(tblX_num,"range");
tbl.MPG =normalize(tbl.MPG,"range");
head(tblX_num)

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

将数值变量和分类变量合并成训练数据集:
tblX =[tblX_num tblX_cate];
head(tblX)

训练一个随机森林回归模型,预测变量是表 tblX 中的变量,响应变量是 MPG,并指明第 4 和第 5 列是分类变量。
mdl_bag= fitrensemble(tblX,tbl.MPG,'Method',"Bag",…
'CategoricalPredictors',[4 5]);

2
对机器学习模型进行解释

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

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


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

根据预测变量对预测结果的影响程度进行排序并可视化。
f =plot(lime_bag);
title('随机森林回归模型的LIME');
f.CurrentAxes.TickLabelInterpreter= 'none';

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

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

随机森林回归模型是基于决策树的集成模型,因此,模型本身也具有可解释性。我们对训练好的模型查看模型属性 predictorImportance,并进行可视化:
bagTreeMdl= mdl_bag;
bar(bagTreeMdl.predictorImportance);
f =gca;
f.XTickLabel= bagTreeMdl.PredictorNames;
f.XTickLabelRotation= 45;

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

4
对不用机器学习模型的 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',[45],…
'SimpleModelType',"tree");

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

根据预测变量对预测结果的影响程度进行排序并可视化
f =plot(lime_svm);
title('支持向量机回归模型的LIME');
f.CurrentAxes.TickLabelInterpreter= 'none';

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

注:表中的变量是按照重要性降序排列。
从上表中可以看出,两个模型的预测结果差别不大,但是解释的结果却是不同。因此解释结果与领域先验知识的匹配程度,可以作为判定模型可信性的依据。
到这里,只是得到了 LIME 对单个预测数据的预测结果的可信性,也就是模型局部的可信性。

那如何对整个模型的可信性如果获取呢?
如果训练数据集的规模不是很大,最直接的想法就是获取全部训练样本的可信性,也就是获取每个训练集样本的影响较大的预测变量,综合所有的结果取得对模型影响比较大的预测变量,并根据先验知识判断模型整体的可信性。
如果训练数据集规模较大,我们可以利用训练数据集的概率分布进行抽样,获取抽样数据预测结果影响较大的预测变量,综合所有的结果取得对模型影响比较大的预测变量,并根据先验知识判断模型整体的可信性。
以上的例子只是说明了 MATLAB 中利用 LIME 做机器学习模型解释的过程,lime 函数还有很多参数可以使用以改变解释结果,例如,合成数据集的大小,概率分布的计算,数据点距离的计算方法等等,大家可以利用 MATLAB 自带的数据集,自行测试一下这些参数的功能。
对于例子中的回归模型,也可以采用不同的机器学习模型,具体采用哪个模型需要考虑不同模型的预测精度。基于预测精度选择最佳机器学习模型,MATLAB 给出图形化的方式。通过友好的图形化界面,用户即可实现模型训练、不同模型的精度比较、以及实现模型深化训练的超参数调优等。图形化操作降低了构建精确模型所需的专业技能水平,因此无论您是专家还是只有有限的机器学习经验的用户,都可以使用它获取最佳模型。
另外 MATLAB 在 2020a 和 2020b 版本中推出的自动化模型选择和调优功能(AutoML),更加简化了机器学习工作流程,通过一次操作既可以实现模型对比和超参数调优。这大大降低了机器学习使用门槛,使用用户可以更加专注于领域知识的运用,避免数据科学的复杂内容。
关于 MATLAB 中的机器学习图形化操作和 AutoML 的内容,我们将在后续时间会以一个单独的主题向大家介绍。敬请期待:-)
2

鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (2 人)

发表评论

最新评论

引用 admin 2021-10-7 03:35
感谢分享
引用 admin 2021-10-6 04:30
谢谢分享
引用 奇缘时间 2021-9-15 15:10
谢谢分享
引用 大狮子323 2021-9-13 09:22
太棒了
引用 假如远方 2021-6-20 11:58
感谢
引用 小鸡蛋 2021-6-17 16:14
不太懂
引用 hurui123 2021-4-29 16:59
感谢 解决了我的一些疑惑
引用 许佳伟很凶 2021-4-25 22:43
什么程度
引用 MsM18 2021-4-22 11:57
作者答复:数据方面会涉及到数据质量和数据规模,在保证数据质量的前提下数据越多(意味着覆盖的情况越多)越好。
引用 Pluto_QphHH 2021-4-17 14:10
数据规模如何选取就合适了
引用 木叶卡卡 2021-4-14 11:31
如何选取
引用 属于我的天空 2021-4-13 20:49
数据规模如何选取就合适了
引用 小小的恶魔 2021-4-12 10:27
大概什么程度才算数据规模不大呢?

查看全部评论(13)

如何信任机器学习模型的预测结果?(上)

如何确定机器学习模型预测的结果是符合常理的,进而确定所选择的机器学习模型是可信的?我们将通过两个篇幅向大家介绍机器学习模型的可信性,即机器学习预测结果的解释,以及 MATLAB 如何支持对机器学习模型预测结果 ...

如何信任机器学习模型的预测结果?(下)

本篇将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。

如何信任机器学习模型的预测结果?(下)

本篇将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。

如何信任机器学习模型的预测结果?(上)

如何确定机器学习模型预测的结果是符合常理的,进而确定所选择的机器学习模型是可信的?我们将通过两个篇幅向大家介绍机器学习模型的可信性,即机器学习预测结果的解释,以及 MATLAB 如何支持对机器学习模型预测结果 ...
关闭

站长推荐上一条 /5 下一条

返回顶部