模型优化

本文是《智能风控原理、算法和工程实践》第7章学习笔记。
  模型融合是指根据不同的数据或模型特点选择合适的模型进行融合,从而直接或间接提升模型在未来样本上的表现。

多损失函数分段预测

  基于多损失函数的模型融合方法,使用不同的损失函数分别训练多个模型,用于在不同样本集上进行预测。这种融合方法称作“后融合”,即将多个训练得到的模型结果进行加权平均或分段预测。
  下面介绍两种损失函数。

  • 平均绝对差值(MAE)
    绝对误差的平均值,通常用来衡量模型预测结果对标准结果的接近程度。
    M A E = 1 n ∑ i = 1 n ∣ p r e d i − y i ∣ MAE=\frac{1}{n}\sum_{i=1}^n|pred_i-y_i| MAE=n1i=1nprediyi

  • 均方误差(MSE)
    参数估计值与参数值之差的平方的期望值。
    M S E = 1 n ∑ i = 1 n ( p r e d i − y i ) 2 MSE=\frac{1}{n}\sum_{i=1}^n(pred_i-y_i)^2 MSE=n1i=1n(prediyi)2
      由于MSE损失函数能够加大对异常值的惩罚,在高分段和低分段能获得更好的表现,使用MAE的模型在中分段能获得更好的表现。因此可以结合使用以MSE和MAE为损失函数的模型,分段进行预测。
      下面使用lightgbm建模并进行融合,只列出关键代码。

# ‘regression_l1’表示MAE损失函数
lgb_param_l1={
    'learning_rate':0.01,
    'objective':'regression_l1'
}
# ‘regression_l2’表示MSE损失函数
lgb_param_l2={
    'learning_rate':0.01,
    'objective':'regression_l2'
}
#第一种参数预测
clf1=lgb.LGBMRegressor(**lgb_param_l1)
clf1.fit(X_train,y_train,eval_set=[(X_train,y_train),(X_val,y_val)],eval.metric='mae',early_stopping_round=200)
#预测的划分出来的测试集的标签
pred_val1=clf1.predict(X_val,num_iteration=clf.best_iteration_)
vali_mae1=accuracy_score(y_val,np.round(pred_val))
# 预测的未来标签的测试集的标签
pred_test1=clf.predict(test[feature_name],num_iteration=clf.best_iteration)

#第二种参数预测
clf2=lgb.LGBMRegressor(**lgb_param_l1)
clf2.fit(X_train,y_train,eval_set=[(X_train,y_train),(X_val,y_val)],eval.metric='mae',early_stopping_round=200)
#预测的划分出来的测试集的标签
pred_val2=clf1.predict(X_val,num_iteration=clf.best_iteration_)
vali_mae2=accuracy_score(y_val,np.round(pred_val))
# 预测的未来标签的测试集的标签
pred_test2=clf.predict(test[feature_name],num_iteration=clf.best_iteration)

#模型参数进行融合之后的结果
pred_test=pd.DataFrame()
pred_test['ranks']=list(range(50000))
pred_test['result']=1
pred_test.loc[pred_test.ranks<400,'result']=pred_test1.loc[pred_test1.ranks<400,'pred_mae']*0.4+pred_test2.loc[pred_test2.ranks<400,'pred_mae']*0.6
pred_test.loc[pred_test.ranks>46000,'result']=pred_test1.loc[pred_test1.ranks>46000,'pred_mae']*0.4+pred_test2.loc[pred_test2.ranks>46000,'pred_mae']*0.6

  这种模型融合方法在实际生产环境中较难部署,因为需要提前确定每一个贷款客户使用何种模型打分,通常难以实现。所以在实际应用中,通常将不同的模型分数加权组合得到用户的最终分数。如使用AUC值作为权重将不同模型的结果进行组合。

