import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# 讀取數據集
df = pd.read_csv('Dataset.csv')

# 劃分特征和目標變量
X = df.drop(['target'], axis=1)
y = df['target']

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=df['target'])

# 創建隨機森林分類器實例
rf_classifier = RandomForestClassifier(
n_estimators=100,
criterion='gini',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
random_state=42,
max_leaf_nodes=None,
min_impurity_decrease=0.0
)

# 訓練模型
rf_classifier.fit(X_train, y_train)

代碼加載了UCI上的Heart Disease數據集,劃分了訓練集和測試集,并使用隨機森林分類器對訓練數據進行訓練,以構建一個預測心臟病患病風險的分類模型,該模型的目的是通過分析患者的特征來判斷其是否患有心臟病,從而為早期診斷和治療提供支持

模型單樣本解釋

from lime.lime_tabular import LimeTabularExplainer
import warnings
warnings.filterwarnings("ignore", message=".*does not have valid feature names.*")

# 創建 LIME 解釋器對象
explainer = LimeTabularExplainer(
training_data=X_train.values,
feature_names=X.columns,
class_names=['False', 'True'], # 根據你的具體分類任務調整類名
mode='classification'
)

# 選擇一個要解釋的測試集樣本(例如,選擇第一個樣本)
sample_index = 0
sample = X_test.iloc[sample_index].values.reshape(1, -1)

# 生成解釋
exp = explainer.explain_instance(
data_row=sample.flatten(),
predict_fn=rf_classifier.predict_proba
)

# 顯示解釋結果
exp.show_in_notebook(show_table=True)

使用 LIME 解釋了隨機森林分類器對 UCI Heart Disease 數據集中第一個測試樣本的預測結果,在解釋中,類別設置為 False 表示未患病,True 表示患病,以便更直觀地理解模型的決策過程

結果解讀

根據 LIME 的解釋結果,模型預測該樣本未患病的概率為 96%,患病的概率為 4%。以下是對特征貢獻度的詳細解釋:

對“未患病” (False) 預測結果有正向貢獻的特征:

其余對“未患病” (False) 預測結果有正向貢獻的特征類似解讀,這里不一一給出

對“患病” (True) 預測結果有正向貢獻的特征:

總體來說,模型認為該樣本中的大多數特征指向“未患病”,這些特征的組合使得模型更傾向于預測該樣本為“未患病”,只有性別這個特征對“患病”有一定的貢獻,但不足以改變整體的預測結果

同樣本shap力圖解釋

import shap
# 構建 shap解釋器
explainer = shap.TreeExplainer(rf_classifier)
# 計算測試集的shap值
shap_values = explainer.shap_values(X_test)

# 繪制單個樣本的SHAP解釋(Force Plot)
sample_index = 0 # 選擇一個樣本索引進行解釋
shap.force_plot(explainer.expected_value[0], shap_values[:, :, 0][sample_index], X_test.iloc[sample_index], matplotlib=True)
shap.force_plot(explainer.expected_value[1], shap_values[:, :, 1][sample_index], X_test.iloc[sample_index], matplotlib=True)

這里對同一個樣本(測試集中的第一個數據)生成了 SHAP 力圖解釋,讀者可以自行對比 SHAP 和 LIME 兩種解釋方法的結果差異

總結

在心臟病預測的案例中,LIME 被用于解釋模型為什么認為某個患者未患有心臟病的風險較高,通過分析關鍵特征對預測結果的影響,LIME 提供了一個清晰的解釋,使醫療專業人員能夠理解模型的決策過程,這種能力使得 LIME 在許多需要解釋性和透明性的應用場景中非常有用,例如:

當然不局限于這些領域,通過簡化復雜模型的局部行為,LIME 使得用戶能夠更好地信任和理解機器學習模型的預測結果,在需要平衡準確性和可解釋性的領域尤為重要

文章轉自微信公眾號@Python機器學習AI

上一篇:

復現 Nature 圖表可視化——基于模型殘差分析與顯著性檢驗的模型解釋

下一篇:

從基礎到進階:優化SHAP力圖,讓樣本解讀更直觀

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費