分类分析-案例:客户流失预测分析与应用

来自:宋天龙《PYTHON数据分析与数据化运营》,以下内容比较简陋,方便日后翻阅。
在这里插入图片描述

1. 业务场景

业务部门希望数据部门能对流失用户做分析,找到流失用户的典型特征,例如:到底流失用户的哪些特征最显著,当客户在哪些特征的什么条件下比较容易发生流失行为,并送到业务部门。

分析:
1.这是关于特征提取的分析工作,目标是交付特征重要性和特征规则;
2.该需求可以通过决策树实现,本例使用XGBoost
3.必须给业务部门提供规则图
4.数据集样本不平衡,因为流失用户是少量的,即使CGBoost对缺失值不敏感,但是过采样不允许有空值,故需要对缺失值处理。

2. python实现

1.导包,数据读取、预处理

# 导入库
import pandas as pd
from sklearn.model_selection import train_test_split  # 数据分区库
import xgboost as xgb
from sklearn.metrics import accuracy_score, auc, confusion_matrix, f1_score, \
    precision_score, recall_score, roc_curve  # 导入指标库
from imblearn.over_sampling import SMOTE  # 过抽样处理库SMOTE
import matplotlib.pyplot as plt
import prettytable  # 导入表格库
# 读取准备
raw_data = pd.read_csv('classification.csv', delimiter=',')  # 读取数据文件
X,y = raw_data.iloc[:, :-1],raw_data.iloc[:, -1]  # 分割X,y
n_samples, n_features = X.shape  # 总样本量,总特征数
# 数据基本审查
print('samples: {0}| features: {1} | X和y含有nan值的列数na count: {2}'.format(n_samples, n_features,raw_data.isnull().any().count()))
# 数据预处理
# 填充缺失值
X = X.fillna(X.mean())
# 样本均衡处理
#'''
model_smote = SMOTE()  # 建立SMOTE模型对象
X, y = model_smote.fit_sample(X,y)  # 输入数据并作过抽样处理
#'''
# 拆分数据集
X = pd.DataFrame(X,columns=raw_data.columns[:-1])
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=.3, random_state=0)  #

在这里插入图片描述

2.模型训练

# XGB分类模型训练
#依次指定二分类、10个基模型、每个模型用得样本是总体样本得80%、最大深度10、使用全部CPU资源
param_dist = {'objective': 'binary:logistic', 'n_estimators': 10,
              'subsample': 0.8, 'max_depth': 10, 'n_jobs': -1}
model_xgb = xgb.XGBClassifier(**param_dist)
model_xgb.fit(X_train, y_train)
pre_y = model_xgb.predict(X_test)

在这里插入图片描述

3.混淆矩阵

在这里插入图片描述

# 混淆矩阵
tn, fp, fn, tp = confusion_matrix(y_test, pre_y).ravel()  # 获得混淆矩阵
confusion_matrix_table = prettytable.PrettyTable(['','prediction-0','prediction-1'])  # 创建表格实例
confusion_matrix_table.add_row(['actual-0',tp,fn])  # 增加第一行数据
confusion_matrix_table.add_row(['actual-1',fp,tn])  # 增加第二行数据
print('confusion matrix \n',confusion_matrix_table)

在这里插入图片描述

4.输出重要特征

# 输出特征重要性
#指定参数:树模型对象、条形图得高度、特征重要性按平均增益值、10个特征、
xgb.plot_importance(model_xgb,height=0.5,importance_type='gain',max_num_features=10,xlabel='Gain Split',grid=False) 

在这里插入图片描述

5.输出树形规则图

注意:使用conda install -c https://pypi.tuna.tsinghua.edu.cn/simple python-graphviz

#树模型对象、指定树得index(10个树,索引0-9)、值为真得颜色,值为假得颜色
digraph=xgb.to_graphviz(model_xgb, num_trees=1, yes_color='#638e5e', no_color='#a40000') 
digraph.format = 'png'
digraph.view('./iris_xgb')

在这里插入图片描述

6.对不同规则进行分析

分析不同规则下,对应到测试集发生样本的以及预测得概率

# 前N条规则对应的用户数据
rule_depth_1 = X_test['internet']<0.00284512946
rule_depth_2 = X_test['longten']<230.75
rule_depth_3 = X_test['total_orders']<2.97253799
rule_depth_4 = X_test['sex']<0.972537994
rule_depth_5 = X_test['wireten']<86.0607376
rule_list = [rule_depth_1,rule_depth_2,rule_depth_3,rule_depth_4,rule_depth_5]
rule_pd = [pd.DataFrame(i) for i in rule_list]
rule_pd_merge = pd.concat(rule_pd,axis=1)
#rule_pd_merge是五列值,值分别是True\False
# 遍历不同条件下用户的情况
for i in range(5):
    dyn_rules = rule_pd_merge.iloc[:,:i+1] # 取出top规则
    dyn_rules['is_true']=[all(i)==True for i in dyn_rules.values]# 得到都为true的record
    y_test_selected = y_test[dyn_rules['is_true']]
    y_pre_selected = y_score[dyn_rules['is_true']]
    y_pre_cal = y_pre_selected[:,1] >=0.5#说明标签是1,即流失的客户
    total_samples = len(y_pre_cal)
    is_churn = y_pre_cal.sum()
    churn_rate = float(is_churn)/total_samples
    # 计算样本比例
    print('total samples: {}'.format(total_samples))
    print('churn samples: {} | rate: {:.0%} '.format(is_churn,churn_rate))
    print('unchurn samples: {} | rate: {:.0%} '.format((total_samples-is_churn),(1-churn_rate)))
    print('-'*40)

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值