树模型特征衍生

  由于逻辑回归等线性模型很难发掘特征之间的非线性关系,因此实际应用中效果会差于树模型。通过树模型与逻辑回归模型相结合,可以增加线性模型的非线性能力。在实际应用中,常使用XGboost或LightGBM来进行特征衍生。

LR+离散特征优势

  在工业界,很少直接将连续值作为特征喂给逻辑回归模型,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:

1)稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展)。

2)离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。

3)逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合。

4)离散化后可以进行特征交叉,由M+N个变量变为 M ∗ N M*N MN个变量,进一步引入非线性,提升表达能力。

5)特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问。

6)离散后每一个特征的每一个取值对应着评分卡加减分数,业务上更容易理解。

海量离散特征+LR是业内常见的一个做法。而少量连续特征+复杂模型是另外一种做法,例如GBDT。
模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。
GBDT离散化

  使用GBDT编码,可以解决人工组合特征过程中不知道切分点选取、不知道离散化多少份的问题。因为切分点选取根据均方差减小,客观选取切分点和份数。每颗决策树从根节点到叶节点的路径,会经过不同的特征,此路径就是特征组合,包括二阶、三阶等,这取决于树的深度。
  由于GDBT在线预测比较困难,而且训练时间复杂度高于LR。所以实际中,可以离线训练GDBT,然后将该模型作为在线ETL的一部分。

融合方案详解

在介绍这个模型之前,先来介绍两个问题:

1)为什么建树采用ensemble决策树,而不是单棵的决策树模型:
  • 一棵树的表达能力很弱,不足以表达多个有区分性的特征组合。
  • 多棵树的表达能力更强一些。可以更好的发现有效的特征和特征组合
2)为什么建树采用GBDT而非RF:
  • RF也是多棵树,但从效果上有实践证明不如GBDT。
  • 且GBDT前面的树,特征分裂主要体现对多数样本有区分度的特征。
  • 后面的树,主要体现的是经过前N颗树,残差仍然较大的少数样本。
  • 优先选用在整体上有区分度的特征,再选用针对少数样本有区分度的特征,思路更加合理,这应该也是用GBDT的原因。
下面看一下二者是如何融合的。

  GBDT用来对训练集提取特征作为新的训练输入数据,LR作为新训练输入数据的分类器。

具体步骤:

1)GBDT首先对原始训练数据做训练,得到一个二分类器,当然这里也需要利用网格搜索寻找最佳参数组合。

2)与通常做法不同的是,当GBDT训练好做预测的时候,输出的并不是最终的二分类概率值,而是要把模型中的每棵树计算得到的预测概率值所属的叶子结点位置记为1,这样,就构造出了新的训练数据。在用GBDT构造新的训练数据时,采用的正是One-hot方法。并且由于每一弱分类器有且只有一个叶子节点输出预测结果,所以在一个具有n个弱分类器、共计m个叶子结点的GBDT中,每一条训练数据都会被转换为 1 * m 维稀疏向量,且有n个元素为1,其余m-n 个元素全为0。

3)新的训练数据构造完成后,下一步就要与原始的训练数据中的label(输出)数据一并输入到Logistic Regression分类器中进行最终分类器的训练。思考一下,在对原始数据进行GBDT提取为新的数据这一操作之后,数据不仅变得稀疏,而且由于弱分类器个数,叶子结点个数的影响,可能会导致新的训练数据特征维度过大的问题,因此,在Logistic Regression这一层中,可使用正则化来减少过拟合的风险。

df_train = data[data.obs_mth != '2018-11-30'].reset_index().copy()
df_test = data[data.obs_mth == '2018-11-30'].reset_index().copy()
NUMERIC_COLS = ['person_info','finance_info','credit_info','act_info']

from sklearn.preprocessing import OneHotEncoder,LabelEncoder

