天池金融风控-贷款违约预测新人赛之建模调参

在完成第三部分的特征工程之后,我们认为我们已经获得了想要的并且标准的数据,接下来就可以将数据放到合适的模型算法之中来训练模型,通过调整模型的参数来使得模型更健壮,这一部分主要做的就是建模及调整参数。

这一部分的学习分为两个部分,一个是金融风控常用的机器学习模型的学习,第二个是这些模型的实际应用与调参。

1.机器学习算法的学习

1.1Logistic回归

逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
这一部分我们通过以下五个点来了解这个算法,分别是

1.逻辑回归的假设
2.逻辑回归的损失函数
3.逻辑回归的求解方法
4.逻辑回归的目的
5.逻辑回归如何分类
1.1.1逻辑回归的假设

1.逻辑回归第一个假设数据服从伯努利分布(0-1分布),逻辑回归中我们假设样本为正的概率为 h θ ( x ) h_\theta(x) hθ(x),则可以表示为 h θ ( x ; θ ) = p h_\theta(x;\theta) = p hθ(x;θ)=p
2.第二个假设是假设样本为正的概率为: p = 1 1 + e ( − θ T x ) p = \frac{1}{1+e^{(-\theta^Tx)}} p=1+e(θTx)1
所以最终逻辑回归的形式是
h θ ( x ; θ ) = 1 1 + e ( − θ T x ) h_\theta(x;\theta) =\frac{1}{1+e^{(-\theta^Tx)}} hθ(x;θ)=1+e(θTx)1

1.1.2逻辑回归的损失函数

1.它的损失函数就是他的极大似然函数。我可以设它的概率函数为:
f ( x ; θ ) = h θ ( x ; θ ) y ∗ ( 1 − h θ ( x ; θ ) ) 1 − y f(x;\theta)=h_\theta(x;\theta)^y*(1-h_\theta(x;\theta))^{1-y} f(x;θ)=hθ(x;θ)y(1hθ(x;θ))1y
其中x为输入,y为输出, θ \theta θ是未知参数,则它的极大似然函数为:
L θ ( x ) = ∏ i = 1 m f ( x i ; θ ) = ∏ i = 1 m h θ ( x i ; θ ) y i ∗ ( 1 − h θ ( x i ; θ ) ) 1 − y i L_{\theta}(x)=\prod_{i=1}^{m}{f(x^i;\theta)}=\prod_{i=1}^{m}h_\theta(x^i;\theta)^{y^i}*(1-h_\theta(x^i;\theta))^{1-y^i} Lθ(x)=i=1mf(xi;θ)=i=1mhθ(xi;θ)yi(1hθ(xi;θ))1yi

1.1.3逻辑回归的求法

因为无法求解,所以我们需要进行梯度下降来不断逼近最优解
1.批梯度下降(batch GD)
批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量很大,参数更新慢。

2.随机梯度下降(SGD)
该方法是以高方差频繁更新,优点是使得sgd会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。

3.小批量梯度下降(small batch GD)
小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。

4.Adam
在SGD的基础上,Adam算法还做了学习率自优化的过程,防止学习率过大过小带来的问题,是目前非常好的方法。

1.1.4逻辑回归的目的

该函数的目的便是将数据二分类,提高准确率。

1.1.5逻辑回归如何分类

逻辑回归作为一个回归(也就是y值是连续的),如何应用到分类上去呢。y值确实是一个连续的变量。逻辑回归的做法是划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。阈值具体如何调整根据实际情况选择。一般会选择0.5做为阈值来划分。

1.2逻辑回归的优缺点

1.优点

  • 模型简单,可解释性强
  • 在工程上(作为baseline)接受度还挺高的,模型效果不错
  • 训练速度快
  • 消耗内存小
  • 方便输出结果调整

2.缺点

  • 需要预先处理缺失值和异常值
  • 不能解决非线性问题(逻辑回归决策面是线性的)
  • 对多重共线性敏感,不宜处理数据不平衡的问题
  • 准确率较低,因为模型简单(类似于线性模型),有的时候很难拟合数据的真实分布

2.决策树模型

