前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于集成学习的用户流失预测并利用shap进行特征解释

基于集成学习的用户流失预测并利用shap进行特征解释

作者头像
HsuHeinrich
发布于 2023-03-29 06:00:59
发布于 2023-03-29 06:00:59
81700
代码可运行
举报
文章被收录于专栏:HsuHeinrichHsuHeinrich
运行总次数:0
代码可运行

基于集成学习的用户流失预测并利用shap进行特征解释

小P:小H,如果我只想尽可能的提高准确率,有什么好的办法吗? 小H:优化数据、调参侠、集成学习都可以啊 小P:什么是集成学习啊,听起来就很厉害的样子 小H:集成学习就类似于【三个臭皮匠顶个诸葛亮】,将一些基础模型组合起来使用,以期得到更好的结果

集成学习实战

数据准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
import warnings
warnings.filterwarnings('ignore')

from scipy import stats
from sklearn.preprocessing import StandardScaler
from imblearn.over_sampling import SMOTE 
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV, KFold
from sklearn.feature_selection import RFE 
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, VotingClassifier, ExtraTreesClassifier
import xgboost as xgb
from sklearn.metrics import accuracy_score, auc, confusion_matrix, f1_score, \
    precision_score, recall_score, roc_curve  # 导入指标库
import prettytable
import sweetviz as sv # 自动eda
import toad 
from sklearn.model_selection import StratifiedKFold, cross_val_score  # 导入交叉检验算法

# 绘图初始化
%matplotlib inline
pd.set_option('display.max_columns', None) # 显示所有列
sns.set(style="ticks")
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

# 导入自定义模块
import sys
sys.path.append("/Users/heinrich/Desktop/Heinrich-blog/数据分析使用手册")
from keyIndicatorMapping import *

上述自定义模块keyIndicatorMapping如果有需要的同学可关注公众号HsuHeinrich,回复【数据挖掘-自定义函数】自动获取~

以下数据如果有需要的同学可关注公众号HsuHeinrich,回复【数据挖掘-集成学习】自动获取~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 读取数据
raw_data = pd.read_csv('classification.csv')
raw_data.head()

image-20230206151936701

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 缺失值填充,SMOTE方法限制非空
raw_data=raw_data.fillna(raw_data.mean())
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 数据集分割
X = raw_data[raw_data.columns.drop('churn')]
y = raw_data['churn']
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 标准化
scaler = StandardScaler() 
scale_data = scaler.fit_transform(X)  
X = pd.DataFrame(scale_data, columns = X.columns)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=.3, random_state=0)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 过采样
model_smote = SMOTE(random_state=0)  # 建立SMOTE模型对象
X_train, y_train = model_smote.fit_resample(X_train, y_train) 

模型对比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%time
# 初选分类模型
model_names = ['LR', 'SVC', 'RFC', 'XGBC']  # 不同模型的名称列表
model_lr = LogisticRegression(random_state=10) # 建立逻辑回归对象
model_svc = SVC(random_state=0, probability=True) # 建立支持向量机分类对象
model_rfc = RandomForestClassifier(random_state=10) # 建立随机森林分类对象
model_xgbc = xgb.XGBClassifier(use_label_encoder=False, eval_metric='auc', random_state=10) # 建立XGBC对象

# 模型拟合结果
model_list = [model_lr, model_svc, model_rfc, model_xgbc]  # 不同分类模型对象的集合
pre_y_list = [model.fit(X_train, y_train).predict(X_test) for model in model_list]  # 各个回归模型预测的y值列表
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CPU times: user 2.49 s, sys: 125 ms, total: 2.62 s
Wall time: 843 ms
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 核心评估指标
metrics_dic = {
                'model_names':[],
                'auc':[],
                'ks':[],
                'accuracy':[],
                'precision':[],
                'recall':[],
                'f1':[]
            }
