一区IF6.2期刊复现①:LightGBM特征重要性及部分依赖分析进行模型解读

机器学习算法大数据

picture.image

✨ 欢迎关注 ✨

本节介绍: LightGBM特征重要性及部分依赖分析进行模型解读 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。 获取 前请咨询,避免不必要的问题。

✨ 文献信息 ✨

picture.image

今天复现的文章是群友的一篇研究,如何使用机器学习方法来揭示PFAS暴露与糖尿病的关联分析,接下来解读一下各部分以及代码实现

picture.image

首先对12种机器学习(ML)模型进行比较,包括随机森林(RF)、支持向量机(SVM)、决策树(DT)、梯度提升(GB)、k-近邻(KNN)、多层感知器(MLP)、AdaBoost(AB)、投票分类器(VC)、LightGBM(LGB)、CatBoost(CB)、Extra Trees(ET)和XGBoost(XGB)。通过比较AUC、准确率、敏感性和特异性等多个评估指标,LightGBM模型表现最佳(AUC=0.84,准确率=73%),因此选择了它作为最优模型,并进行后续分析

picture.image

其次,在LGB模型中的特征重要性分析中,通过计算特征重要性,发现PFOA是最关键的PFAS物质,对糖尿病风险的预测具有重要影响。特征分析结果还展示了其他变量如BMI、年龄、种族等也对模型预测起到了重要作用

picture.image

picture.image

在LGB模型中的偏相关分析中,图3展示了PFAS变量的部分依赖图(PDP),分析了它们对糖尿病(DM)风险的影响。PFOA与DM风险呈负相关,高浓度时风险较低;PFDE也呈轻微负相关。相反,PFOS和PFNA与DM风险呈正相关,且PFOS在高浓度下略有下降,PFNA在低浓度下呈轻微负相关。MPAH与DM风险轻微正相关,PFHxS在低浓度时正相关,但在中高浓度下保持稳定,而PFUA无显著关系。为了探讨PFOA与其他PFAS的协同效应,生成了2D部分依赖图,发现低浓度时PFOA与其他PFAS呈轻微协同效应,随着浓度升高,PFOA的保护作用愈加明显,而PFUA和PFHxS几乎无协同效应,DM风险保持稳定

接下来通过代码实现这一过程,展示如何使用LightGBM模型进行 特征重要性及部分依赖分析, 文献后部分还涉及SHAP分析,将在下一篇推文中详细讲解,帮助大家进一步了解如何使用SHAP方法解释模型预测结果

✨ 基础代码 ✨

  
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-2-公众号Python机器学习AI.xlsx')  
df.head()

picture.image

导入模拟数据集,这是一个简单的糖尿病预测数据集,包含了多个特征(如怀孕次数、血糖、血压等),其中的目标变量是Outcome,表示是否患有糖尿病(1表示患病,0表示未患病)

  
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 lightgbm import LGBMClassifier  
from sklearn.model_selection import GridSearchCV  
# 初始化 LightGBM 分类模型  
model_lgbm = LGBMClassifier(random_state=42, verbose= -1)  
  
# 定义参数网格  
param_grid_lgbm = {  
    'n_estimators': [50, 100, 200],       # 树的数量  
    'learning_rate': [0.01, 0.1, 0.2],   # 学习率  
    'max_depth': [-1, 10, 20],           # 最大深度  
    'num_leaves': [31, 50, 100],         # 叶节点数  
    'min_child_samples': [10, 20, 30]    # 最小叶节点样本数  
}  
  
# 使用 GridSearchCV 进行网格搜索和 k 折交叉验证  
grid_search_lgbm = GridSearchCV(  
    estimator=model_lgbm,  
    param_grid=param_grid_lgbm,  
    scoring='neg_log_loss',  # 评价指标为负对数损失  
    cv=5,                    # 5 折交叉验证  
    n_jobs=-1,               # 并行计算  
    verbose=1                # 输出详细进度信息  
)  
  
# 训练模型  
grid_search_lgbm.fit(X_train, y_train)  
  
# 使用最优参数训练模型  
best_model_lgbm = grid_search_lgbm.best_estimator_

使用LightGBM分类器进行训练,并通过GridSearchCV进行超参数调优,优化后的模型被用于训练。这里选择LGBM模型是因为文献中其表现最佳,但实际应用中应进行多模型比较,选择最适合当前数据的模型,而非仅依赖单一模型,不同数据集不同模型的表现期刊不一

  
from sklearn.metrics import roc_auc_score, accuracy_score, recall_score, confusion_matrix  
  
