一、背景介绍

目前保险产品市场快速发展,保险产品的多样性、客户特征的复杂性以及需求差异使得保险产品推荐成为一个热门话题。保险产品推荐需要考虑保险产品本身的分类特点和用户多维度的特征,根据有限的行为数据挖掘用户偏好,进而预测用户购买的可能性,并把这个商品推荐给相应的用户。

此外,目前我国保险产品多达上万种,每一个保险产品的保障范围和免责条款都相对较为复杂,用户在选择保险产品时往往存在很多困难,保险公司也很难识别精准的用户,从而降低自身风险提高营收,因此非常需要推荐模型来对用户进行产品推荐。

保险公司和用户存在双向信任问题,一方面,由于互联网环境或是第三方机构的销售方式存在夸大宣传的问题,用户对保险产品存在信任危机,对保险条件和过程存在很多疑问,需要详细了解可信的过程才愿意达成保险产品购买。另一方面,保险公司或是第三方机构对用户可能对用户的具体情况不够了解,特别是保险关键因素如健康状况、家庭背景等等,难以提供精准的保险产品推荐,同时,用户是否购买存在着较大的不确定性,购买意愿较难推测,因此需要应用数据挖掘技术,通过对用户本身属性和过往保险购买记录分析客户特点,对广大用户进行个人信息的有效筛选,从购买保险的用户群体中提取共同的特征,从而针对这些特征规律提高投放精准性,促进保险公司的业务发展。

二、选题原理介绍

2.1决策树分类算法的核心思想

决策树通过一系列的如果...那么...”的问题,对数据进行层层划分,最终得到一个树状的模型,用于分类或预测。

一棵决策树由以下元素构成:根节点:代表整个数据集的起点,包含所有样本。内部节点/决策节点:代表对一个特征的测试。根据测试结果,数据被分割到不同的子节点。分支:代表一个决策节点上某个测试结果所对应的路径。叶节点/终端节点:代表最终的分类结果。一旦到达叶节点,就不会再进行分割。

2.2决策树的构建过程

构建决策树的核心问题是:“在每一个节点上,我们应该选择哪个特征进行分割?”

我们希望每次分割都能让数据变得尽可能“纯”,即同一个分支下的样本尽可能属于同一个类别。为了量化这种“纯度”,我们引入了划分标准。

主要的划分标准为信息增益,用信息熵来衡量,所谓信息熵是度量数据集纯度的指标。熵越高,表示数据越混乱;熵越低,表示数据越纯。计算公式为:

其中 pi是数据集中第 i类样本所占的比例。

所谓信息增益,是指使用某个特征A分割数据集D前后,其熵的减少量。信息增益越大,意味着使用特征A进行分割带来的“纯度提升”越大,计算公式如下。

其中 V是特征A的取值个数,Dv是D中在特征A上取值为 v的子集。

ID3 算法 就是使用信息增益作为划分标准。

信息增益率是对信息增益的改进,其问题为信息增益倾向于选择取值数目较多的特征(例如“ID”编号,每个样本一个值,分割后纯度最高但毫无意义)。

所谓信息增益率,是指引入了特征的“固有值”作为惩罚项,对取值多的特征进行惩罚。公式如下。

其中是特征A的固有值。C4.5算法是ID3的改进版,使用信息增益率。

所谓基尼值是指从数据集中随机抽取两个样本,其类别标记不一致的概率。基尼值越小,数据集的纯度越高。公式如下。

所谓基尼指数是指选择使分割后子集基尼值加权和最小的特征作为划分标准。公式如下。

CART(分类与回归树)算法使用基尼指数作为划分标准,并且它构建的是二叉树。

2.3决策树的剪枝

决策树非常容易过拟合,尤其是在树很深、分支很多的时候。它会学习到训练数据中的噪声和不必要的细节,导致在未知数据上表现很差。

剪枝是解决过拟合的主要手段,通过主动剪掉一些子树或叶节点来简化模型。它分为预剪枝和后剪枝。

所谓预剪枝,它的思想是在决策树生成过程中,对每个节点在划分前先进行估计。如果当前节点的划分不能带来验证集性能的提升,则停止划分并将当前节点标记为叶节点。优点为降低过拟合风险,显著减少训练时间。同时伴随着有“视野问题”,可能当前划分不能提升性能,但后续的划分可能显著提升性能。预剪枝可能过早停止决策树的生长。