lgb_train = lgb.Dataset(df_train[NUMERIC_COLS], df_train['bad_ind'], free_raw_data=False)
params = {
    'num_boost_round': 50,
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'num_leaves': 2,
    'metric': 'auc',
    'max_depth':1,
    'feature_fraction':1,
    'bagging_fraction':1,
}
model = lgb.train(params,lgb_train)
leaf = model.predict(df_train[NUMERIC_COLS],pred_leaf=True)
lgb_enc = OneHotEncoder()
lgb_enc.fit(leaf)
data_leaf = np.hstack((lgb_enc.transform(leaf).toarray(),df_train[NUMERIC_COLS]))

train, val, train_y, val_y = train_test_split(data_leaf,df_train['bad_ind'],test_size=0.2, random_state=random.choice(range(10000)))

lgb_lm = LogisticRegression(penalty='l1',C = 0.3,solver='liblinear')
lgb_lm.fit(train, train_y)

y_pred_lgb_lm_train = lgb_lm.predict_proba(train)[:, 1]
fpr_lgb_lm_train, tpr_lgb_lm_train, _ = roc_curve(train_y, y_pred_lgb_lm_train)

y_pred_lgb_lm = lgb_lm.predict_proba(val)[:, 1]
fpr_lgb_lm, tpr_lgb_lm, _ = roc_curve(val_y, y_pred_lgb_lm)

plt.figure(1)
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr_lgb_lm_train, tpr_lgb_lm_train, label='LGB + LR train')
plt.plot(fpr_lgb_lm, tpr_lgb_lm, label='LGB + LR test')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC curve')
plt.legend(loc='best')
plt.show()
print('LGB+LR train ks:',abs(fpr_lgb_lm_train - tpr_lgb_lm_train).max(),'LGB+LR AUC:', metrics.auc(fpr_lgb_lm_train, tpr_lgb_lm_train))
print('LGB+LR test ks:',abs(fpr_lgb_lm - tpr_lgb_lm).max(),'LGB+LR AUC:', metrics.auc(fpr_lgb_lm, tpr_lgb_lm))

  这样生成的五十维特征有过拟合的风险,所以通过PSI和树模型的特征重要度来进行特征筛选。筛选的阈值可以选原始特征中最大(小)的PSI(特征重要度)。

时间序列建模

介绍了RNN、LSTM算法,使用LSTM建立一张行为评分卡作为案例。

高维稀疏数据集建模

  风控领域还有一种自动组合特征的模型叫作因子分解机(FM),可以实现元素级别的深层次特征交叉,且对输入数据的稀疏性不敏感。
  比如通过用户APP列表进行建模,如果对APP特征进行one-hot编码,特征就会很稀疏。如果将这样的稀疏数据带入模型效果模型的训练结果将很难得到保证,但FM模型可以很好地处理这种问题。
FM的本质是对原始稀疏特征做嵌入得到低维稠密特征。

模型融合

  如果对模型的解释性要求较低,则可以使用多模型融合提高模型的表现。主流的融合方法就是基于AUC值的加权平均方法。多模型融合不能保证最终模型的效果一定提升,但是可以有效减小整体模型的方差。

业务应用方案

  平台审批策略非常依赖于外部数据,如果某天外部数据突然被切断,将会对业务造成非常大的影响。因此在面对不稳定数据源的场景时,需要思考如何进行数据源和模型变量的配置。

  根据每种数据源训练一个独立模型,使用每个单模型离线训练时的AUC值作为融合权重,加权平均得到最终用户的概率值后再通过映射得到信用评分。融合时需要注意几点:

  1. 对分数进行标准化。使多个模型的分值代表相同含义。
  2. 对权重进行标准化。先判断当前样本被哪些数据源覆盖。标准化公式为:

小结

  本章介绍了两种提升模型效果的融合方案,以及针对时间序列和高维稀疏数据的建模方法,然后介绍多模型融合一些技巧。在实际应用中,还需要根据具体数据、场景进行模型选择和融合。

【作者】:Labryant
【原创公众号】:风控猎人
【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
【转载说明】:转载请说明出处,谢谢合作!~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值