for model_name, model, pre_y in zip(model_names, model_list, pre_y_list):
    y_prob = model.predict_proba(X_test)  # 获得决策树的预测概率,返回各标签(即01)的概率
    fpr, tpr, thres = roc_curve(y_test, y_prob[:, 1])  # ROC y_score[:, 1]取标签为1的概率,这样画出来的roc曲线为正
    metrics_dic['model_names'].append(model_name)
    metrics_dic['auc'].append(auc(fpr, tpr))  # AUC
    metrics_dic['ks'].append(max(tpr - fpr)) # KS值
    metrics_dic['accuracy'].append(accuracy_score(y_test, pre_y))
    metrics_dic['precision'].append(precision_score(y_test, pre_y))
    metrics_dic['recall'].append(recall_score(y_test, pre_y))
    metrics_dic['f1'].append(f1_score(y_test, pre_y))
pd.DataFrame(metrics_dic)

image-20230206152007352

集成学习

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%time
# 建立组合评估器列表 均衡稳定性和准确性 这里只是演示,就将所有模型都纳入了
estimators = [('SVC', model_svc), ('RFC', model_rfc), ('XGBC', model_xgbc), ('LR', model_lr)]  
model_vot = VotingClassifier(estimators=estimators, voting='soft', weights=[1.1, 1.1, 0.9, 1.2],
                             n_jobs=-1)  # 建立组合评估模型
cv = StratifiedKFold(5)  # 设置交叉检验方法 分类算法常用交叉检验方法
cv_score = cross_val_score(model_vot, X_train, y_train, cv=cv, scoring='accuracy')  # 交叉检验
print('{:*^60}'.format('Cross val scores:'),'\n',cv_score) # 打印每次交叉检验得分
print('Mean scores is: %.2f' % cv_score.mean())  # 打印平均交叉检验得分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*********************Cross val scores:********************** 
 [0.73529412 0.7745098  0.85294118 0.85294118 0.87745098]
Mean scores is: 0.82
CPU times: user 2.38 s, sys: 432 ms, total: 2.81 s
Wall time: 5 s
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 模型训练
model_vot.fit(X_train, y_train)  # 模型训练
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
VotingClassifier(estimators=[('SVC', SVC(probability=True, random_state=0)),
                             ('RFC', RandomForestClassifier(random_state=10)),
                             ('XGBC',
                              XGBClassifier(base_score=0.5, booster='gbtree',
                                            colsample_bylevel=1,
                                            colsample_bynode=1,
                                            colsample_bytree=1,
                                            eval_metric='rmse', gamma=0,
                                            gpu_id=-1, importance_type='gain',
                                            interaction_constraints='',
                                            learning_rate=0.300000012,
                                            max...
                                            min_child_weight=1, missing=nan,
                                            monotone_constraints='()',
                                            n_estimators=100, n_jobs=8,
                                            num_parallel_tree=1,
                                            random_state=10, reg_alpha=0,
                                            reg_lambda=1, scale_pos_weight=1,
                                            subsample=1, tree_method='exact',
                                            use_label_encoder=False,
                                            validate_parameters=1,
                                            verbosity=None)),
                             ('LR', LogisticRegression(random_state=10))],
                 n_jobs=-1, voting='soft', weights=[1.1, 1.1, 0.9, 1.2])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model_confusion_metrics(model_vot, X_test, y_test, 'test')
model_core_metrics(model_vot, X_test, y_test, 'test')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
confusion matrix for test
 +----------+--------------+--------------+
|          | prediction-0 | prediction-1 |
+----------+--------------+--------------+
| actual-0 |      53      |      31      |
| actual-1 |      37      |     179      |
+----------+--------------+--------------+
core metrics for test
 +-------+----------+-----------+--------+-------+-------+
|  auc  | accuracy | precision | recall |   f1  |   ks  |
+-------+----------+-----------+--------+-------+-------+
| 0.805 |  0.773   |   0.589   | 0.631  | 0.609 | 0.504 |
+-------+----------+-----------+--------+-------+-------+