所谓后剪枝,它的思想为先完整地生成一棵决策树,然后自底向上地对非叶节点进行考察。如果将该节点对应的子树替换为叶节点能带来验证集性能的提升,则将该子树替换为叶节点。优点是泛化性能通常优于预剪枝,保留了更多分支,欠拟合风险小。但是训练时间开销大。

2.4决策树的优缺点

决策树的优点可概括为直观易懂、无需大量数据预处理、能够处理多输出问题、可以处理非线性关系。第一,因为模型可以可视化,决策过程非常透明,符合人类思维方式,通俗易懂。这在需要模型可解释性的领域(如金融、医疗)非常受欢迎。第二,对数据的分布没有严格假设,不需要标准化/归一化,可以处理数值和类别特征。

缺点可以概括为容易过拟合、不稳定、有偏性以及难以学习复杂关系。所谓容易过拟合,即如果不进行剪枝,很容易生成过于复杂的树。必须使用剪枝。而不稳定的情况通常出现在数据微小的变化可能导致生成完全不同的树。这个缺点可以通过集成学习(如随机森林)来克服。第三,有偏性是指在划分时倾向于选择那些具有更多取值的特征,信息增益率就是为了缓解这个问题。难以学习复杂关系主要体现在如异或(XOR)问题,单棵决策树很难处理。

决策树是一种基础而重要的分类(和回归)算法。它的核心在于通过划分标准(信息增益、增益率、基尼指数)选择最佳特征来构建树形结构,并通过剪枝来防止过拟合。虽然单棵决策树有局限性,但它构成了许多强大集成算法(如随机森林、梯度提升树GBDT/XGBoost/LightGBM)的基础,理解它至关重要。

2.5分类决策树代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_iris
# 加载Iris数据集
iris = load_iris()
X, y = iris.data, iris.target
# 训练决策树
clf = DecisionTreeClassifier(max_depth=3, random_state=0)
clf.fit(X, y)
# 可视化决策树结构
plt.figure(figsize=(12, 6))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.title('Decision Tree Visualization (Iris Dataset)')
plt.show()

2.6回归决策树代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
# 生成一维回归数据
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel() + 0.2 * rng.randn(80)
# 训练回归树
reg = DecisionTreeRegressor(max_depth=3)
reg.fit(X, y)
# 预测与可视化
X_test = np.linspace(0, 5, 200)[:, np.newaxis]
y_pred = reg.predict(X_test)
plt.figure(figsize=(8, 5))
plt.scatter(X, y, color='darkorange', label='Training data')
plt.plot(X_test, y_pred, color='navy', label='Decision Tree Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Decision Tree Regression Example')
plt.legend()
plt.show()

2.7 逻辑回归

辑回归是一种常用的分类算法,核心是通过对数几率函数(Sigmoid 函数)将线性回归的连续输出映射到 0-1 之间,以此判断样本属于某一类别的概率。简单说,它不直接预测具体数值,而是回答 “是或否” 的问题,比如 “用户是否会点击广告”“邮件是否为垃圾邮件”。

核心特点

输出是概率值(0 到 1 之间),方便判断分类置信度。模型简单、训练速度快,对数据量要求不高,适合作为分类任务的基础模型。能直观输出各特征对分类结果的影响程度(通过回归系数),可解释性强。

2.8 ID3决策树

ID3决策树是一种基于信息增益选择分裂特征、主要用于离散型特征分类的决策树算法,它以信息增益最大化为准则构建决策树,但存在对取值较多特征有偏好、不支持缺失值处理、对噪声敏感且泛化能力弱的局限性,结合之前的表格数据来看,ID3决策树在原数据集和平衡后数据集上的表现均远逊于CART决策树和逻辑回归,其Precision、F1、AUC等核心指标均处于极低水平,说明在该任务中其特征选择策略和结构设计无法有效捕捉数据规律,实用价值有限

三、算法实现

本实验主要根据用户的历史投保记录,以及用户家庭和成员的各种属性统计结果,来向用户推荐一款房车险。通过对投保记录和用户自身属性信息进行分析,来找到可能购买的该保险的用户特征,从而依据这些特征有针对性的对用户进行推荐,提高销量。

