主要内容

使用LIME解释表格数据上的深度网络预测

这个例子展示了如何使用局部可解释模型未知解释(LIME)技术来理解深度神经网络分类表格数据的预测。您可以使用LIME技术来了解哪些预测因子对网络的分类决策最重要。

在本例中,您将使用LIME解释一个特征数据分类网络。对于指定的查询观察,LIME生成一个合成数据集,其中每个特征的统计数据与真实数据集匹配。该合成数据集通过深度神经网络得到分类,并拟合一个简单的、可解释的模型。这个简单的模型可以用来理解前几个特征对网络分类决策的重要性。在训练这个可解释的模型时,合成观测值被它们与查询观测值的距离加权,因此解释对该观测值是“局部的”。

这个例子使用了石灰(统计和机器学习工具箱)而且适合(统计和机器学习工具箱)生成一个合成数据集,并为该合成数据集拟合一个简单的可解释模型。为了理解一个训练过的图像分类神经网络的预测,使用imageLIME.有关更多信息,请参见使用LIME了解网络预测

加载数据

加载Fisher虹膜数据集。该数据包含150个观测值,其中4个输入特征表示植物参数,1个分类响应表示植物种类。每一次观察都被归类为三个物种之一:濑户鱼、花斑鱼或维珍鱼。每个观察有四个测量值:萼片宽度,萼片长度,花瓣宽度和花瓣长度。

文件名= fullfile(toolboxdir(“统计数据”),“statsdemos”“fisheriris.mat”);加载(文件名)

将数值数据转换为表。

特征= [“花萼长度”“花萼宽”“花瓣长度”“花瓣宽度”];Predictors = array2table(meas,“VariableNames”、功能);trueLabels = array2table(categorical(species),“VariableNames”“响应”);

创建一个训练数据表,该表的最后一列是响应。

data = [predictors trueLabels];

计算观察值、特征和类的数量。

numObservations = size(predictors,1);numFeatures = size(predictors,2);numClasses =长度(类别(数据{:,5}));

将数据分成训练集、验证集和测试集

将数据集划分为训练集、验证集和测试集。留出15%的数据用于验证,15%用于测试。

确定每个分区的观察数。设置随机种子,使数据分割和CPU训练具有可重复性。

rng (“默认”);numObservationsTrain = floor(0.7*numObservations);numObservationsValidation = floor(0.15*numObservations);

创建一个与观察结果对应的随机索引数组,并使用分区大小对其进行分区。

idx = randperm(numObservations);idxTrain = idx(1:numObservationsTrain);idxValidation = idx(numObservationsTrain + 1:numObservationsTrain + numObservationsValidation);idxTest = idx(numObservationsTrain + numObservationsValidation + 1:end);

使用索引将数据表划分为训练、验证和测试分区。

dataTrain = data(idxTrain,:);dataVal = data(idxValidation,:);dataTest = data(idxTest,:);

定义网络架构

创建一个简单的多层感知器,其中一个隐藏层有五个神经元和ReLU激活。特征输入层接受包含表示特征的数值标量的数据,例如Fisher虹膜数据集。