# 在训练集和测试集上的预测  
y_train_pred = best_model_lgbm.predict(X_train)  
y_test_pred = best_model_lgbm.predict(X_test)  
  
# 计算 AUC(Area Under the Curve)  
y_train_prob = best_model_lgbm.predict_proba(X_train)[:, 1]  # 获取正类的预测概率  
y_test_prob = best_model_lgbm.predict_proba(X_test)[:, 1]  
  
auc_train = roc_auc_score(y_train, y_train_prob)  # 训练集 AUC  
auc_test = roc_auc_score(y_test, y_test_prob)  # 测试集 AUC  
  
# 计算准确率  
accuracy_train = accuracy_score(y_train, y_train_pred)  # 训练集准确率  
accuracy_test = accuracy_score(y_test, y_test_pred)  # 测试集准确率  
  
# 计算灵敏度(召回率)  
sensitivity_train = recall_score(y_train, y_train_pred)  # 训练集灵敏度  
sensitivity_test = recall_score(y_test, y_test_pred)  # 测试集灵敏度  
  
# 计算特异性(True Negative Rate)  
cm_train = confusion_matrix(y_train, y_train_pred)  # 训练集的混淆矩阵  
cm_test = confusion_matrix(y_test, y_test_pred)  # 测试集的混淆矩阵  
  
# 提取混淆矩阵中的元素:TN(真负),FP(假正),FN(假负),TP(真正)  
TN_train, FP_train, FN_train, TP_train = cm_train.ravel()  
TN_test, FP_test, FN_test, TP_test = cm_test.ravel()  
  
# 计算特异性  
specificity_train = TN_train / (TN_train + FP_train)  # 训练集特异性  
specificity_test = TN_test / (TN_test + FP_test)  # 测试集特异性  
  
# 打印所有指标的值  
print("训练集指标:")  
print(f"AUC: {auc_train:.4f}")  
print(f"准确率: {accuracy_train:.4f}")  
print(f"灵敏度: {sensitivity_train:.4f}")  
print(f"特异性: {specificity_train:.4f}")  
  
print("\n测试集指标:")  
print(f"AUC: {auc_test:.4f}")  
print(f"准确率: {accuracy_test:.4f}")  
print(f"灵敏度: {sensitivity_test:.4f}")  
print(f"特异性: {specificity_test:.4f}")

计算训练集和测试集上LightGBM模型的多个评估指标,包括AUC、准确率、灵敏度和特异性,用于评估模型的分类性能

  
训练集指标:  
AUC: 0.9275  
准确率: 0.8454  
灵敏度: 0.7112  
特异性: 0.9171  
测试集指标:  
AUC: 0.8440  
准确率: 0.7835  
灵敏度: 0.5679

