自学内容网 自学内容网

lime使用记录

主要是对预测结果进行可解释

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from lime import lime_tabular

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 特征名称
feature_names = iris.feature_names
class_names = iris.target_names

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练随机森林分类器
rf_clf = RandomForestClassifier(n_estimators=500)
rf_clf.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = rf_clf.predict(X_test)

# 打印分类报告
print(classification_report(y_test, y_pred, target_names=class_names))

# 初始化LIME解释器
explainer = lime_tabular.LimeTabularExplainer(
    training_data=np.array(X_train),
    feature_names=feature_names,
    class_names=class_names,
    mode='classification'
)
# 打印解释结果
print("预测类别: {}".format(class_names[y_pred[i]]))

i = 10  # 可以选择任意一个测试样本的索引

# 选择一个测试样本进行解释
for idx, class_name in enumerate(class_names): 
    exp = explainer.explain_instance(X_test[i], rf_clf.predict_proba, num_samples=500,num_features=400,top_labels=None,labels=[idx])
    #画图
    exp.show_in_notebook(show_table=True)
    # 获取解释图
    exp.as_pyplot_figure(label=idx)
    # 打印解释
    print(exp.as_list(label=idx))

下面是对 LimeTabularExplainer 初始化参数的详细解释:

explainer = lime_tabular.LimeTabularExplainer(
    training_data=np.array(X_train),
    feature_names=feature_names,
    class_names=class_names,
    mode='classification',
    discretize_continuous=True,
    discretizer='quartile',
    categorical_features=(),
    categorical_names={},
    kernel_width=None,
    kernel=None,
    verbose=False,
    random_state=None
)

以下是每个参数的详细说明:

  • training_data: 训练数据集,类型为NumPy数组。这是LIME解释器用来学习如何解释模型的本地代理的数据集。

  • feature_names: 一个列表,包含了数据集中所有特征的名称。这用于在解释时标识特征。

  • class_names: 一个列表,包含了所有类别的名称。这用于在分类任务中标识类别。

  • mode: 解释器的工作模式。可以是 'classification' 或 'regression',分别对应分类和回归任务。

  • discretize_continuous: 布尔值,表示是否将连续特征离散化。在许多情况下,为了更好地解释模型,连续特征会被转换为分类特征。

  • discretizer: 当 discretize_continuous 为 True 时,此参数指定用于离散化连续特征的策略。默认是 'quartile',表示使用四分位数来离散化。

  • categorical_features: 一个元组或列表,包含数据集中所有分类特征的索引。这告诉解释器哪些特征是分类的。

  • categorical_names: 一个字典,其中键是分类特征的索引,值是分类特征的可能值的列表。这用于在解释时标识分类特征的值。

  • kernel_width: 解释器使用的核函数的宽度。较大的值意味着解释将考虑更多的数据点,而较小的值则意味着只考虑更接近查询点的数据点。

  • kernel: 指定用于权重分配的核函数。默认情况下,LIME使用高斯核。

  • verbose: 布尔值,表示是否打印出中间过程的详细信息。

  • random_state: 控制随机过程的种子,用于重现性。


以下是 explain_instance 方法的详细解释,包括其参数和返回值:

exp = explainer.explain_instance(
    data_row,
    predict_fn,
    num_features=10,
    top_labels=None,
    num_samples=5000,
    distance_metric='euclidean',
    model_regressor=None,
    categorical_feature_mask=None,
    feature_selection='auto',
    random_state=None
)

以下是每个参数的详细说明:

  • data_row: 需要解释的数据实例。它应该是一个与训练数据具有相同特征和格式的NumPy数组或列表。

  • predict_fn: 一个函数,它接收与训练数据格式相同的NumPy数组,并返回预测概率或预测值。对于分类问题,返回的通常是每个类别的概率;对于回归问题,返回的是预测值。

  • num_features: 需要解释的特征数量。这个方法将生成一个解释,其中包含对预测影响最大的 num_features 个特征。

  • top_labels: 对于分类问题,这是要解释的顶部标签的数量。默认情况下,只解释预测概率最高的标签。如果你设置为 None,则解释所有标签。

  • num_samples: 解释单个实例时使用的样本数量。LIME通过在 data_row 周围采样并观察模型预测的变化来生成解释。较大的 num_samples 会提供更准确的解释,但计算成本更高。

  • distance_metric: 用于测量采样点与 data_row 之间距离的距离度量。默认是欧几里得距离(‘euclidean’),但也可以选择其他度量,如曼哈顿距离(‘manhattan’)。

  • model_regressor: 用于拟合采样数据的回归模型。默认情况下,LIME会根据数据类型自动选择一个模型。如果你有特定的回归模型,可以在这里指定。

  • categorical_feature_mask: 一个布尔数组,指示哪些特征是分类的。如果提供了,它将覆盖 explainer 初始化时提供的 categorical_features

  • feature_selection: 特征选择的策略。可以是 'auto''forward_selection''lasso_path' 或 'none'。默认是 'auto',它根据数据类型和大小自动选择最佳策略。

  • random_state: 控制随机过程的种子,用于重现性。

返回值 exp 是一个 Explanation 对象,它包含了以下方法来获取和可视化解释:

  • as_list(): 返回一个包含特征及其影响的列表。
  • as_map(): 返回一个字典,其中键是特征名称,值是它们对预测的影响。
  • show_in_notebook(): 在Jupyter笔记本中可视化解释。
  • save_to_file(file_name, format='html'): 将解释保存到文件中,支持的格式包括HTML和PNG。

原文地址:https://blog.csdn.net/u011788214/article/details/142596810

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!