决策树在商业保险中的应用

  • 决策树在商业保险中的应用
    • ⼀、业务背景
    • 二、数据探索性分析
      • 2.1、导入数据和安装包
      • 2.2了解数据特征的分布情况
      • 2.3了解数据特征与标签之间的相关性强弱
    • 三、数据清洗
      • 3.1 删除不需要的列
      • 3.2 拆分训练集和测试集
      • 3.3 空值填充
        • 3.3.1 对训练集数据进行填补
        • 3.3.1 对测试集数据进行填补
      • 3.4 数据编码
    • 四、建立决策树模型
      • 4.1没有进行任何参数设置的决策树模型
      • 4.2调参
        • 4.1学习曲线对单个参数进行调参
        • 4.2网格搜索对多个参数进行调参

决策树在商业保险中的应用

⼀、业务背景

  1. 业务环境
    1.概览
    受保险⾏业结构转型时期影响,互联⽹保险整体发展受阻,2018年⾏业保费收⼊为1889亿元, 较去年基本持平,不同险种发展呈现分化格局,其中健康险增⻓迅猛,2018年同⽐增⻓108%,主要由短期医疗险驱动。
    格局
    供给端专业互联⽹保险公司增⻓迅速,但过⾼的固定成本及渠道费⽤使得其盈利问题凸显,加上发展现状强,⾃营渠道建设及科技输出是未来的破局⽅法,渠道端形成第三⽅平台为主,官⽹为辅的格局,第三⽅平台逐渐发展出B2C、B2A、B2B2C等多种创新业务模式。
    模式
    互联⽹保险不仅仅局限于渠道创新,其核⼼优势同样体现在产品设计的创新和服务体验的提升。
  2. 发展趋势
    竞合格局
    随着⼊局企业增多,流量争夺更加激烈,最终保险公司与第三⽅平台深度合作将成为常态。
    保险科技
    当前沿科技不断应⽤于保险⾏业,互联⽹保险的概念将会与保险科技概念⾼度融合。
  3. 衡量指标
  4. 业务⽬标
    针对保险公司的健康险产品的⽤户,制作⽤户画像,然后进⾏精准保险营销。

5.数据分析的流程

1  读入数据
1.1  了解数据
2  了解我们的特征
3  探索特征和响应数据之间的比例关系
4  数据清洗
4.1  删除不需要的列
4.2  拆分训练集和测试集
4.3  空值统计
4.4  空值填充
4.5  数据编码
4.6  测试集相同编码方式
4.7  重复值检查和删除
5  建模
5.1  调参
5.2  网格搜索

二、数据探索性分析

2.1、导入数据和安装包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("保险行业决策树案例\data\ma_resp_data_temp.csv")
df.head()
df.shape
df.info()



在我们正式建模型之前,我们需要对我们的数据进行描述性统计,这样我们就能知道整个数据的大致分布是什么样的,做到心里有数,然后能够数据大致的全貌有一定的了解。

2.2了解数据特征的分布情况

def value_counts(column):"""函数功能: 传入列名, 返回该列的计数统计绘制柱状图"""df[column].value_counts().plot(kind='bar');return df[column].value_counts()
#查看购买保险人数
value_counts("resp_flag")

#查看性别分布
value_counts("GEND")

#查看是否大学毕业分布
value_counts("COLLEGE")

2.3了解数据特征与标签之间的相关性强弱

1.了解每一个学历下购买的人数占比情况

d = df.groupby("c210mys")["resp_flag"].mean()
plt.figure(dpi = 100)
d.plot(kind = "bar")
plt.xlabel("学历")
plt.ylabel("每一学历购买保险的占比")


从图中可以看到学历等级的高低与购买保险并无太多相关性
2.了解社会经济评分购买保险的人数占比情况

plt.figure(dpi =500)
df.groupby("c210kses")["resp_flag"].count().plot(kind = "kde")


从概率密度曲线图可以得出,购买保险人数最多的主要集中在社会经济地位评分-100至500分左右。

3.家庭排名与购买保险之间的相关性

plt.figure(dpi = 100)
df.groupby("zhip19")["resp_flag"].mean().plot(kind = "bar")
plt.xlabel("家庭排名")
plt.ylabel("家庭排名购买保险的占比")


同样也并无很多相关性的关系。
对数据有了基本的了解后,接下来,我们对数据进行清洗。

三、数据清洗

数据的清洗流程
1、删除不需要的列
2、拆分训练集和测试集
3、空值填充
4、数据编码
5、重复值检查, 重复值删除
6、离散化(连续数据,年龄, 65-70, 71-75, 76-80…)

3.1 删除不需要的列

#KBM_INDV_ID, NAH19, N65P, U18,

df.drop(columns=['KBM_INDV_ID', 'NAH19', 'N65P', 'U18'], inplace=True)
# 拆分X, y
y = df.pop('resp_flag')
y
# 复制一个新的作为X
X = df.copy()

3.2 拆分训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)

3.3 空值填充

