import torch
import torch.nn as nn
import torch.utils.data as Data
数据导入:
iris_datas = datasets.load_iris()
df = pd.concat([pd.DataFrame(iris_datas.data), pd.DataFrame(iris_datas.target)], axis=1)
df.columns = iris_datas.feature_names+['target']
df = df.sample(frac=1)
df.head()

数据处理,包括数据集划分、数据标准化,并将数据转换为tensor类型:

构建dataset和dataloader:
batch_size = 10
train_dataset = Data.TensorDataset(X_train, Y_train)
test_dataset = Data.TensorDataset(X_test, Y_test)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)
构建网络模型,这里为简单起见,使用全连接网络:
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes, n_layers):
super(NeuralNet, self).__init__()
layers = []
for i in range(n_layers):
layers.append(nn.Linear(hidden_size, hidden_size))
layers.append(nn.ReLU())
layers.append(nn.BatchNorm1d(hidden_size))
layers.append(nn.Dropout(0.3))
self.inLayer = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.hiddenLayer = nn.Sequential(*layers)
self.outLayer = nn.Linear(hidden_size, num_classes)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
out = self.inLayer(x)
out = self.relu(out)
out = self.hiddenLayer(out)
out = self.outLayer(out)
out = self.softmax(out)
return out
接着对上面的网络进行初始化:

