2019年认证杯SPSSPRO杯数学建模
基于 CART 决策树和 SVR 的客户续保概率预测
C题 保险业的数字化变革
原题再现:
车险,即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度,车险即为分散机动车辆在行驶过程中可能发作的未知风险和损失的一种保障机制。
目前国际车险分为国家强制的交强险和商业险,商业险中的根本险种有第三者责任事故险和车辆损失险。除此之外还有玻璃独自破碎险、车上人员责任险、全车盗抢险、自燃损失险和不计免赔特约条款等附加险种。
近年来,国际保险行业稳步开展,机动车辆保险在我国的财险保费中所占比重最大,以千亿元计。并且,由于我国汽车保有辆的继续增加和相关车险的政策出台,投保率也呈继续上升趋向。
车险一般可占财险公司业务的 70% 到 80%,所以车险市场历来是财险公司的兵家必争之地。以往,财险公司为了赢得市场,往往采取低价、折扣来争抢客户。但是激烈的市场竞争也带来了利润率的下降,甚至有些企业在亏本经营。大多数车企为了提高利润率开始重视承保车辆的质量。重投保车辆质量的做法,其实是险企科学发展的重要体现,是市场竞争下的企业合理行为。
中国目前的车险费率制度,大多数符合"从车主义"。即车险保费多少,主要取决于这辆车本身的各项情况,如车的购置价、座位数、排量、购车年限等,根据这些数据计算出一个基本的车险保费价格,再根据这辆车的上年理赔次数来打不同的折扣。这就导致了中国的车险定价模式非常的单调,相似情况的车型,保费也都差不多。
可以预见未来车险行业的几大发展趋势:
1. 车险价格与驾驶行为密切相关
未来的车险定价将逐渐转变为"从人主义"。车险的定价因素将直接与驾驶人的驾驶习惯与行驶里程挂钩,通过驾驶行为来判定车险价格,可能会使车险由原来的一年买一次变成可以一个月买一次。一个具有良好驾驶习惯的车主,可能只需要支付原本保费的 30% 左右,而驾驶习惯不佳的车主,则会在原本保费的基础上继续上涨。
2. 同价位车型车险价格完全不同
国内传统的汽车保险定价,通常是以车型和其购置价为主要依据。未来中国车险业,同样的一款车,不同的人开,保费价格会完全不同。这个不同可能是取决于投保人本身的驾驶行为,还可能会以投保人本身的年龄、职业、家庭状况等信息为标准。
信息时代的到来,为车险企业提供了一个更加有力的武器,可以通过数字化技术来更加精准地了解客户,制定营销和服务方案。
第一阶段问题:
1. 请建立合理的数学模型,对附件一中提供的客户进行精准画像,给出客户的续保概率。
2. 请针对不同的客户设计不同的优惠和福利方案,以提高续保概率。
整体求解过程概述(摘要)
中国未来车险行业的发展趋势为车险价格与驾驶行为密切相关以及同价位车型车险价格完全不同。在这种情况下,如何对客户进行精准画像十分重要。本文针对题中所给数据信息进行数据挖掘,设计了一套较为科学的预测客户续保概率的模型,并且对提高客户续保概率提出了合理建议。
针对问题一,我们首先对附件中所给数据作初步处理,包括数据清洗和数据预处理两步,剔除部分错误和缺失数据,并利用卡方检验分析各属性与客户是否续保的相关性,得到相关性最强的前 11 个属性组成属性集。然后,将数据按 3:1 划分为训练集和测试集,先利用基于基尼指数的 CART决策树模型进行分析,得到了每个客户的续保概率,并以 0.5 作为阈值对结果进行划分,在测试集上的准确率为 81.41%;再利用支持向量回归(SVR)模型,同样得到了每个客户的续保概率,取同样的阈值,在测试集上的准确率为 81.88%。最后,利用多项式回归和决策树模型分别对两个弱分类器的结果做模型融合,得到测试集的准确率分别为 82.00%和 86.18%,多项式回归对多个模型的融合效果不佳,但决策树模型使结果有了较大的提升,测试集共 15316 行数据,预测正确的有 13282 行,准确率提升了 5%左右,基本上认为预测的结果符合实际情况。
针对问题二,我们利用问题一中卡方检验计算出来的属性相关性,得到对客户续保概率影响最大的几个属性,针对这几个影响较大的属性,我们对保险公司提出了探索车友俱乐部、拓宽销售渠道、对未出险客户提供更加优质的服务等合理建议。
问题分析:
问题一的分析
问题一需要我们建立数学模型,分析客户的续保概率与客户的各个属性间的关系。
首先,我们对数据进行处理,包括数据的清洗、预处理以及相关性分析。数据的清洗包括删除不一致的数据以及删除某个属性中存在的极少数的缺失值;数据的预处理包括属性规约和数量规约,属性规约是删除对后续结果影响不大客户的属性以及缺失值存在过多的属性,数量规约包括相似数据的简并、数据类型的转换以及连续属性离散化。在对数据进行处理之后,我们运行卡方检验对每个属性和客户是否续保进行相关性分析,选取得分前 11 名的属性组成因变量集,并以该属性集中各因素为,作为后续模型建立的基础。
在对数据处理完成之后,我们首先构建了 CART 回归决策树模型,我们从数据中随机选取了 75%的数据作为训练集,25%的数据作为测试集,得到了每个客户的续保概率;为了了解各模型的准确率,我们再次构建了支持向量回归(SVR)的模型,同样将 75%的数据作为训练集,25%的数据作为测试集,得到了每个客户的续保概率,经过对比后发现相较于 CART 决策树,SVR 的对于预测客户续保概率有更高的准确率;
为了保证预测的客户续保概率的精度,继续提高预测的准确率,我们采取经典的模型融合方法。为了保证模型融合的有效性(即单模型的高精度与模型之间的差异性),我们对以上两种不同模型进行模型融合,得到每个客户的续保概率,准确率相较于 CART决策树以及 SVR 都有了提升。
问题二的分析
问题二需要我们针对不同的客户设计不同的优惠和福利方案,以提高续保概率。
首先,我们利用问题一中利用卡方检验计算出来的属性相关性,得到对客户续保概率影响最大的因素,针对这些影响因素,我们对如何提高不同客户的续保概率提出了合理的建议。
模型假设:
1. 假设数据的来源是准确可靠的。
2. 不考虑保险公司伪造数据、客户篡改数据的情况。
3. 假设影响客户是否续保的因素只考虑附件中的数据所给出的因素。
论文缩略图:
全部论文请见下方" 只会建模 QQ名片" 点击QQ名片即可
部分程序代码:(代码和文档not free)
bash
%% 决策树回归
% 读取数据 61266 划分为 45950/15316 为训练集和测试集
X_train = all(1:45950,1:11);
Y_train = all(1:45950,12);
rtree = fitrtree(X_train,Y_train);
X_test = all(45951:61266,1:11);
Y_test = all(45951:61266,12);
Y_pre = predict(rtree,X_test);
Y_new = zeros([15316,1]);
for i=1:15316
if(Y_pre(i,1)>=0.5)
Y_new(i,1)=1;
else
Y_new(i,1)=0;
end
end
counts=0;
for i=1:15316
if(Y_new(i,1)==Y_test(i,1))
counts=counts+1;
end
end
pre_accu = counts/15316;
%% 多模型融合
% 决策树融合
X = [Y_pre,ypre];
Y = Y_test;
new_tree = fitrtree(X,Y);
Y_tree_pre = predict(new_tree,X);
for i=1:15316
if(Y_tree_pre(i,1)>0.5)
Y_tree_pre(i,1)=1;
else
Y_tree_pre(i,1)=0;
end
end
c1=0;
for i=1:15316
if(Y_tree_pre(i,1)==Y_test(i,1))
c1=c1+1;
end
end
middle_accu = c1/15316;
% 利用工具箱/多项式拟合
cftool
y_final = zeros([15316,1]);
Y_final = zeros([15316,1]);
for i=1:15316
y_final(i,1) = -0.04314+0.9949*Y_pre(i,1)+0.3132*ypre(i,1)-0.5478*Y_pre(i,1)...
*Y_pre(i,1)-0.124*Y_pre(i,1)*ypre(i,1)+0.4964*ypre(i,1)*ypre(i,1);
if(y_final(i,1)>0.5)
Y_final(i,1)=1;
else
Y_final(i,1)=0;
end
end
c=0;
for i=1:15316
if(Y_test(i,1)==Y_final(i,1))
c=c+1;
end
end
final_accu = c/15316;
python
%python
# 库函数
import xlrd
import numpy as np
from sklearn.svm import SVR
from sklearn.externals import joblib
# from sklearn.feature_selection import SelectKBest
# from sklearn.feature_selection import chi2
# 读取数据 61266 划分为 45950/15316 为训练集和测试集
docs = open('y_pre.txt', 'w')
data = xlrd.open_workbook('C:/Users/Administrator/Desktop/认证杯/附件一_数据清洗+预
处理 2.xlsx')
sheet = data.sheet_by_name('数据表')
X_train = np.zeros([45950, 19], dtype=float)
Y_train = np.zeros([45950, 1], dtype=float)
X_test = np.zeros([15316, 19], dtype=float)
Y_test = np.zeros([15316, 1], dtype=float)
for i in range(45950):
X_train[i] = sheet.row_values(i+1, 1, -1)
Y_train = sheet.col_values(20, 1, 45951)
for i in range(15316):
X_test[i] = sheet.row_values(i+45951, 1, -1)
Y_test = sheet.col_values(20, 45951, 61267)
'''
# 卡方检验
X = np.zeros([61266, 19], dtype=float)
Y = np.zeros([61266, 1], dtype=float)
for i in range(61266):
X = sheet.row_values(i+1, 1, -1)
Y = sheet.col_values(20, 1, 61267)
model1 = SelectKBest(chi2, k=10) # 选择 k 个最佳特征
print(model1.fit_transform(X, Y)) # X 是特征数据,Y 是标签数据,该函数可以选择出 k
个特征
print(model1.scores_)
print(model1.pvalues_)
'''
# 训练模型并预测
clf = SVR(gamma='scale', C=1.0, epsilon=0.2)
clf.fit(X_train, Y_train)
Y_pre = clf.predict(X_test)
# 保存模型
joblib.dump(clf, 'clf.pkl')
# 读取模型
# clf = joblib.load('clf.pkl')
# 结果分析
for i in range(15316):
print(Y_pre[i], file=docs)
if Y_pre[i] >= 0.5:
Y_pre[i] = 1
else:
Y_pre[i] = 0
counts = 0
for i in range(15316):
if Y_pre[i] == Y_test[i]:
counts = counts + 1
print(counts)