#统计空值数量
X_train.isnull().sum()
#只看空值部位0的即可
null = X_train.isnull().sum()
#过滤出有空值的列, 从多到少排序
null[null>0].sort_values(ascending=False)
temp = X_train[null[null>0].sort_values(ascending=False).index]
temp

因为列名的个数太多,一个一个填充的话太费时间了,因此我们要对其进行批量的填充。
思路:对于objct型的数据我们可以采用众数进行填充,对于float类型的数据我们可以采用中位数进行填充。我们首先可以将我们所需要填充的列的数据类型分为两类,一类是objct型的,一类是float型的,然后通过select_dtypes这个函数筛选出两个类型的数据,对它们进行批量的填充。
查看有缺失值的数据类型
temp.info()

value_counts(“LIVEWELL”)

我们注意到LIVEWELL幸福水平应该是属于objct型的,但是在原始数据中它是float型的,因此我
们需要对其更改数据类型将其转化成objct型的。

#先把LIVEWELL改成object型
temp.LIVEWELL = temp.LIVEWELL.astype('object')
#根据类型筛选数据
#include= 提取的类型, exclude=排除类型
#这些列名就是所有我们需要用中位数填充的列
temp.select_dtypes(include='float64').columns
#筛选出不是float64的列, 就是我们需要用众数填充的
temp.select_dtypes(exclude='float64').columns
#保存成变量
float64_type = temp.select_dtypes(include='float64').columns
object_type = temp.select_dtypes(exclude='float64').columns

3.3.1 对训练集数据进行填补

# 填充所有离散型的用众数的
for column in object_type:# 采用每一列的众数填充这一列X_train[column].fillna(X_train[column].mode()[0], inplace=True)
# 填充所有连续型的用中位数
for column in float64_type:#print(column)# 对每一列采用这一列的中位数填充X_train[column].fillna( X_train[column].median(), inplace=True)

3.3.1 对测试集数据进行填补

# 填充所有连续型的用中位数
for column in float64_type:# 对每一列采用这一列的中位数填充X_test[column].fillna( X_train[column].median(), inplace=True)# 填充所有离散型的用众数的
for column in object_type:# 采用每一列的众数填充这一列X_test[column].fillna(X_train[column].mode()[0], inplace=True)

填充完后,现在我们要对数据进行编码。
刚才我们将LIVEWELL转化成了objct型的,但是我们知道幸福水平是有大小之分的,填充完空值之后,因此我们需要将LIVEWELL转化成整数型

# LIVEWELL 改成整数型
X_train.LIVEWELL= X_train.LIVEWELL.astype('int')
X_test.LIVEWELL= X_test.LIVEWELL.astype('int')

空值填补完成后,接下来我们对数据进行编码

3.4 数据编码

将所有object类型分成2分类的和多分类.
思路:对于object类型的我们也是通过批量来对数据进行编码,因此我们需要对每一列进行去重
然后,查看每一列的分类数目。然后对其采用for循环进行批量的更改数据类型。

# 提取所有object数据类型
X_train_object = X_train.select_dtypes('object')
X_train_object
# 将统计结果保存到一个Series中,
# 索引是列名, 值就是及分类
t = pd.Series() # 空的for column in X_train_object.columns:# 添加一条数据t[column] = X_train[column].nunique()
t
# 为了防止弄错, 先备份一个
X_train_copy = X_train.copy()
X_test_copy = X_test.copy()
对训练集进行编码
t[t==2].index # 对这些列进行遍历, 编码
# 编码
d = {'N':0, 'Y':1, 'M':0, 'F':1}
for column in t[t==2].index:# 对所有2分类列进行编码X_train[column].replace(d, inplace=True)
# 完成多分类的编码
for column in t[t>2].index:# 构建一个列的修改字典d = {}for i in range(len(X_train[column].unique())):d[X_train[column].unique()[i]] = i# 替换X_train[column].replace(d, inplace=True)

```bash
对测试集进行编码
# 编码
d = {'N':0, 'Y':1, 'M':0, 'F':1}
for column in t[t==2].index:# 对所有2分类列进行编码X_test[column].replace(d, inplace=True)
> # 完成多分类的编码 for column in t[t>2].index:
>     # 构建一个列的修改字典
>     d = {}
>     for i in range(len(X_test[column].unique())):
>         d[X_test[column].unique()[i]] = i
>     # 替换
>     X_test[column].replace(d, inplace=True) ```

编码完成之后然后我们对数据进行去重

# 没有完全一样的重复值存在
X_train[X_train.duplicated(keep=False)]
X_test[X_test.duplicated(keep=False)]

对数据进行编码完成后,接下来我们对数据建立决策树模型

四、建立决策树模型

4.1没有进行任何参数设置的决策树模型

#导包
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV

clf= DecisionTreeClassifier()
clf.fit(X_train,y_train)
clf.score(X_train,y_train)

clf.score(X_test,y_test)

clf.get_depth()

这是没有进行任何调参后得到的决策树模型分类准确率
接下来我们对该模型进行调参