实验所用数据共5822条记录,每条记录有86个字段,1~43字段为用户基本属性,包括财产、宗教、家庭情况、教育程度、职位、收入水平等;44~85字段为用户历史保险购买情况,第86个字段为目标预测字段,取值为0和1,表示用户是否购买该房车险。

根据以上数据,可将用户分为购买移动房车险和不购买移动房车险两个类别,看作一个 分类问题,前85个字段作为用户特征, 使用决策树分类算法来分析购买该保险的用户特征,决策树主要通过一个数据的熵值来表示数据的稳定或复杂程度,熵值越大说明数据越复杂,纯度越低;反之说明数据纯度越高,熵值的变化为信息增益。如果将一个数据集划分之后相对于原数据集的熵是减少的,说明数据的不确定性降低。通过信息增益来进行属性的选择,选择信息增益最大的属性来划分数据,划分后的子数据集就具有最小的熵,最高的纯度。本实验中依照某一属性划分之后的信息增益最大,说明划分后的每个子集用户的购买倾向更相似。反复迭代,以此作为检验用户是否会购买保险的模型,从而根据这些特征对特定群体进行精准营销,降低运营成本,提高用户准化率。

3.1数据探索

对数据进行初步探索,以发现其主要特点,理解数据结构和各变量的意义。首先对数据进行描述性统计分析,包括最大值、最小值、均值、中位数、标准差等,来查看数据的分布情况与特征,从而验证数据质量,对数据有一个初步的了解,可作为结果的验证,数据描述性统计代码如下,首先设置数据输出宽度,再用describe方法输出数据的统计型特征。

3.2数据降维

import pandas as pd
pd.set_option('display.max_columns',1000)
pd.set_option('display.width',1000)
pd.set_option('display.max_colwidth',1000)
dataSet = pd.read_excel('data.xlsx')
print(dataSet.describe())

输出结果如下图所示:

图1 输出结果图

为了查看投保移动房车险的用户特征分布,可采用箱型图可视化数据,来查看不同的变量对因变量的区分度,分别分析有无购买移动房车险用户在购买力水平、是否有车、教育水平、是否已婚、是否高管、农场主几个方面的分布。箱型图结果如图2-12。

图 2 购买力水平对移动房车险数量影响   

图 3 无车对移动房车险数量影响

图 4 高等教育对移动房车险数量影响  

图 5 中等教育对移动房车险数量影响

图 6 低等教育对移动房车险数量影响  

 图 7 投保火险对移动房车险数量影响

  

图 8 已婚占比对移动房车险数量影响   

图 9 私人社保对移动房车险数量影响

图 10 公共社保对移动房车险数量影响   

图 11 农场主对移动房车险数量影响

图 12 高管对移动房车险数量影响  

通过箱型图的比较,可基本得出购买力水平较高的群体、有车群体、教育水平较高群体、已婚群体等更倾向购买该移动房车险,农场主和较低收入群体购买该保险的概率较低。说明投保该移动房车险的用户的经济实力较强,教育程度更高,保险意识相对较强,并且集中于城市生活群体,可对该移动房车险的人群进行初步定位。

在初步结论的基础上可应用决策树模型对用户进行分类,从而确定购买该保险的用户特征细分。首先由于本实验数据的字段较多,过高维度会影响模型的准确性,先进行数据预处理,将对模型结果影响不大的字段剔除或进行变换。数据中可能存在一些冗余字段,与模型结果不相关,可将这部分字段剔除以达到降维的目的。首先对缺失值大于20%的字段、方差小于0.1的字段进行剔除,之后采用pearson指数来预测字段的重要性,分界值设为95%,最终筛选出43个特征,代码如下。

#缺失率:
for i in range(0,len(a)):
    if a.iloc[i] >= 0.2:  # 缺失率大于 20%
        cols_to_drop.append(a.index[i])

#收集低方差列:
low_var_cols = []
for i in range(0,len(var)-1):
if var.iloc[i] <= 0.1:  # 方差小于等于 10%
low_var_cols.append(var.index[i])

#特征选择:
for i in range(0, len(variables)):  # 排除目标变量本身
col_name = variables[i]
    x = df[col_name]
    y = df[target_column]
    corr_result = pearsonr(x, y)
    if corr_result[1] > 0.05:  # p值大于0.05,相关性不显著
        cols_to_drop_corr.append(col_name)

