数据挖掘】金融风控 Task04 建模与调参


1. 常用模型对比及评估

1.1. 逻辑回归与决策树模型

优点 缺点
逻辑回归 - 训练速度较快,分类的时候,计算量仅仅只和特征的数目相关;
- 简单易理解,模型的可解释性非常好,从特征的权重可以看到不同的特征对最后结果的影响;
- 适合二分类问题,不需要缩放输入特征;
- 内存资源占用小,只需要存储各个维度的特征值;
逻辑回归需要预先处理缺失值和异常值;
- 不能用Logistic回归去解决非线性问题,因为Logistic的决策面是线性的;
- 对多重共线性数据过于敏感,且很难处理数据不平衡的问题;
- 准确率并非很高,因为形式非常简单,很难去拟合数据的真实分布;
决策树 - 简单直观,生成的决策树可以可视化展示
- 数据不需要预先,不需要归一化,不需要处理缺失数据
- 既可以处理离散值,也可以处理连续值
- 决策树算法非常容易过拟合,导致泛化能力不强(可进行适当的剪枝)
- 采用的是贪心算法,容易得到局部最优解

1.2 集成方法

通过组合多个学习器来完成学习任务,通过集成方法,可以将多个弱学习器组合成一个强分类器,因此集成学习的泛化能力一般比单一分类器要好。
在这里插入图片描述

集成方法主要包括装袋和装卸,装袋和装卸都是将现有的分类或回归算法通过某种方式组合起来,形成一个更加强大的分类。两种方法都是把几个分类器整合为一个分类器的常见的基于Baggin思想的集成模型有:随机森林,基于Boosting思想的集成模型有:Adaboost,GBDT,XgBoost,LightGBM等。

1.2.1 bagging

在这里插入图片描述
Bagging即套袋法,先说一下bootstrap,bootstrap也称为自助法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:

A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

1.2.2 boosting

在这里插入图片描述
其主要思想是将弱分类器组装成一个强分类器。在PAC(probably approximately correct,概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。

关于Boosting的两个核心问题:

1)在每一轮如何改变训练数据的权值或概率分布?

通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

2)通过什么方式来组合弱分类器?

通过加法模型将弱分类器进行线性组合,比如:

- AdaBoost(Adaptive boosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

- GBDT(Gradient Boost Decision Tree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。

1.2.3 bagging与boosting区别

1、Bagging和Boosting的区别:
(1)样本选择上:

  • Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
  • Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

(2)样例权重:

  • Bagging:使用均匀取样,每个样例的权重相等

  • Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

(3)预测函数:

  • Bagging:所有预测函数的权重相等。

  • Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
    (4)并行计算:

  • Bagging:各个预测函数可以并行生成

  • Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

相关参考:

1.3 模型评估方法

对于模型来说,在其训练集上面的误差称之为训练误差或者经验误差,在而集测试的上称之为误差测试误差。

我们通常将已有的数据集划分为训练集和测试集两部分,其中训练集使用训练模型,而测试集则是用来评估模型关于新样本的判别能力的。

1.3.1 数据集划分条件

  • 训练集和测试集的分布要与样本真实分布一致,即训练集和测试集要保证是从样本真实分布中独立同分布采样而得;
  • 训练集和测试集要互斥

1.3.2 数据集划分方法

  • ①留出法

留出法是直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。需要注意的是在划分的时候要保证数据分布的一致性,即避免因数据分割过程约会额外的偏差而对最终结果产生影响。为了保证数据分布的一致性,通常我们采用分段采样的方式来对数据进行采样。

提示:通常,重置数据集D中大约2/3〜4/5的样本作为训练集,其余的作为测试集。

  • ②交叉验证法

k折除验证通常将数据集D分为k份,其中k-1份作为训练集,剩余的一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。对验证中数据集的划分依然是依据分段采样的方式来进行。

对于交叉验证法,其k值的选取经常决定了评估结果的稳定性和保真性,通常k值选取10。

当k = 1的时候,我们称为留一法

  • ③自助法

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

进行这样采样的原因是因为在D中约有36.8%的数据没有在训练集中出现过。留出法与交叉验证法都是使用分层采样的方式进行数据采样与划分,而自助法则是使用有放回重复采样的方式进行数据采样

1.3.3 模型评价标准

常见的标准有auc、ks、f1-score,具体见
【数据挖掘】金融风控 Task01 赛题理解


2. 模型训练

2.1 导入数据并进行预处理

导入相关包及配置


import pandas as pd 
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
import os
'''
sns相关配置
'''
#声明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')

读取数据,此处定义了一个reduce_mem_usage函数来调整数据类型,以减少数据在内存中占用的空间

def reduce_mem_usage(df):
    #利用start_mem来记录最开始的内存空间
    start_mem=df.memory_usage().sum()
    print('最开始dataframe占用的空间是{:.2f}MB'.format(start_mem))
    
    for col in df.columns: #col_type是df每个属性的类型
        col_type = df[col].dtype
        
        if col_type!=object: #如果不是对象类型
            c_max=df[col].max()
            c_min=df[col].min()
            
            #对int类型的进行处理
            if str(col_type)[:3]=='int':
                #通过iinfo来获得某个属性的最大/最小值
                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')
            '''
            实际应用pandas过程中,经常会用到category数据类型,
            通常以string的形式显示,包括颜色(红,绿,蓝),
            尺寸的大小(大,中,小),还有地理信息等(国家,省份)
            category类型处理https://www.cnblogs.com/onemorepoint/p/9407638.html
            '''
    end_mem=df.memory_usage().sum()
    print('经过处理后dataframe占用的空间是{:.2f}MB'.format(end_mem))
    print('节省的空间为{:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    
    return df

读取训练集和测试集

#读取训练集
data_train=pd.read_csv('train.csv')
data_train=reduce_mem_usage(data_train)

在这里插入图片描述

#读取测试集
data_test_a=pd.read_csv('testA.csv')
data_test_a=reduce_mem_usage(data_test_a)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值