1.决策树模型的优缺点
优点:

  • 简单直观,生成的决策树可以可视化展示
  • 数据不需要预处理即可以放进模型训练
  • 既可处理连续值又可以处理离散值
    缺点:
  • 容易过拟合,泛化能力差(剪枝)
  • 用贪心算法求最优解,容易陷入局部最优

3.集成模型

在介绍完上面的两个模型之后,我们来介绍一些集成模型集成方法:
1.bagging
2.boosting
集成方法是将多个弱学习器结合成一个强学习器,集成模型的泛化能力一般都比较好。常见的基于Baggin思想的集成模型有:随机森林、基于Boosting思想的集成模型有:Adaboost、GBDT、XgBoost、LightGBM等。
bagging与boosting的区别:

  • 样本选择上: Bagging方法的训练集是从原始集中有放回的选取,所以从原始集中选出的各轮训练集之间是独立的;而Boosting方法需要每一轮的训练集不变,只是训练集中每个样本在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整
  • 样例权重上: Bagging方法使用均匀取样,所以每个样本的权重相等;而Boosting方法根据错误率不断调整样本的权值,错误率越大则权重越大
  • 预测函数上: Bagging方法中所有预测函数的权重相等;而Boosting方法中每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重
  • 并行计算上: Bagging方法中各个预测函数可以并行生成;而Boosting方法各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

4.模型评估方法

1.留出法
留出法是直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。

2.交叉验证
k折交叉验证通常将数据集D分为k份,其中k-1份作为训练集,剩余的一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。

3.自助法
我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。

4.数据集划分方法的总结

  • 对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
  • 对于数据集小且难以有效划分训练/测试集时使用自助法
  • 对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确

5模型评价标准

这里主要介绍ROC和AUC。
5.1ROC(Receiver Operating Characteristic)

ROC空间将假正例率(FPR)定义为 X 轴,真正例率(TPR)定义为 Y 轴。
ROC

ROC曲线越接近左上角,该分类器的性能越好,其泛化性能就越好。而且一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting。
对于不同的两个模型如何判断模型的泛化能力的好坏有以下两种方法:
1.若一个模型的ROC曲线可以完全覆盖另一个,那么就说明前一个模型更好
2.若有交集,则计算该ROC曲线覆盖的面积大小(AUC)来判断模型的好坏

6.代码

1.先导入相关的包和相关设置

import pandas as pd
import numpy as np
import warnings
import os
import seaborn as sns
import matplotlib.pyplot as plt
"""
sns 相关设置
@return:
"""
# 声明使用 Seaborn 样式
sns.set()
# 有五种seaborn的绘图风格,它们分别是:darkgrid, whitegrid, dark, white, ticks。默认的主题是darkgrid。
sns.set_style("whitegrid")
# 有四个预置的环境,按大小从小到大排列分别为:paper, notebook, talk, poster。其中,notebook是默认的。
sns.set_context('talk')
# 中文字体设置-黑体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决保存图像是负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 解决Seaborn中文显示问题并调整字体大小
sns.set(font='SimHei')

2.通过调整数据类型来减少数据在内存占用的空间

def reduce_mem_usage(df):
    start_mem = df.memory_usage().sum() 
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:
        col_type = df[col].dtype
        
        if col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            df[col] = df[col].astype('category')

    end_mem = df.memory_usage().sum() 
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    
    return df

3.建立模型(lgb)

7.模型调参

1.贪心算法
先使用当前对模型影响最大的参数进行调优,达到当前参数下的模型最优化,再使用对模型影响次之的参数进行调优,如此下去,直到所有的参数调整完毕。
该方法的缺点是容易陷入局部最优而不是全局最优,优点是该方法只需一步一步进行参数调优即可,容易理解。

2.网格搜索
sklearn 提供GridSearchCV用于进行网格搜索,只需要把模型的参数输进去,就能给出最优化的结果和参数。相比起贪心调参,网格搜索的结果会更优,但是网格搜索只适合于小数据集,一旦数据的量级上去了,很难得出结果。

3.贝叶斯调参
贝叶斯调参的主要思想是:给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布)。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。

贝叶斯调参的步骤如下:

  • 定义优化函数(rf_cv)
  • 建立模型
  • 定义待优化的参数
  • 得到优化结果,并返回要优化的分数指标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值