剩余字段如图13所示

图13 降维后剩余字段

根据训练集保留的特征,对测试集进行选择。代码如下,运行后测试集保留同样的43个字段。

variables =df.columns
testSet=pd.read_excel('eval.xlsx')
testcolumn=testSet.columns
for i in range(0,len(testcolumn)):
	if testcolumn[i] not in variables:
		testSet=testSet.drop(testcolumn[i],1)
testSet.to_excel('outputeval.xlsx')

3.3算法实现

对降维后的数据应用决策树分类算法,首先导入数据集并储存数据条数,导入sklearn中的tree模块来实现决策树算法,其主要原理是计算该数据集的信息熵,同时统计购买移动房车险和未购买两类用户的人数。在此基础上计算按某个特征分类后的熵和原始数据熵的增量,若按某特征划分后,熵值减少的最大,则该特征为当前的最优分类特征,并以此特征作为新的分类,重复这个过程直到当前类别中数据的移动房车险数量字段值为统一值。最终用构造出决策树。代码如下:

import numpy as np
import pandas as pd
from sklearn import tree
from sklearn import  metrics

def createDataSet(path):
    dataSet = pd.read_excel(path)
    labels = list(dataSet.columns.values)
    dataSet = dataSet.values
    return dataSet, labels

if __name__ == '__main__':
    train_dataset,train_labels = createDataSet('balancedata.xlsx')
    train_row_count,train_labels_count = train_dataset.shape

    train_y = train_dataset[:,train_labels_count-1]
    train_x=np.delete(train_dataset,train_labels_count-1,axis=1)

    clf = tree.DecisionTreeClassifier()
    clf.fit(train_x,train_y)

    test_dataset, test_labels = createDataSet('finaleval.xlsx')
    test_row_count, test_labels_count = test_dataset.shape

    test_y = test_dataset[:, test_labels_count - 1]
    test_x = np.delete(test_dataset, test_labels_count - 1, axis=1)

    result=clf.predict(test_x)

采用决策树训练后的分支结果如图14所示。

图 14 训练集决策树分类结果

对降维前的数据也应用决策树分类算法,来比较降维前后预测结果的准确性差异。将测试数据应用到训练好的模型中,计算并查看分类的准确性,检验该实验中的降维是否有提高模型准确性。输出结果如图15-16所示。

图 15 降维前决策树分类准确率

图 16 降维后决策树分类准确率

比较降维前后决策树分类准确率,发现降维后的准确率为89.22%,降维前准确率为89.37%,说明降维对分类结果的影响不大,对模型分类结果进行分析,发现移动房车险数量预测均为0,由于训练集中移动房车险数量字段值为1的数据仅348条,占总体的5.98%,数据集不平衡使得模型分类不具有代表性,因此需要根据样本数据特点平衡数据,调整正负样本的权重值,将未购买移动房车险的记录下采样降为原来的20%,购买移动房车险的记录数量上采样增加为原来的2倍。代码如下。

dataSet = pd.read_excel('data.xlsx')
labels = list(dataSet.columns.values)

df_majority=dataSet[dataSet['移动房车险数量']==0]
df_minority=dataSet[dataSet['移动房车险数量']==1]

df_majority_downsampled=resample(df_majority,
                                 replace=False,n_samples=1095,random_state=123)
df_minority_upsampled=resample(df_minority,
                               replace=True,n_samples=696,random_state=123)
df_all=pd.concat([df_minority_upsampled,df_majority_downsampled])
print(df_all['移动房车险数量'].value_counts())

df_all.to_excel('outputbalance.xlsx')

平衡后的样本移动房车险数量字段分布如图17所示。

图 17 平衡后样本数据分布

对平衡后的样本进行预处理,剔除相关性不显著的特征,并依据保留的特征对测试集进行选择。最后保留45个特征如图18所示。

图 18 保留特征项

对处理后的样本数据采用逻辑回归和决策树分类算法,并输出预测召回率,f1值。可d导入sklearn.metrics库中的accuracy_score和roc_auc_score包评估分类结果。代码如下:

