Python与R中Lime Model Explainer用法差异及R代码转Python实现咨询
R Lime代码转Python实现(多分类h2o模型场景)
原代码存在的核心问题
explain_instance()是单样本解释方法,不能直接传入全部观测数据集,需要遍历所有待解释样本逐行调用- h2o模型的原生预测方法不支持Lime要求的numpy数组输入,需自定义预测函数做格式转换,保证输出为维度
(样本数, 类别数)的概率矩阵 - 参数未和R原代码对齐:原R代码设置
n_features=10、feature_select="highest_weights",Python代码需要对应调整参数值,3分类场景可设置top_labels=3返回所有类别的解释结果
正确实现代码
第一步:自定义h2o预测适配函数
import h2o import numpy as np import lime from lime.lime_tabular import LimeTabularExplainer # 适配Lime输入要求的h2o预测函数 def h2o_predict_proba(X): # 将Lime生成的numpy特征数组转为h2o Frame格式 h2o_X = h2o.H2OFrame(X, column_names=observationCols) # 提取预测概率结果,转numpy数组输出,维度为(样本数, 类别数) pred_proba = mymodel.predict(h2o_X).as_data_frame().iloc[:, 1:].values return pred_proba
第二步:初始化解释器+批量解释样本
# 初始化Lime表格解释器 # 注意第一个参数需传入训练集特征矩阵作为参考分布,不要直接使用待解释的观测数据集 explainer = LimeTabularExplainer( training_data=train_feature_matrix, # 替换为你的训练集特征矩阵 mode='classification', class_names=myclasses, feature_names=observationCols, random_state=42 ) # 批量生成所有观测样本的解释结果 explanations = [] for obs_row in observations: single_exp = explainer.explain_instance( data_row=obs_row, predict_fn=h2o_predict_proba, num_samples=5000, # 对应R代码的n_permutations参数 num_features=10, # 对应R代码的n_features参数 feature_selection='highest_weights', # 对应R代码的feature_select参数 top_labels=3 # 3分类任务返回所有类别的解释结果 ) explanations.append(single_exp)
结果提取说明
如果需要导出结构化的解释结果,可调用每个解释对象的as_list(label=类别索引)、as_map(label=类别索引)方法提取指定类别的特征权重,逻辑与R版本Lime的输出字段对齐。
内容的提问来源于stack exchange,提问作者Jacqueline Schafer
相关产品推荐
相关产品推荐

