✨ 欢迎关注 ✨
本节介绍: Eli5解释:通过随机打乱特征评估其对模型性能的重要性 。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式
。 购买前请咨询,避免不必要的问题。
✨ Eli5介绍 ✨
Eli5是一个用于解释机器学习模型的Python库,旨在通过可视化和简洁的方式帮助理解模型的决策过程,特别是对于黑箱模型(如随机森林、梯度提升机、神经网络等)。它提供了多种方法来解释和展示模型的内部机制,尤其适用于模型特征的重要性分析、预测结果的解释等,主要功能包含:特征重要性评估、模型解释、文本和图像解释,这里主要介绍 Permutation Importance 方法,通过打乱特征值来评估每个特征对模型性能的贡献。它可以用于任何监督学习模型,通过评估特征在不同数据集上的表现变化来显示其重要性
✨ 代码实现 ✨
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
# 忽略所有警告
warnings.filterwarnings("ignore")
df = pd.read_excel('2025-7-13-公众号Python机器学习AI.xlsx')
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['Outcome'], axis=1)
y = df['Outcome']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.3,
random_state=42,
stratify=df['Outcome']
)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 初始化随机森林分类模型
model_rf = RandomForestClassifier(random_state=42, verbose= -1)
param_grid_rf = {
'n_estimators': [50, 100, 200], # 树的数量
'max_depth': [10, 20, None], # 最大深度
'min_samples_split': [2, 5, 10], # 分割节点的最小样本数
'min_samples_leaf': [1, 2, 4], # 叶节点的最小样本数
'verbose': [True, False]
}
# 使用 GridSearchCV 进行网格搜索和 k 折交叉验证
grid_search_rf = GridSearchCV(
estimator=model_rf,
param_grid=param_grid_rf,
scoring='neg_log_loss', # 评价指标为负对数损失
cv=5, # 5 折交叉验证
n_jobs=-1, # 并行计算
verbose=1 # 输出详细进度信息
)
# 训练模型
grid_search_rf.fit(X_train, y_train)
# 使用最优参数训练模型
best_model_rf = grid_search_rf.best_estimator_
from sklearn.tree import export_graphviz
from subprocess import call
from IPython.display import Image
# 选择随机森林模型的第一棵树
estimator = best_model_rf.estimators_[1]
# 获取特征名称
feature_names = [i for i in X_train.columns]
# 将目标变量转换为字符串标签
y_train_str = y_train.astype('str')
y_train_str[y_train_str == '0'] = 'no disease'
y_train_str[y_train_str == '1'] = 'disease'
y_train_str = y_train_str.values
export_graphviz(estimator, out_file='tree.dot',
feature_names=feature_names,
class_names=y_train_str,
rounded=True, proportion=True,
label='root',
precision=2, filled=True)
这里训练了一个随机森林分类模型,使用网格搜索优化超参数,并将最优模型中的一棵决策树进行可视化
由于本身树过于复杂这里解释局部,通过不同的特征来判断是否患有疾病,这部分决策树通过Age(年龄)、Insulin(胰岛素)、Glucose(血糖)和Pregnancies(怀孕次数)等特征来预测是否患有疾病。首先,树根据Age <= 42.5进行分裂,若满足此条件,再通过Insulin <= 153.5分裂,预测结果为'disease',准确率为 78.8%。若Age> 42.5,则继续根据Age <= 53.5分裂,最终预测为'no disease',准确率为21.2%。树的分裂层次展示每个特征对预测结果的影响,每个叶节点还给出了相应的类别概率,其它节点类似一直到遍历完所有节点得出最终结果
# 获取特征重要性
feature_importance = best_model_rf.feature_importances_
# 将特征重要性与特征名称进行匹配
feature_importance_df = pd.DataFrame({
'Feature': X_train.columns,
'Importance': feature_importance
})
# 按重要性排序
feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)
feature_importance_df
这里通过best_model_rf.feature_importances_ 获取训练好的随机森林模型的特征重要性,但是这个贡献度并不是直接针对模型性能,并不知道特征如何影响模型性能如模型准确率等
import eli5
from eli5.sklearn import PermutationImportance
# 创建一个 PermutationImportance 实例并拟合模型
# PermutationImportance 是一种模型解释工具,能够通过随机打乱特征值来评估每个特征对模型性能的贡献
# 这里,model 是已训练好的机器学习模型,x_test 和 y_test 是用于评估模型性能的测试数据和标签
# n_ite迭代多少次
perm = PermutationImportance(best_model_rf, n_iter=20 , scoring='accuracy',random_state = 1314).fit(X_test, y_test)
# 使用 eli5 显示特征的重要性
# 该函数将展示每个特征的贡献度,通过打乱每个特征并观察性能下降的幅度来计算每个特征的重要性
weights = eli5.show_weights(perm, feature_names=X_train.columns.tolist())
weights
这里使用 PermutationImportance 方法通过随机打乱特征值来评估每个特征对模型准确度的贡献,显示各特征对模型性能的重要性,结果表明不同特征的贡献度和标准差(std)
PermutationImportance和feature_importances_ 都是评估特征重要性的方法,但它们的侧重点不同。PermutationImportance通过打乱特征值并观察模型性能的变化来评估特征对模型预测能力的贡献,它直接反映特征对模型性能的影响(如这里的scoring='accuracy')。而feature_importances_ 反映的是特征在模型训练过程中的分裂贡献,更多关注特征在构建模型时的作用
PermutationImportance可能更适合用于特征选择,尤其是关注如何通过特征优化提升模型性能时,因为往往特征筛选结合特征排名进行递归
plot_df = feature_importances.iloc[::-1]
# 根据权重的正负创建颜色列表
colors = ['tomato' if x < 0 else 'steelblue' for x in plot_df['Weight']]
fig, ax = plt.subplots(figsize=(10, 8))
# 绘制水平柱状图,并添加误差条
ax.barh(
plot_df.index,
plot_df['Weight'],
xerr=plot_df['std'],
color=colors,
align='center',
capsize=5 # 给误差条添加一个帽子,让它更清晰
)
ax.set_xlabel('Weight', fontsize=12)
# 在 x=0 的位置画一条垂直虚线,用于清晰地区分正负权重
ax.axvline(0, color='gray', linestyle='--', linewidth=1)
# 优化布局
plt.tight_layout()
plt.show()
最后可视化特征权重(Weight)及其标准误差(std)
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!
往期推荐
期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式
期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能
期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示
期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析
期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化
期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比
Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响
多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考