# 创建逻辑回归模型
model = LogisticRegression(
    max_iter=1000,  # 增加迭代次数
    random_state=42,  # 设置随机种子
    solver='lbfgs',  # 使用lbfgs求解器
    C=1.0  # 调整正则化参数
)
model.fit(train_x_scaled, train_y)
lr_result = model.predict(test_x_scaled)
# ========== 决策树模型 ==========
print("\n=== 决策树模型 ===")
clf = tree.DecisionTreeClassifier(random_state=42)
clf.fit(train_x, train_y)
dt_result = clf.predict(test_x)

# 决策树评估
dt_accuracy = accuracy_score(test_y, dt_result)  # 修复:移除normalize参数
dt_recall = metrics.recall_score(test_y, dt_result, average='micro')
dt_f1 = metrics.f1_score(test_y, dt_result, average='weighted')
print('决策树结果:')
print('accuracy:' + str(dt_accuracy))
print('recall:' + str(dt_recall)) 
print('f1:' + str(dt_f1))

输出结果如图19所示。

图 19 结果输出

平衡后的数据逻辑回归准确率为78.6%,f1值为0.836,采用决策树分类所得的准确率为79%,f1值为0.837,相较于逻辑回归有一定提高。

四、运行结果分析

4.1 数据降维和平衡对决策的影响

如果不处理不平衡的数据,模型常常会直接返回占比高的值,导致模型过拟合,测试集上效果非常差。对占比较少的类别进行上采样,对占比较大的类别进行下采样,然后将采样后的样本混合,使得样本集达到平衡。但是为了探索数据是否平衡对各个算法是否都会产生影响,我们对逻辑回归、CART决策树、ID3决策树在原数据集和平衡后的数据集上均进行实验,得到结果如下。

模型

评价指标

原数据集测试值

平衡后数据集测试值

CART决策树

Accuracy

0.9882

0.9805

Precision

0.8351

1.0

Recall

1.0

0.6723

F1

0.9101

0.804

AUC

0.9938

0.8361

ID3决策树

Accuracy

0.9012

0.8100

Precision

0.1660

0.1184

Recall

0.1639

0.3403

F1

0.1649

0.1757

AUC

0.5568

0.6009

逻辑回归

Accuracy

0.9400

0.7860

Precision

0.9074

0.9125

Recall

0.9400

0.7860

F1

0.9128

0.8367

AUC

0.6384

0.7860

模型性能对比及数据集平衡的影响可总结为:CART决策树综合性能最优,原数据集上Accuracy(0.9882)、Recall(1.0)、AUC(0.9938)几乎接近完美,平衡后Precision提升至1.0但Recall和AUC有所下降,仍远超其他模型;逻辑回归在原数据集表现仅次于CART,Accuracy(0.9400)、F1(0.9128)均较高,平衡后各项指标均下降,仅Precision保持在0.9以上,整体性能受数据平衡影响较大;ID3决策树整体表现最差,原数据集Precision仅0.1660、AUC仅0.5568,远低于前两者,平衡后Recall和AUC略有提升但Precision进一步下降,核心指标仍处于极低水平,实用价值有限。

五、总结

     本实验主要根据用户基本特征信息,以及用户历史保险购买情况,来预测用户是否会购买一款移动房车险。通过对数据进行初步的统计性分析,得到购买该移动房车用户的一些集中型特征。在此基础上,采用决策树算法建立模型,对数据进行质量处理和降维,并对样本数据的不平衡进行上采样和下采样处理。平衡后的数据分类准确率为79%,对投保用户特征的预测更为准确。根据逻辑回归模型的相关性系数,用户特征社会阶层D、租房子特征对购买移动房车险的负向影响较显著,公共社保、私人保险、投保人寿险数量、投保火险数量对购买移动房车险的正向影响显著。

五、参考文献

[1]丁世飞 史忠植.人工智能导论.中国工息出版社,电子公工业出版社,2021(09):16-21.

[2]薛薇.Python机器学习数据建模与分析.机械工业出版社,2023.

[3]CSDN开放平台.https://blog.csdn.net. 2023.

[4]赵卫东 董亮.Python机器学习案例(第二版).清华大学出版社, 2022.

[5]赵卫东 董亮.机器学习[M].北京:人民邮电出版社,2018.

[6]周志华.机器学习[M].北京:清华大学出版社,2016.

[7] Miroslav Kubat.机器学习导论[M].王勇,仲国强,孙鑫,译.北京:机械工业出版社,2016.

更多推荐