用SHAP进行多模型解释性分析:类别与数值预测案例
shap分析代码案例,多个机器学习模型+shap解释性分析的案例,做好的多个模型和完整的shap分析拿去直接运行,含模型之间的比较评估。 类别预测和数值预测的案例代码都有,类别预测用到的6个模型是(catboost、xgboost、knn、logistic、bayes,svc),数值预测用到的6个模型是(线性回归、随机森林、xgboost、lightgbm、支持向量机、knn)
在机器学习领域,模型的可解释性变得越来越重要。SHAP(SHapley Additive exPlanations)是一种强大的工具,能帮助我们理解模型的预测过程。今天就来分享多个机器学习模型结合SHAP进行解释性分析的案例,涵盖类别预测和数值预测。
类别预测案例
1. 准备数据与必要库
我们先导入所需的库,并准备数据集。这里假设使用的是经典的鸢尾花数据集。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import shap
import numpy as np
import catboost as cb
import xgboost as xgb
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 构建与训练模型
CatBoost
cat_model = cb.CatBoostClassifier(iterations = 100, learning_rate = 0.1, depth = 6)
cat_model.fit(X_train, y_train, eval_set=(X_test, y_test), use_best_model=True, early_stopping_rounds=10)
y_pred_cat = cat_model.predict(X_test)
cat_accuracy = accuracy_score(y_test, y_pred_cat)
print(f'CatBoost模型准确率: {cat_accuracy}')
这里我们初始化了一个CatBoost分类器,设置了迭代次数、学习率和树的深度等参数。在训练过程中,使用验证集来评估模型性能,并且启用了早停机制,避免过拟合。
XGBoost
xgb_model = xgb.XGBClassifier(n_estimators = 100, max_depth = 6, learning_rate = 0.1)
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)
xgb_accuracy = accuracy_score(y_test, y_pred_xgb)
print(f'XGBoost模型准确率: {xgb_accuracy}')
XGBoost同样是一个强大的梯度提升框架,这里我们设置了树的数量、最大深度和学习率,训练后得到预测结果并计算准确率。
KNN
knn_model = KNeighborsClassifier(n_neighbors = 5)
knn_model.fit(X_train, y_train)
y_pred_knn = knn_model.predict(X_test)
knn_accuracy = accuracy_score(y_test, y_pred_knn)
print(f'KNN模型准确率: {knn_accuracy}')
KNN是基于邻居投票的简单模型,这里我们设置邻居数量为5,然后训练并评估。
Logistic Regression
logistic_model = LogisticRegression()
logistic_model.fit(X_train, y_train)
y_pred_logistic = logistic_model.predict(X_test)
logistic_accuracy = accuracy_score(y_test, y_pred_logistic)
print(f'逻辑回归模型准确率: {logistic_accuracy}')
逻辑回归是经典的线性分类模型,默认参数训练并评估其性能。
Gaussian Naive Bayes
bayes_model = GaussianNB()
bayes_model.fit(X_train, y_train)
y_pred_bayes = bayes_model.predict(X_test)
bayes_accuracy = accuracy_score(y_test, y_pred_bayes)
print(f'高斯朴素贝叶斯模型准确率: {bayes_accuracy}')
高斯朴素贝叶斯基于贝叶斯定理和特征的高斯分布假设进行分类。
SVC
svc_model = SVC(kernel='rbf')
svc_model.fit(X_train, y_train)
y_pred_svc = svc_model.predict(X_test)
svc_accuracy = accuracy_score(y_test, y_pred_svc)
print(f'SVC模型准确率: {svc_accuracy}')
支持向量机通过寻找最优超平面来进行分类,这里使用径向基函数(RBF)核。
3. SHAP分析
# CatBoost SHAP分析
explainer_cat = shap.Explainer(cat_model)
shap_values_cat = explainer_cat(X_test)
shap.summary_plot(shap_values_cat, X_test, plot_type="bar")
# XGBoost SHAP分析
explainer_xgb = shap.Explainer(xgb_model)
shap_values_xgb = explainer_xgb(X_test)
shap.summary_plot(shap_values_xgb, X_test, plot_type="bar")
# 其他模型类似...
对于每个模型,我们创建一个SHAP的解释器(Explainer),它会根据模型和数据计算出SHAP值。然后使用summary_plot展示特征的重要性,水平条形图可以直观地看出每个特征对预测结果的影响程度。
数值预测案例
1. 数据准备与库导入
这次我们假设使用波士顿房价数据集进行数值预测。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import pandas as pd
import shap
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
import lightgbm as lgb
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 构建与训练模型
线性回归
linear_model = LinearRegression()
linear_model.fit(X_train, y_train)
y_pred_linear = linear_model.predict(X_test)
linear_mse = mean_squared_error(y_test, y_pred_linear)
print(f'线性回归模型MSE: {linear_mse}')
线性回归通过最小化预测值与真实值之间的平方误差和来拟合数据。
随机森林
rf_model = RandomForestRegressor(n_estimators = 100)
rf_model.fit(X_train, y_train)
y_pred_rf = rf_model.predict(X_test)
rf_mse = mean_squared_error(y_test, y_pred_rf)
print(f'随机森林模型MSE: {rf_mse}')
随机森林由多个决策树组成,通过平均树的预测结果来进行回归。
XGBoost回归
xgb_reg_model = xgb.XGBRegressor(n_estimators = 100, max_depth = 6, learning_rate = 0.1)
xgb_reg_model.fit(X_train, y_train)
y_pred_xgb_reg = xgb_reg_model.predict(X_test)
xgb_reg_mse = mean_squared_error(y_test, y_pred_xgb_reg)
print(f'XGBoost回归模型MSE: {xgb_reg_mse}')
与分类的XGBoost类似,这里用于回归任务,设置了相关参数并训练评估。
LightGBM
lgb_model = lgb.LGBMRegressor(n_estimators = 100, max_depth = 6, learning_rate = 0.1)
lgb_model.fit(X_train, y_train)
y_pred_lgb = lgb_model.predict(X_test)
lgb_mse = mean_squared_error(y_test, y_pred_lgb)
print(f'LightGBM模型MSE: {lgb_mse}')
LightGBM是快速高效的梯度提升框架,这里用于回归。
支持向量机回归
svr_model = SVR(kernel='rbf')
svr_model.fit(X_train, y_train)
y_pred_svr = svr_model.predict(X_test)
svr_mse = mean_squared_error(y_test, y_pred_svr)
print(f'SVR模型MSE: {svr_mse}')
支持向量机用于回归任务,这里同样使用RBF核。
KNN回归
knn_reg_model = KNeighborsRegressor(n_neighbors = 5)
knn_reg_model.fit(X_train, y_train)
y_pred_knn_reg = knn_reg_model.predict(X_test)
knn_reg_mse = mean_squared_error(y_test, y_pred_knn_reg)
print(f'KNN回归模型MSE: {knn_reg_mse}')
KNN用于回归时,根据邻居样本的均值来预测目标值。
3. SHAP分析
# 线性回归SHAP分析
explainer_linear = shap.Explainer(linear_model)
shap_values_linear = explainer_linear(X_test)
shap.summary_plot(shap_values_linear, X_test, plot_type="bar")
# 随机森林SHAP分析
explainer_rf = shap.Explainer(rf_model)
shap_values_rf = explainer_rf(X_test)
shap.summary_plot(shap_values_rf, X_test, plot_type="bar")
# 其他模型类似...
同样为每个回归模型创建SHAP解释器,计算SHAP值并可视化特征重要性。
模型比较评估
类别预测模型
我们可以将各个类别预测模型的准确率放在一个表格中进行直观比较:
| 模型 | 准确率 |
|---|---|
| CatBoost | {cat_accuracy} |
| XGBoost | {xgb_accuracy} |
| KNN | {knn_accuracy} |
| 逻辑回归 | {logistic_accuracy} |
| 高斯朴素贝叶斯 | {bayes_accuracy} |
| SVC | {svc_accuracy} |
通过比较可以看出不同模型在该数据集上的性能差异,同时结合SHAP分析可以了解模型预测依赖的关键特征。
数值预测模型
对于数值预测模型,我们比较它们的均方误差(MSE):
| 模型 | MSE |
|---|---|
| 线性回归 | {linear_mse} |
| 随机森林 | {rf_mse} |
| XGBoost回归 | {xgbregmse} |
| LightGBM | {lgb_mse} |
| SVR | {svr_mse} |
| KNN回归 | {knnregmse} |
较低的MSE表示模型预测值与真实值更接近,性能更好。结合SHAP分析,我们能深入了解每个特征对房价预测的贡献。

shap分析代码案例,多个机器学习模型+shap解释性分析的案例,做好的多个模型和完整的shap分析拿去直接运行,含模型之间的比较评估。 类别预测和数值预测的案例代码都有,类别预测用到的6个模型是(catboost、xgboost、knn、logistic、bayes,svc),数值预测用到的6个模型是(线性回归、随机森林、xgboost、lightgbm、支持向量机、knn)
希望这些案例能帮助你更好地理解多个机器学习模型以及SHAP在模型解释性方面的应用,在实际项目中灵活运用这些方法,提高模型的可解释性和性能。

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)