可以看到集成学习的各项指标表现均优异,只有召回率低于LR

利用shap进行模型解释

shap作为一种经典的事后解释框架,可以对每一个样本中的每一个特征变量,计算出其重要性值,达到解释的效果。该值在shap中被专门称为Shapley Value。

该系列以应用为主,对于具体的理论只会简单的介绍它的用途和使用场景。这里的shap相关知识 可以参考黑盒模型事后归因解析:SHAP方法[1]SHAP知识点全汇总[2] 学无止境,且学且珍惜~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# pip install shap
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import shap   
# 初始化
shap.initjs()  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过采样提高计算效率,但会导致准确率降低。表现在base_value与mean(model.predict_proba(X))存在差异,不建议K太小
# X_test_summary = shap.sample(X_test, 200)
# X_test_summary = shap.kmeans(X_test, 150)
explainer = shap.KernelExplainer(model_vot.predict_proba, X_test)
shap_values = explainer.shap_values(X_test, nsamples = 10)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Using 300 background data samples could cause slower run times. Consider using shap.sample(data, K) or shap.kmeans(data, K) to summarize the background as K samples.
  • 单样本查看
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 单样本查看-1概率较高的样本 # 208
shap.force_plot(base_value=explainer.expected_value[1],
                shap_values=shap_values[1][208],
                features = X_test.iloc[208,:]
               )

image-20221221175309941

  • base_value:所有样本预测值的均值,即base_value=model_vot.predict_proba(X_test)[:,1].mean() ⚠️注意:当进行采样或者kmean加速计算时,会损失一定准确度。即explainer带入的是X_test_summary
  • f(x):预测的实际值model_vot.predict_proba(X_test)[:,1]
  • data:样本特征值
  • shap_values:f(x)-base_value;shap值越大越红,越小越蓝

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 验证base_value
print('所有样本预测标签1的概率均值:',model_vot.predict_proba(X_test)[:,1].mean())
print('base_value:',explainer.expected_value[1])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
所有样本预测标签1的概率均值:0.3519852365700774
base_value: 0.35198523657007774

经验证,base_value计算逻辑正确

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 验证单一样本
i=208
fx=model_vot.predict_proba(X_test)[:,1][i]
da=X_test.iloc[i,:]
sv=fx-explainer.expected_value[1]
sv_val=shap_values[1][i].sum()
print('f(x):',fx)
print('shap_values:',sv,sv_val)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f(x): 0.9264517406651224
shap_values: 0.5744665040950446 0.5744665040950446

经验证,shap_values计算逻辑正确

  • 特征重要性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 特征重要程度
shap.summary_plot(shap_values[1],X_test,max_display=10,plot_type="bar")
  • 蜂窝图体现特征重要性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 特征与样本蜂窝图
shap.summary_plot(shap_values[1],X_test,max_display=10)

output_38_0

retention_days越大,蓝色的样本越多,表明较高的retention_days有助于缓减流失

  • 特征的shap值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 单特征预测结果
shap.dependence_plot("retention_days", shap_values[1], X_test, interaction_index=None)

output_41_0

retention_days低的shape值较大,上面讲到shap越大越红,对于y起到提高作用。即retention_days与流失负相关

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 双特征交叉影响
shap.dependence_plot("retention_days", shap_values[1], X_test, interaction_index='level')

output_43_0

  • 在较低的retention_days(如-1.5),高level(level=1.0)的shepae值较高(红色点),在0.2附近
  • 在较高的retention_days(如1.5),高level(level=1.0)的shepae值较低(红色点),在-0.2附近

总结

集成学习能有效地提高模型的预测性能,但是使得模型内部结构更为复杂,无法直观理解。好在可以借助shap进行常见的特征重要性解释等。

共勉~

参考资料

[1]

黑盒模型事后归因解析:SHAP方法: https://cloud.tencent.com/developer/news/624937

[2]

