在完成第三部分的特征工程之后,我们认为我们已经获得了想要的并且标准的数据,接下来就可以将数据放到合适的模型算法之中来训练模型,通过调整模型的参数来使得模型更健壮,这一部分主要做的就是建模及调整参数。
这一部分的学习分为两个部分,一个是金融风控常用的机器学习模型的学习,第二个是这些模型的实际应用与调参。
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
这一部分我们通过以下五个点来了解这个算法,分别是
1.逻辑回归的假设
2.逻辑回归的损失函数
3.逻辑回归的求解方法
4.逻辑回归的目的
5.逻辑回归如何分类
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.它的损失函数就是他的极大似然函数。我可以设它的概率函数为:
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∗(1−hθ(x;θ))1−y
其中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=1∏mf(xi;θ)=i=1∏mhθ(xi;θ)yi∗(1−hθ(xi;θ))1−yi
因为无法求解,所以我们需要进行梯度下降来不断逼近最优解
1.批梯度下降(batch GD)
批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量很大,参数更新慢。
2.随机梯度下降(SGD)
该方法是以高方差频繁更新,优点是使得sgd会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。
3.小批量梯度下降(small batch GD)
小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。
4.Adam
在SGD的基础上,Adam算法还做了学习率自优化的过程,防止学习率过大过小带来的问题,是目前非常好的方法。
该函数的目的便是将数据二分类,提高准确率。
逻辑回归作为一个回归(也就是y值是连续的),如何应用到分类上去呢。y值确实是一个连续的变量。逻辑回归的做法是划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。阈值具体如何调整根据实际情况选择。一般会选择0.5做为阈值来划分。
1.优点
2.缺点
1.决策树模型的优缺点
优点:
在介绍完上面的两个模型之后,我们来介绍一些集成模型集成方法:
1.bagging
2.boosting
集成方法是将多个弱学习器结合成一个强学习器,集成模型的泛化能力一般都比较好。常见的基于Baggin思想的集成模型有:随机森林、基于Boosting思想的集成模型有:Adaboost、GBDT、XgBoost、LightGBM等。
bagging与boosting的区别:
1.留出法
留出法是直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。
2.交叉验证
k折交叉验证通常将数据集D分为k份,其中k-1份作为训练集,剩余的一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。
3.自助法
我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。
4.数据集划分方法的总结
这里主要介绍ROC和AUC。
5.1ROC(Receiver Operating Characteristic)
ROC空间将假正例率(FPR)定义为 X 轴,真正例率(TPR)定义为 Y 轴。
ROC曲线越接近左上角,该分类器的性能越好,其泛化性能就越好。而且一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting。
对于不同的两个模型如何判断模型的泛化能力的好坏有以下两种方法:
1.若一个模型的ROC曲线可以完全覆盖另一个,那么就说明前一个模型更好
2.若有交集,则计算该ROC曲线覆盖的面积大小(AUC)来判断模型的好坏
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)
1.贪心算法
先使用当前对模型影响最大的参数进行调优,达到当前参数下的模型最优化,再使用对模型影响次之的参数进行调优,如此下去,直到所有的参数调整完毕。
该方法的缺点是容易陷入局部最优而不是全局最优,优点是该方法只需一步一步进行参数调优即可,容易理解。
2.网格搜索
sklearn 提供GridSearchCV用于进行网格搜索,只需要把模型的参数输进去,就能给出最优化的结果和参数。相比起贪心调参,网格搜索的结果会更优,但是网格搜索只适合于小数据集,一旦数据的量级上去了,很难得出结果。
3.贝叶斯调参
贝叶斯调参的主要思想是:给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布)。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。
贝叶斯调参的步骤如下: