客户贷后还款提醒优化项目

目录:

1 项目背景和问题框架

2 客户还款模型搭建

2.1 数据介绍和特征体系

2.2 机器学习建模和模型评估

3 模型的应用

4 效果评估

1,项目项目背景和问题框架

还款提醒:在信贷场景中,金融机构给客户发放贷款后,在客户账单日前(一般是还钱前7天或5天)会通过短信、微信公众号信息、IVR或语音机器人等 方式进行一次或多次提醒,以告知客户还款时间、还款金额、还款账号等信息。适当的还款提醒有利于敦促客户及时还款,维护良好信用记录,同时也能降低机构账款逾期率,减轻催收成本。但过度的还款提醒,则容易引起客户反感甚至投诉,严重影响客户体验。因此,还款提醒需要寻求提醒效果(降低流入率)和客户体验(大部分客户不会逾期)之间的平衡

当前公司面临的问题:

  • 一方面,流入率长期在两位数的高位,需要加强提醒频次和强度,减轻贷后催收压力;

  • 另一方面,不断有客户反馈自己不会逾期但也频繁收到提醒信息,感觉自己被“催收”了。部分投诉至业务部门或渠道(公司线上线下、C端和小B业务都有),需降低提醒频次和强度,以提升客户体验

现状和解决方案:

公司目前采用相同的提醒频次和强度对所有客户无差别的提醒,现需要对还款客户进行分群,以区分“大概率会逾期”的客户进行重点提醒,降低流入率;“大概率不会逾期”的客户降低提醒频次,提升客户体验

2 客户还款模型搭建

2.1样本定义

数据观察点:还款前7天-0天客户(包含回流客户)

观察期:还款前7天-0天,如客户在此期间还款,则为好样本,如客户D0未还款流入M1,则为坏样本

2.2数据介绍和特征体系

(此处省略取数的大几段SQL和数据清洗过程中的10086个吐槽。。。)

数据集介绍:初始数据集:10154*18,经过特征工程后,剩余8623*12。由于数据为公司某一产品的真实生产数据,模型部亦部署上线,为避免信息泄露,在展示时对数据进行了脱敏处理。

数据特征集如下:

当产品跨度较大时,需要按产品分别建模。不同产品特征选用会有差异。

2.3 机器学习建模和模型比较

主要使用随机森林、逻辑回归进行模型比较。


#数据划分
train = df_d.iloc[:,df_d.columns != "是否流入"]
lab = df_d.iloc[:,df_d.columns == "是否流入"]

xtrain,xtest,ytrain,ytest=train_test_split(train,lab,test_size=0.4,random_state=100)
for i in [xtrain,xtest,ytrain,ytest]:
    i.index = range(i.shape[0])

随机森林建模:


rdf = RandomForestClassifier(max_depth= 3
                           # ,criterion= "entropy"
                             ,n_estimators=100) 
rdf.fit(xtrain,ytrain)


rdf.score(xtrain,ytrain),  rdf.score(xtest,ytest),   cross_val_score(rdf,train,lab,cv=5).mean()

#输出:(0.8476705973323023, 0.8515942028985507, 0.8117818353004471)

网格搜索后可进一步优化参数。

查看特征重要性:


pd.DataFrame([xtrain.columns,rdf.feature_importances_]).T

特征重要性分布:

cutoff=0.5(系统默认)下, 查看混淆矩阵、ks、roc_auc、召回率


y_pred = rdf.predict(xtest)
cnf_matrix = confusion_matrix(ytest, y_pred)
recall_value = recall_score(ytest, y_pred)
precision_value = precision_score(ytest, y_pred)
acc = accuracy_score(ytest, y_pred)
cnf_matrix,     recall_value,       precision_value,       acc
#输出:(array([[2680,   88],
        [ 437,  245]], dtype=int64),
 0.3592375366568915,
 0.7357357357357357,
 0.8478260869565217)


y_score_test = rdf.predict_proba(xtest)[:, 1]
fpr, tpr, thresholds = roc_curve(ytest, y_score_test)
roc_auc = auc(fpr, tpr)
ks = max(tpr - fpr)
ar = 2*roc_auc-1
ks,ar
#输出:(0.5277893139864052, 0.6120090519214143)

roc_auc_score(ytest,rdf.predict(xtest)) 
@输出:0.6786035899858797

逻辑回归建模:


sta = StandardScaler()
sta =sta.fit(train)
train_sta = sta.transform(train)
xtrain_sta = sta.transform(xtrain)
xtest_sta  = sta.transform(xtest)


lr = LogisticRegression( C= 1,
                        penalty = 'l2',
                       # solver = 'sag',
                        class_weight ={0:1,1:3}
                       )
lr = lr.fit(xtrain_sta,ytrain)
lr.score(xtrain_sta,ytrain), cross_val_score(lr,train_sta,lab,cv=4).mean()

#输出:(0.8327856176300019, 0.8076076475728448)

模型评估:


roc_auc_score(ytest,lr.predict(xtest_sta)),
#输出:0.7348038114691573,

y_pred = lr.predict(xtest_sta)
cnf_matrix = confusion_matrix(ytest, y_pred)
recall_value = recall_score(ytest, y_pred)
precision_value = precision_score(ytest, y_pred)
acc = accuracy_score(ytest, y_pred)
cnf_matrix,     recall_value,       precision_value,       acc
#输出:(array([[2485,  283],
        [ 292,  390]], dtype=int64),
 0.5718475073313783,
 0.5794947994056464,
 0.8333333333333334)

#y_score_test = lr.predict_proba(xtest_sta)[:, 1]
fpr, tpr, thresholds = roc_curve(ytest, y_score_test)
roc_auc = auc(fpr, tpr)
ks = max(tpr - fpr)
ar = 2*roc_auc-1
ks,ar
#输出(0.5168452189242791, 0.6334867060498706)

查看predict_proba下预测结果分布:


a = pd.DataFrame(lr.predict_proba(xtest_sta))
b = pd.DataFrame(lr.predict(xtest_sta),columns=['预测值'])
c = pd.DataFrame(ytest)
df_rsi = pd.concat([c,b,a],axis=1)
df_rsi.columns = ["是否流入","预测值","0的概率","1的概率"]
df_rsi


df_rsi["流入概率分箱"] = pd.cut(df_rsi["1的概率"], 
                          bins=[0,0.12,0.25,0.36,0.48,0.6,0.72,1], 
                          right=False,
                          labels=[1, 2, 3, 4, 5,6,7])
df_rsi


pt = pd.pivot_table(df_rsi,
                    index=['流入概率分箱'],
                    fill_value=0,
                    columns=['是否流入'],
                    values=['预测值'],
                    aggfunc=[len],
                    margins=True)
pd.DataFrame(pt)

w = pd.DataFrame(pt)
w.columns = ["zero","one","all"]
w["流入百分比"]= w["one"]/ w["all"]

print(w)

输出:

如上图:只需要对流入概率分箱中3-7约50%的客户进行还款提醒,即可覆盖85%的流入客户。

上线模型选择:

综合考虑:

  • 模型指标和性能

  • 业务实际情况

最终选用逻辑回归分类器进行模型搭建。变量衍生后,经分箱、woe转化,重新拟合模型。

3 模型应用

模型非常简单。部署上线后,在客户还款前七天开始跑数据,得到每个还款客户的predict_proba(流入概率),并同时输出权重得分最高的三个指标(在模型上线后优化)。不同产品策略略有差异,还款提醒策略如下:

4 效果评估

1,ABtest的2个月,客户还款前咨诉率下降55%,有抵押产品流入率下降18%(线下信用贷下降15%,消金产品下降11%)。
2,在客户咨诉时,可以看到影响客户流入概率权重最高的3个指标,因此在客服处理时,模型能快速定位问题,协助客服运营人员选用合适的处理话术。
3,目前模型主要应用于贷后风险、运营环节。模型已运行2年有余,期间迭代2次,当前运行平稳

做过的,简单且效果很好的项目之一

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值