SHAP知识点全汇总: https://zhuanlan.zhihu.com/p/85791430

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HsuHeinrich 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
机器学习可解释性神器shap入门
shap(SHapley Additive exPlanations)是一个用于解释机器学习模型输出的模型解释包。
皮大大
2023/11/09
11.6K0
教你用Python解决非平衡数据问题(附代码)
本文为你分享数据挖掘中常见的非平衡数据的处理,内容涉及到非平衡数据的解决方案和原理,以及如何使用Python这个强大的工具实现平衡的转换。
数据派THU
2018/07/30
7300
教你用Python解决非平衡数据问题(附代码)
基于XGBoost的用户流失预测
在日常业务挖掘中,XGBoost具有准确性高、数据友好等优点,可以快速地对历史数据进行训练,数据分析师也往往是基于业务角度去进行数据挖掘,因此特征都是具有业务意义的统计数据,数据质量较高。当然这种逻辑思维也会有一定的缺陷,那就是考虑的特征不全面。
HsuHeinrich
2023/03/29
1.2K0
基于XGBoost的用户流失预测
用 SHAP 可视化解释机器学习模型实用指南(下)
SHAP(Shapley Additive exPlanations) 使用来自博弈论及其相关扩展的经典 Shapley value将最佳信用分配与局部解释联系起来,是一种基于游戏理论上最优的 Shapley value来解释个体预测的方法。
数据STUDIO
2021/10/14
13.2K0
用 SHAP 可视化解释机器学习模型实用指南(下)
探索XGBoost:参数调优与模型解释
XGBoost是一种高效的机器学习算法,广泛应用于数据科学和机器学习任务中。本教程将介绍XGBoost的中级用法,重点关注参数调优和模型解释。我们将使用代码示例来说明这些概念,帮助您更好地理解和应用XGBoost。
Echo_Wish
2024/02/09
6670
使用CatBoost和SHAP进行多分类完整代码示例
CatBoost是顶尖的机器学习模型之一。凭借其梯度增强技术以及内置函数,可以在不做太多工作的情况下生成一些非常好的模型。SHAP (SHapley Additive exPlanation)是旨在解释具有独特视觉效果和性能价值的机器学习模型的输出。CatBoost和SHAP结合在一起构成了一个强大的组合,可以产生一些非常准确并且可以进行解释的结果。
deephub
2023/08/30
8751
使用CatBoost和SHAP进行多分类完整代码示例
机器学习之sklearn基础教程
Scikit-learn(简称sklearn)是Python中最受欢迎的机器学习库之一,它提供了丰富的机器学习算法和数据预处理工具。本文将深入浅出地介绍sklearn的基础概念,核心理论,常见问题和易错点,并给出代码示例。
Jimaks
2024/05/09
2490
【sklearn | 5】:集成学习与模型解释
集成学习通过结合多个基学习器来提高模型的性能和稳定性。常用的集成学习方法包括袋装法(Bagging)、提升法(Boosting)和堆叠法(Stacking)。
颜淡慕潇
2024/07/24
3480
【sklearn | 5】:集成学习与模型解释
SHAP 机器学习模型解释可视化工具
SHAP 是机器学习模型解释可视化工具。在此示例中,使用 SHAP 计算使用 Python 和 scikit-learn 的神经网络的特征影响 。对于这个例子,使用 scikit-learn 的 糖尿病数据集,它是一个回归数据集。首先安装shap库。
润森
2022/09/22
2.9K0
SHAP 机器学习模型解释可视化工具
【机器学习】集成学习——提升模型准确度的秘密武器
集成学习(Ensemble Learning)是一种通过结合多个弱模型来提升整体预测准确性的技术。通过将多个模型的预测结果进行组合,集成学习在复杂任务中展现了极强的泛化能力。本文将探讨集成学习的主要方法,并通过代码示例演示如何应用这些方法来提升模型表现。
Qiuner
2024/10/04
3360
【机器学习】集成学习——提升模型准确度的秘密武器
【机器学习】集成学习代码练习(随机森林、GBDT、XGBoost、LightGBM等)
对比了六大模型,可以看出,逻辑回归速度最快,但准确率最低。而LightGBM,速度快,而且准确率最高,所以,现在处理结构化数据的时候,大部分都是用LightGBM算法。
黄博的机器学习圈子
2023/01/10
6330
深入理解XGBoost:集成学习与堆叠模型
XGBoost是一种强大的集成学习算法,但在解决复杂问题时,单个模型可能无法达到最佳性能。集成学习和堆叠模型是两种有效的方法,可以进一步提高模型的性能。本教程将深入探讨如何在Python中应用集成学习和堆叠模型,使用代码示例详细说明这些概念。
Echo_Wish
2024/02/11
4520
机器学习模型的集成方法总结:Bagging, Boosting, Stacking, Voting, Blending
机器学习是人工智能的一个分支领域,致力于构建自动学习和自适应的系统,它利用统计模型来可视化、分析和预测数据。一个通用的机器学习模型包括一个数据集(用于训练模型)和一个算法(从数据学习)。但是有些模型的准确性通常很低产生的结果也不太准确,克服这个问题的最简单的解决方案之一是在机器学习模型上使用集成学习。
deephub
2022/11/11
7840
机器学习模型的集成方法总结:Bagging, Boosting, Stacking, Voting, Blending
机器学习集成学习与模型融合!
对比过kaggle比赛上面的top10的模型,除了深度学习以外的模型基本上都是集成学习的产物。集成学习可谓是上分大杀器,今天就跟大家分享在Kaggle或者阿里天池上面大杀四方的数据科学比赛利器---集成学习。
Datawhale
2020/08/20
1.1K0
机器学习集成学习与模型融合!
基于随机森林模型的心脏病人预测分类
今天给大家分享一个新的kaggle案例:基于随机森林模型(RandomForest)的心脏病人预测分类。本文涉及到的知识点主要包含:
皮大大
2022/02/22
2.1K0
基于随机森林模型的心脏病人预测分类
基于回归模型的销售预测
机器学习中用于回归的算法也较多,而且不难发现XGBoost在回归预测中也具有较好的表现,因此在日常业务中,碰到挖掘任务可首选XGBoost~
HsuHeinrich
2023/05/25
6700
基于回归模型的销售预测
机器学习入门 13-1 什么是集成学习?
本章会介绍机器学习领域中非常重要的集成学习方法。在机器学习中,集成学习方法使用多种学习算法来获得比使用任何单独的学习算法更好的预测性能。
触摸壹缕阳光
2021/02/26
5600
机器学习入门 13-1 什么是集成学习?
机器学习基础:类别不平衡问题处理方法汇总及实际案例解析
原文:https://www.cnblogs.com/shenggang/p/12133016.html
统计学家
2020/08/28
8.7K0
机器学习基础:类别不平衡问题处理方法汇总及实际案例解析
【机器学习实战】电信客户流失预测
在这个项目中,我们将展示如何通过先进的机器学习技术来预测电信行业中的客户流失。我们首先利用随机森林(RF)算法与递归特征消除和交叉验证(RFECV)方法进行高效的特征选择,从大量特征中筛选出最具预测价值的变量。随后,结合LightGBM这一高效的梯度提升算法,搭配过采样技术解决正负样本严重不平衡的问题。最后,通过SHAP(SHapley Additive exPlanations)模型解释技术,让我们深入了解模型的决策过程和各特征的影响。
机器学习司猫白
2025/01/21
1430
【机器学习实战】电信客户流失预测
数据挖掘实战:基于机器学习的肺癌患者建模预测分类
肺癌是全球范围内最常见的癌症之一,也是导致癌症相关死亡的主要原因。早期发现和诊断对于提高患者的生存率和治疗效果至关重要。
皮大大
2024/04/09
1.3K3
相关推荐
机器学习可解释性神器shap入门
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档