分类分析案例

分类算法:

通过对一直类别训练集的计算和分析,从中发现类别规则并预测新数据的类别。

常见算法:

朴素贝叶斯、逻辑回归、决策树、随机森林、支持向量机等。

分类分析&聚类分析

学习方式不同。聚类是一种非监督式学习算法,而分类是监督式学习算法。

对源数据集要求不同。聚类不要求源数据集有预先定义的标签,单分类需要标签作为监督学习的“标准”或“参照”用来训练模型。

应用场景不同。聚类一般用于数据探索分析、数据降维、数据压缩等,而分类更多用于预测性分析和使用。

解读结果不同。聚类算法的结果是将不同的数据集按照各自的典型特征分成不同类别,不同人对聚类的结果解读不同;分类的结果是一个固定值,不存在不同解读的情况。

模型评估指标不同。聚类分析没有所谓的“准确”与否,而分类模型的指标都有明显的“好坏”等评估指标。

假如原数据集带有类别标签,那么选择分类或聚类算法都可以,不带有类别标签,只能选择聚类算法。

选择

文本分类——朴素贝叶斯,如电子邮件中垃圾邮件的识别。

训练集较小——朴素贝叶斯、支持向量机等。

训练集较大——都可以

不关注算法的计算时间和模型易用性——支持向量机、人工神经网络

重视算法准确度——支持向量机或GBDT、XGBoost等

重视稳定性或模型鲁棒性——随机森林、组合投票模型

案例——用户流失预测分析与应用

基本场景:

业务部门希望数据部门能对流失用户做分析,找到流失用户的典型特征。

数据工作特点:

关于特征提取的分析工作,目标是特征重要性和规则

可以通过决策树进行实现,决策树是最好的解释规则的算法

需要提供规则图

数据集大概率出现样本不均衡问题——流失客户一定是少量的

part 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 #指标库
import prettytable #表格库
import matplotlib.pyplot as plt
from imblearn.over_sampling import SMOTE #过抽样处理库,用于样本均衡处理

part 2 数据准备

raw_data = pd.read_csv('classification.csv', delimiter=',')
x, y = raw_data.iloc[:, :-1], raw_data.iloc[:,-1]

part 3 数据基本审查

n_samples, n_features = x.shape
print('samples: {0} | features: {1} | na count: {2}'.format(n_samples, n_features, raw_data.isnull().any().count()))

XGBoost具有容忍性,可以不处理NA值,让然会有效的应对。由于后期样本均衡处理,不能存在NA值,因此,需要进行确认。

samples: 1000 | features: 41 | na count: 42

样本量不多,但是特征数量较多,由于XGBoost自身可以有效地选择特征并处理,我们无需处理;NA值需要处理。

part 4 数据预处理

x = x.fillna(x.mean())
model_smote = SMOTE()
x, y = model_smote.fit_resample(x, y)

填充缺失值使用的是均值填充法,样本均衡策略使用的是过抽样处理。

part 5 拆分数据集

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)

part 6 XGB模型训练

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)

part 7 效果评估-混淆矩阵

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)

结果:

confusion matrix 
 +----------+--------------+--------------+
|          | prediction-0 | prediction-1 |
+----------+--------------+--------------+
| actual-0 |     191      |      23      |
| actual-1 |      61      |     161      |
+----------+--------------+--------------+

part 8 核心评估指标

y_score = model_xgb.predict_proba(x_test) #获得决策树的预测概率
fpr, tpr, _=roc_curve(y_test, y_score[:,1]) #ROC
auc_s = auc(fpr, tpr) #AUC
scores = [round(i(y_test, pre_y),3) for i in (accuracy_score, precision_score, recall_score, f1_score)]
scores.insert(0, auc_s)
core_metrics = prettytable.PrettyTable()
core_metrics.field_names = ['auc', 'accuracy', 'precision', 'recall', 'f1']
core_metrics.add_row(scores)
print('core metrics\n', core_metrics)

结果:

core metrics
 +--------------------+----------+-----------+--------+------+
|        auc         | accuracy | precision | recall |  f1  |
+--------------------+----------+-----------+--------+------+
| 0.8795150290477395 |  0.807   |   0.758   | 0.893  | 0.82 |
+--------------------+----------+-----------+--------+------+

从上述指标可以看出,模型效果较好。

part 9 特征重要性

xgb.plot_importance(model_xgb, height=0.5, importance_type='gain', max_num_features=10, xlabel='Gain Split',grid=False)

 业务部门根据图标对特征重要性直接判断。

part 10 输出树形规则图

xgb.to_graphviz(model_xgb, num_trees=1, yes_color='#638e5e', no_color='#a40000')

 yes,missing为所找路线。

#前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)
#循环遍历
for i in range(5):
    dyn_rules = rule_pd_merge.iloc[:,:i+1]
    dyn_rules['is_true'] = [all(i) == True for i in dyn_rules.values]
    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
    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)

结果:

total samples: 258
churn samples: 123 | rate: 48%
unchurn samples: 135 | rate: 52%
----------------------------------------
total samples: 135
churn samples: 100 | rate: 74%
unchurn samples: 35 | rate: 26%
----------------------------------------
total samples: 44
churn samples: 37 | rate: 84%
unchurn samples: 7 | rate: 16%
----------------------------------------
total samples: 29
churn samples: 27 | rate: 93%
unchurn samples: 2 | rate: 7%
----------------------------------------
total samples: 27
churn samples: 25 | rate: 93%
unchurn samples: 2 | rate: 7%
----------------------------------------

前N条规则对应的用户数据模块中,根据图中规则手动写出表达式,然后通过两次列表推导式配合pd.concat建立完整数据框,该数据框用来标记不同层的规则对应到x_test用户是否符合的情况。

随着条件的增加,用户流失的概率越来越高。

当规则越多时,覆盖的总样本量和流失的用户数量减少。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值