numHiddenUnits = 5;layers = [featureInputLayer(numFeatures) fullyConnectedLayer(numHiddenUnits) reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

定义培训方案和培训网络

使用随机动量梯度下降(SGDM)训练网络。将最大epoch数设置为30,并使用15个迷你批大小,因为训练数据不包含许多观测值。

opts = trainingOptions(“个”...“MaxEpochs”30岁的...“MiniBatchSize”15岁的...“洗牌”“every-epoch”...“ValidationData”dataVal,...“ExecutionEnvironment”“cpu”);

培训网络。

net = trainNetwork(dataTrain,layers,opts);
|======================================================================================================================| | 时代| |迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习  | | | | ( hh: mm: ss) | | | | |损失损失精度精度  | |======================================================================================================================| | 1 | 1 |就是| | 40.00% 31.82% | 1.3060 | 1.2897 | 0.0100 | | 8 50 | |就是|86.67% | 90.91% | 0.4223 | 0.3656 | 0.0100 | | 100 | |就是| | 93.33% 86.36% | 0.2947 | 0.2927 | 0.0100 | | 22 | 150 |就是| | 86.67% 81.82% | 0.2804 | 0.3707 | 0.0100 | | 200 | | 29日00:00:01 | | 86.67% 90.91% | 0.2268 | 0.2129 | 0.0100 | | 210 | | 00:00:01 93.33% | | | 0.2782 | 0.1666 | 0.0100 95.45%  | |======================================================================================================================|

评估网络性能

使用训练过的网络对测试集中的观察结果进行分类。

predictedLabels = net. classification (dataTest);trueLabels = dataTest{:,end};

使用混淆矩阵将结果可视化。

图confusionchart (trueLabels predictedLabels)

该网络成功地利用四种植物特征来预测测试观测的物种。

理解不同的预测因子对不同的类有多么重要

使用LIME来理解每个预测器对网络分类决策的重要性。

研究每个观察结果的两个最重要的预测因素。

numImportantPredictors = 2;

使用石灰创建一个合成数据集,其中每个特征的统计数据与真实数据集匹配。创建一个石灰对象使用深度学习模型黑箱预测数据包含在预测.使用低档“KernelWidth”所以价值石灰使用集中于查询点附近样本的权重。

Blackbox = @(x) category (net,x);解释=石灰(黑盒子,预测器,“类型”“分类”“KernelWidth”, 0.1);

你可以使用LIME解释器来理解深度神经网络最重要的特征。该函数通过使用一个简单的线性模型来估计一个特征的重要性,该模型近似于查询观察附近的神经网络。

找到测试数据中与setosa类对应的前两个观察值的索引。

trueLabelsTest = dataTest{:,end};标签=“setosa”;idxSetosa = find(trueLabelsTest == label,2);

使用适合函数将一个简单的线性模型拟合到指定类的前两个观测值。

explainerObs1 = fit(explainer,dataTest(idxSetosa(1),1:4),numImportantPredictors);explainerObs2 = fit(explainer,dataTest(idxSetosa(2),1:4),numImportantPredictors);

画出结果。

图subplot(2,1,1) plot(explainerObs1);次要情节(2,1,2)情节(explainerObs2);

对于setosa类,最重要的预测因子是低花瓣长度值和高萼片宽度值。

对类versicolor执行相同的分析。

标签=“多色的”;idxVersicolor = find(trueLabelsTest == label,2);explainerObs1 = fit(explainer,dataTest(idxVersicolor(1),1:4),numImportantPredictors);explainerObs2 = fit(explainer,dataTest(idxVersicolor(2),1:4),numImportantPredictors);图subplot(2,1,1) plot(explainerObs1);次要情节(2,1,2)情节(explainerObs2);

对于彩色类,高花瓣长度值是重要的。

最后,考虑virginica类。

标签=“virginica”;idxVirginica = find(trueLabelsTest == label,2);explainerObs1 = fit(explainer,dataTest(idxVirginica(1),1:4),numImportantPredictors);explainerObs2 = fit(explainer,dataTest(idxVirginica(2),1:4),numImportantPredictors);图subplot(2,1,1) plot(explainerObs1);次要情节(2,1,2)情节(explainerObs2);

对于处女类,高花瓣长度值和低萼片宽度值是重要的。

验证LIME假说

LIME图显示,花瓣长值高的花属属和维珍属属,花瓣长值低的花属属属。您可以通过研究数据进一步研究结果。

绘制数据集中每个图像的花瓣长度。

setosaIdx = ismember(data{:,end},“setosa”);versicolorIdx = ismember(data{:,end},“多色的”);virginicaIdx = ismember(data{:,end},“virginica”);图保存情节(数据{setosaIdx,“花瓣长度”},“。”)情节(数据{versicolorIdx,“花瓣长度”},“。”)情节(数据{virginicaIdx,“花瓣长度”},“。”)举行包含(“观察”) ylabel (“花瓣长度”)传说([“setosa”“多色的”“virginica”])

setosa类具有比其他类低得多的花瓣长度值,匹配的结果产生石灰模型。

另请参阅

(统计和机器学习工具箱)|(统计和机器学习工具箱)||||

相关的话题