在训练集上,LightGBM模型表现良好,AUC为0.9275,准确率为0.8454,灵敏度为0.7112,特异性为0.9171。测试集上,模型的AUC为0.8440,准确率为0.7835,灵敏度下降至0.5679,表明模型在新数据上的表现略有下降,尤其是在召回率(灵敏度)上

  
from sklearn.metrics import roc_curve  
# 计算训练集和测试集的假阳性率 (FPR) 和真正性率 (TPR)  
fpr_train, tpr_train, _ = roc_curve(y_train, y_train_prob)  
fpr_test, tpr_test, _ = roc_curve(y_test, y_test_prob)  
plt.figure(figsize=(8, 6))  
# 绘制随机分类的参考线(对角线)  
plt.plot([0, 1], [0, 1], 'r--', linewidth=1.5, alpha=0.8)  
# 绘制训练集和测试集的ROC曲线  
plt.plot(fpr_train, tpr_train, label=f"Train Set ROC (AUC = {auc_train:.4f})", color='b', linewidth=2)  
plt.plot(fpr_test, tpr_test, label=f"Test Set ROC (AUC = {auc_test:.4f})", color='g', linewidth=2)  
# 图形细节设置  
plt.title("LightGBM", fontsize=16, fontweight="bold")  
plt.xlabel("False Positive Rate (1-Specificity)", fontsize=18)  
plt.ylabel("True Positive Rate (Sensitivity)", fontsize=18)  
plt.xticks(fontsize=16)  
plt.yticks(fontsize=16)  
plt.legend(loc="lower right", fontsize=12)  
# 关闭网格线  
plt.grid(False)  
plt.tight_layout()  
plt.savefig("roc_curve_comparison.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

最后绘制LightGBM模型在训练集和测试集上的ROC曲线,并计每个集的AUC值,通过比较训练集(蓝色)和测试集(绿色)的曲线,展示模型在两者上的分类性能

  
# 获取特征重要性  
importances = best_model_lgbm.feature_importances_  
# 获取特征名  
feature_names = X_train.columns  
# 创建一个包含特征名和特征重要性的DataFrame  
feature_importance_df = pd.DataFrame({  
    'feature': feature_names,  
    'importance': importances  
})  
# 根据重要性排序  
feature_importance_df = feature_importance_df.sort_values(by='importance', ascending=True)  
# 选择排名前10的特征  
top_10_features = feature_importance_df.head(10)  
# 绘制柱状图  
plt.figure(figsize=(10, 6))  
plt.barh(top_10_features['feature'], top_10_features['importance'], color='#4682B4')  
plt.xlabel('Importance', fontsize=14)  
plt.title('Top 10 Sorted Feature lmportance', fontsize=16)  
plt.xticks(fontsize=13)  
plt.yticks(fontsize=14)  
plt.tight_layout()  
plt.savefig("Top 10 Sorted Feature lmportance.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

通过LightGBM模型计算特征重要性,并绘制前10个特征的重要性柱状图。虽然标题显示为前10个特征,但实际数据集仅包含8个特征,因此只显示了这8个特征的排序

  
plot\_partial\_dependence(best\_model\_lgbm, X\_test, 'Age')

picture.image

plot_partial_dependence是一个自定义函数,用于绘制单个或多个特征的偏依赖图(PDP)在一个画布上,展示特征对模型预测结果的影响,并包括个体曲线和平滑曲线

  
# 调用函数,绘制所有特征  
plot_partial_dependence_subplot(best_model_lgbm, X_test, ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',  
       'BMI', 'DiabetesPedigreeFunction', 'Age'], cols=3)

picture.image

plot_partial_dependence_subplot是一个自定义函数,用于在一个画布上绘制多个特征的偏依赖图(PDP),并通过子图展示每个特征对模型预测结果的影响

  
from sklearn.inspection import PartialDependenceDisplay  
# 选择两个特征绘制2D PDP  
features = ['Age', 'Glucose']  
  
# 使用 contour_kw 参数绘制2D PDP  
fig, ax = plt.subplots(figsize=(8, 6))  
PartialDependenceDisplay.from_estimator(  
    best_model_lgbm,  
    X_test,  
    features=[features],  
    kind='average',  
    grid_resolution=50,  
    contour_kw={'cmap': 'viridis', 'alpha': 0.8},  
    ax=ax  
)  
plt.savefig("PAge-Glucose.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

直接使用sklearn的PartialDependenceDisplay绘制Age和Glucose两个特征的2D偏依赖图(PDP),并通过等高线图展示它们对模型预测的平均影响

  
# 定义特征列表  
features = ['Pregnancies', 'Glucose', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction']  
base_feature = 'Age'  
  
# 创建一个2x3的画布  
fig, axs = plt.subplots(2, 3, figsize=(18, 12))  
  
# 展开axs为一个列表,方便在循环中使用  
axs = axs.ravel()  
  
# 循环绘制每一对特征的2D PDP  
for i, feature in enumerate(features):  
    # 使用 PartialDependenceDisplay 绘制2D PDP  
    PartialDependenceDisplay.from_estimator(  
        best_model_lgbm,  
        X_test,  
        features=[[base_feature, feature]],  # 每次绘制 Age 和另一个特征的2D PDP  
        kind='average',  
        grid_resolution=50,  
        contour_kw={'cmap': 'viridis', 'alpha': 0.8},  
        ax=axs[i]  # 将每个子图绘制到对应的ax上  
    )  
    axs[i].set_xlabel(base_feature, fontsize=15)  
    axs[i].set_ylabel(feature, fontsize=15)  
  
# 调整布局  
plt.tight_layout()  
plt.savefig("Age_vs_Other_Features_2D_PDPs.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

绘制Age与其他特征(如Pregnancies、Glucose等)之间的2D偏依赖图(PDP),并将每一对特征的图展示在一个2x3的子图中。读者可以根据自己的研究方向,选择并修改特征列表,以绘制不同特征之间的2D PDP,从而更好地分析特征对模型预测的影响

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!

往期推荐

期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式

期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能

期刊配图:SHAP模型解释多种特征重要性柱状图可视化解析

期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示

期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析

期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化

期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比

Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响

多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论