目錄
K最近鄰(KNN) - 基于距離的模型
決策邊界可視化
查看特定樣本的最近鄰
?隨機森林(RF) - 樹模型
feature_importances_
SHAP值分析
可視化單棵樹
多層感知器(MLP) - 神經網絡
部分依賴圖
LIME解釋器
權重可視化
支持向量回歸(SVR) - 核方法
支持向量可視化
部分依賴圖
決策邊界可視化(對于分類問題)
通用解釋方法(適用于所有模型)
Permutation Importance
全局代理模型
Anchor解釋法
可視化工具推薦
總結建議
針對不同類型的機器學習模型,我們需要使用不同的可解釋性技術。以下是不同模型類型的可解釋性分析方法
K最近鄰(KNN) - 基于距離的模型
-
決策邊界可視化
## KNN-基于距離的模型
# 1. 決策邊界可視化import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import DecisionBoundaryDisplay# 加載數據
iris = load_iris()
X = iris.data[:, :2]
y = iris.target# 訓練模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)disp = DecisionBoundaryDisplay.from_estimator(knn, X, response_method="predict",alpha=0.5, grid_resolution=200,xlabel=iris.feature_names[0], ylabel=iris.feature_names[1],
)
disp.ax_.scatter(X[:, 0], X[:, 1], c=y, edgecolor="k")
plt.title("KNN Decision Boundaries")
plt.show()
-
查看特定樣本的最近鄰
# 2. 查看特定樣本的最近鄰import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import DecisionBoundaryDisplay# 加載數據
iris = load_iris()
X = iris.data[:, :2]
y = iris.target# 訓練模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)sample_idx = 10
distances, indices = knn.kneighbors(X[sample_idx].reshape(1, -1))
print(f"最近鄰索引: {indices}")
print(f"距離: {distances}")
# 最近鄰索引: [[10 48 5 16 36]]
# 距離: [[0. 0.1 0.2 0.2 0.2236068]]# 可視化最近鄰
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.3, label="All points")
plt.scatter(X[sample_idx, 0], X[sample_idx, 1], c='red', s=100, label="Query point")
plt.scatter(X[indices[0], 0], X[indices[0], 1], c='blue', s=50, label="Neighbors")
plt.legend()
plt.title(f"KNN Neighbors (k={knn.n_neighbors})")
plt.show()
隨機森林(RF) - 樹模型
-
feature_importances_
## RF-樹模型
from sklearn.ensemble import RandomForestClassifier
import shap
from sklearn.datasets import load_iris
from sklearn.tree import plot_tree
import matplotlib.pyplot as pltiris = load_iris()
X = iris.data
y = iris.target# 訓練模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)# 1. 特征重要性
importances = rf.feature_importances_
plt.barh(iris.feature_names, importances)
plt.title("Random Forest Feature Importance")
plt.tight_layout()
plt.show()
-
SHAP值分析
# 2. SHAP值分析
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X[:100]) # 計算前100個樣本的SHAP值shap.summary_plot(sh