网络训练,包括定义损失函数和优化函数:
num_epochs = 30
learning_rate = 0.001
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
model.train()
total_step = len(train_loader)
for epoch in range(num_epochs):
for i, (data, labels) in enumerate(train_loader):
outputs = model(data)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i + 1) %5 ==0:
correct = 0
total = 0
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += sum(predicted == labels).item()
acc = 100 * correct/total
print ('Epoch [{}/{}], Step [{}/{}], Accuracy: {}, Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, acc, loss.item()))
model.eval()
with torch.no_grad():
correct = 0
total = 0
for data, labels in test_loader:
outputs = model(data)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += sum(predicted==labels).item()
print('Accuracy of the network test dataset: {} %'.format(100 * correct / total))
print('-'*10)
----------
Epoch [19/30], Step [5/12], Accuracy: 100.0, Loss: 0.6313
Epoch [19/30], Step [10/12], Accuracy: 100.0, Loss: 0.6491
Accuracy of the network test dataset: 93.33333333333333 %
----------
Epoch [20/30], Step [5/12], Accuracy: 100.0, Loss: 0.5853
Epoch [20/30], Step [10/12], Accuracy: 90.0, Loss: 0.6876
Accuracy of the network test dataset: 90.0 %
使用LIME来解释Pytorch的模型主要有下面的几个步骤:
首先定义预测函数:
def batch_predict(data, model=model):
:param data: 需要预测的数据
:param model: Pytorch训练的模型,**这里需要有默认的模型**
:return:
X_tensor = torch.from_numpy(data).float()
model.eval()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
X_tensor = X_tensor.to(device)
logits = model(X_tensor)
probs = torch.nn.functional.softmax(logits, dim=1)
return probs.detach().cpu().numpy()
简单测试一下,输入数据, 出来的是每一类的概率.:

创建解释器,用来对后面的样本进行解释:
from lime.lime_tabular import LimeTabularExplainer
targets = iris_datas.target_names
features_names = iris_datas.feature_names
explainer = LimeTabularExplainer(X, feature_names=features_names, class_names=targets, discretize_continuous=True)
解释某一个样本, 这里是对第5个样本进行解释.:
exp = explainer.explain_instance(X[5], batch_predict, num_features=5, top_labels=5)
exp.save_to_file('../Results/exp.html')
结果可视化。可视化的内容会包括是某一类的原因(或是不是某一类的原因), 比如对于Iris dataset来说, 会分别给出三张图. 如下所示.

如上图所示, 对于virginica来说, 模型给出了是这个分类的原因, 例如因为petal width>-1.23, 这就是给出了一个模型判断的原因。除了上面的画图方式, 我们还可以使用下面的画图方式, 只画出某一个类别的判断的可能性:

[1] “Why Should I Trust You?”: Explaining the Predictions of Any Classifier
[2] 模型解释-LIME的原理和实现
[3] Pytorch例子演示及LIME使用例子
eli5库使用方法详解:从安装到实战Py之eli5:eli5库的简介、安装、使用方法之详细攻略eli5是一个Python库,它提供了一种可视化的方式,用于解释训练过程中机器学习模型的预测方式。这种方式不仅能够向您展示经过探究过的预测值,还能显式地告诉你为什么模型会预测出哪个属性。eli5提供了多种算法的可视化工具,包括线性模型、文本和图像分类器等。在本文中,我们将介绍如何安装和使用eli5库。
eli5库的简介
ELI5(Explain Like I'm Five,解释给五岁小孩听)是一个Python库,它可以帮助调试机器学习分类器并解释它们的预测。它使机器学习模型更具可解释性,允许使用统一的API可视化和调试各种机器学习模型。它内置了对几种ML框架的支持,并提供了一种解释黑盒模型的方法。
ELI5 (Explain
ELI5主要是用于处理文本分类的机器学习的库
MLI5是一个Python库,允许使用统一API可视化地调试各种机器学习模型。 它内置了对多个ML框架的支持,并提供了一种解释黑盒模型的方法。它有助于调试机器学习分类器并解释它们的预测。
scikit-learn。目前,ELI5允许解释scikit-learning线性分类器和回归量的权重和预测,将决策树打印为文本或SVG,显示特征重要性并解释决策树...
本文主要演示了对shap、LIME两个工具包的使用
shap是一种解释任何机器学习模型输出的博弈论方法,它利用博弈论中的经典Shapley值及其相关扩展将最优信贷分配与局部解释联系起来。
LIME帮助解释学习模型正在学习什么以及为什么他们以某种方式预测。目前支持对表格的数据,文本分类器和图像分类器的解释。
此时我们不难猜到报错原因是sklearn与eli5之间的版本兼容问题, 貌似是由于sklearn 弃用了 if_delegate_has_method 装饰器并将其替换为另一个名为 available_if 的装饰器导致的导入错误。将第七行导入项的 if_delegate_has_method。eli5包的相关介绍这里就不多叙述了,简单来说就是通过一个机器学习模型,可以是线性模型、树模型等将特征数据拟合之后输出特征的重要性,帮助理解那些特征对模型最为重要,可以帮助特征的选择。然后保存该模块即可。
在上一篇博客LIME算法:模型的可解释性(代码实现)中,我整理了LIME算法的原理及在文本分类模型中的应用。在这篇笔记中,我记录了LIME算法在图像分类模型中的应用及过程中遇到的问题和解决方法。
一、算法简介
LIME算法是Marco Tulio Ribeiro2016年发表的论文《“Why Should I Trust You?” Explaining the Predictions of Any Classifier》中介绍的局部可解释性模型算法。该算法主要是用在文本类与图像类的模型中。
二、LIME解
eli5模块是一个开源的Python库,旨在解释机器学习模型的预测结果。它提供了一种直观的方式来理解模型的决策过程,帮助我们更好地理解模型的工作原理。eli5支持多种机器学习框架,包括scikit-learn、XGBoost、LightGBM等,可以解释这些框架中的各种模型。
如果你是一名初学者或中级机器学习工程师或数据科学家,这篇文章非常适合你。你已经选择了自己喜欢的机器学习库,比如PyTorch或TensorFlow,并且掌握了选择模型正确架构的技巧。你还能够训练模型并解决现实世界的问题。但接下来呢?
对于机器学习的用户而言,模型的可解释性是一种较为主观的性质,我们无法通过严谨的数学表达方法形式化定义可解释性。通常,我们可以认为机器学习的可解释性刻画了“人类对模型决策或预测结果的理解程度”,即用户可以更容易地理解解释性较高的模型做出的决策和预测。从哲学的角度来说,为了理解何为机器学习的可解释性,我们需要回答以下几个问题:首先,我们应该如何定义对模型的“解释”,怎样的解释才足够好?许多学者认为,要判断一个解释是否足够好,取决于这个解释需要回答的问题是什么。
lime库是机器学习领域中,一种局部的、与模型无关的解释方法。这个项目是关于解释机器学习分类器(或模型)正在做什么。目前,我们支持使用一个名为lime(局部可解释模型不可知性解释的简称)的包来解释文本分类器或作用于表(数字或分类数据的numpy数组)或图像的分类器的单个预测。lime可以用两个或两个以上的类来解释任何黑盒分类器。我们只需要分类器实现一个函数,该函数接受原始文本或numpy数组,并输出每个类的概率。内置了对scikit-learn分类器的支持。GitHub官网Lime。......
在机器学习中,模型经常会做出一些令人费解的决策,而Lime的作用就是帮助用户简化模型的决策过程,以便更好地分析和调试。在上面的代码中,我们使用了Lime的lime_image模块来加载了一张图片’image_path’,并将其进行了预处理。Lime是一个强大的数据可视化库,它可以帮助用户简化机器学习过程中的决策过程,更好地理解模型如何作出决策。通过上述示例,相信您已经了解了Lime的基本使用方法,它可以帮助您提高模型的准确性和可解释性。要使用Lime,需要先安装它。
------------------------------------正文----------------------------------------不仅学会如何编程,还将学会如何将AI技术应用到实际问题中,为您的职业生涯增添一笔宝贵的财富。,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。】里面有大量面试涉及的算法或数据结构编程题。有意找工作的同学,请参考博主的原创:《或关注博主免费专栏【