4.2调参

4.1学习曲线对单个参数进行调参

选择最大深度max_depth 进行调参

test_score = []
train_score = []
cv_score = []
for i in range(2,42):dtc = DecisionTreeClassifier(max_depth=i,random_state=100)dtc.fit(X_train,y_train)cv_score.append(cross_val_score(dtc,X_train,y_train,cv = 5,n_jobs = -1).mean())train_score.append(dtc.score(X_train,y_train))test_score.append(dtc.score(X_test,y_test))
plt.figure(dpi = 150)
plt.plot(range(2,42),test_score,label = "test_score")
plt.plot(range(2,42),train_score,label = "train_score")
plt.plot(range(2,42),cv_score,label = "cv_score ")
plt.legend()
plt.show()

print("最优分数为:{}".format(np.max(cv_score)),"最优深度:{}".format(np.argmax(cv_score)+2))

4.2网格搜索对多个参数进行调参

dd = {'max_depth':range(3, 10), 'max_features':['sqrt', 'log2', None], 'max_leaf_nodes':range(20, 100, 5)}grid = GridSearchCV(dtc,dd, n_jobs=-1, cv=5, verbose=10)grid.fit(X_train, y_train)
grid.best_score_

grid.best_params_

grid.score(X_train, y_train)

grid.score(X_test, y_test)

注:业务的应用在此不方便透露,如想知道请在下方进行留言,本人收到回立即回复。

决策树在商业保险中的应用相关推荐

  1. 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:

    决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizerimport csvfrom ...

  2. sql 实现决策树_SQL Server中的Microsoft决策树

    sql 实现决策树 Decision trees, one of the very popular data mining algorithm which is the next topic in o ...

  3. python建模 决策_决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:...

    决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizer import csv fro ...

  4. 导入训练好的决策树文件_决策树在sklearn中的实现

    小伙伴们大家好~o( ̄▽ ̄)ブ,今天做一下如何使用sklearn实现决策树,首先声明一下,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你的版本至少要3.4 ...

  5. 【sklearn入门】决策树在sklearn中的实现--实战红酒分类案例

    scikit-learn简介 scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包.它通过NumPy, SciPy和 Matplotlib等python数值 ...

  6. 决策树在sklearn中的实现

    1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...

  7. [决策树]西瓜书中增益、增益比率以及基尼系数的计算

    决策树:分裂(Splitting).停止(Stopping)与剪枝(Pruning) 一.Splitting 问题: 怎样找到最好的分裂属性? 希望内在的节点有更高的纯度. 怎样去衡量纯度呢? 信息熵 ...

  8. python实现决策树数据直接赋值导入_决策树在python中的数据实现

    我为python决策树算法实现完成了以下代码:from csv import reader def load_csv(filename): file = open(filename, "rb ...

  9. 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

最新文章

  1. (C++)用指针实现两数交换函数swap()的两种方法
  2. 月薪 5 万清华姚班 NOI 金牌得主在线征友被群嘲,当代互联网相亲有多难
  3. 不借助第三方工具查看映像路径(系统进程路径).
  4. python编程入门教学电子书-Python编程入门电子书教程,看这几个就够了
  5. 【Linux病毒】阿里云+腾讯云服务器的 kdevtmpfsi(H2Miner挖矿蠕虫变种)病毒处理(5个详细步骤)
  6. wxWidgets:wxMenuEvent类用法
  7. Spring 4.2中由注释驱动的事件侦听器
  8. [vue] 你认为vue的核心是什么?
  9. confluence添加用户_知识管理平台Confluence教程:如何添加,分配和查看任务
  10. DOTA 2血虐人类的OpenAI,原来靠的是作弊?
  11. python支持哪些平台开发_【后端开发】python能兼容哪些平台
  12. vue 数组遍历方法forEach和map的原理解析和实际应用
  13. Android PopupWindow的简单说明
  14. Logistic回归模型(C++代码实现)
  15. IE11的userAgent
  16. 基于Go的马蜂窝旅游网分布式IM系统技术实践
  17. 一天入门51单片机教程
  18. java wsimport 调用_java使用wsimport调用wcf接口
  19. TI GEL文件作用
  20. PR软件——音频变音(机器音)

热门文章

  1. [vuex] unknown action type: jia1
  2. STM32CubeMX入门使用一
  3. 闪动的TextView
  4. 浣溪沙 2022年4月24日
  5. mysql in 命中索引_MySql优化-你的SQL命中索引了吗
  6. 眼疾手快,真男人就来合成粽子三兄弟
  7. Android 调用系统打开相机,打开相册获取图片路径
  8. linux 7.4安装gcc,在 Centos 7.4 上安装Gcc 7.3
  9. 期市财盛:9月12日美原油期货日内行情分析_期市黄金策略
  10. Centos 7 怎么都连不上手机阿阿阿阿Android Studio 怎么都检测不到真机啊还有关于git本地提交就缺少文件啊啊啊啊