阿里云天池金融风控训练营广东工业-梁钰莹task-3学习笔记
学习链接:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr
一、知识点概要
- 学习特征预处理、缺失值、异常值处理、数据分桶等特征处理方法
- 学习特征交互、编码、选择的相应方法
二、学习内容
2.1 特征预处理 - 缺失值填充
把所有缺失值替换为指定的值0
data_train = data_train.fillna(0)
向用缺失值上面的值替换缺失值
data_train = data_train.fillna(axis=0,method='ffill')
纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值
data_train = data_train.fillna(axis=0,method='bfill',limit=2)
-
时间格式处理
#转化成时间格式
for data in [data_train, data_test_a]:
data['issueDate'] = pd.to_datetime(data['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
#构造时间特征
data['issueDateDT'] = data['issueDate'].apply(lambda x: x-startdate).dt.days -
对earliesCreditLine进行预处理
ata_train['earliesCreditLine'].sample(5)
136347 Aug-2004
,314392 Feb-2002
,135401 Feb-2000
,151874 Aug-2006
,123346 Jun-2000
,Name: earliesCreditLine, dtype: object
for data in [data_train, data_test_a]:
data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
- 类别特征处理
#部分类别特征
cate_features = ['grade', 'subGrade', 'employmentTitle', 'homeOwnership', 'verificationStatus', 'purpose', 'postCode', 'regionCode',
'applicationType', 'initialListStatus', 'title', 'policyCode']
for f in cate_features:
print(f, '类型数:', data[f].nunique())
grade 类型数: 7
subGrade 类型数: 35
employmentTitle 类型数: 79282
homeOwnership 类型数: 6
verificationStatus 类型数: 3
purpose 类型数: 14
postCode 类型数: 889
regionCode 类型数: 51
applicationType 类型数: 2
initialListStatus 类型数: 2
title 类型数: 12058
policyCode 类型数: 1
像等级这种类别特征,是有优先级的可以labelencode或者自映射
2.2异常值处理
1、 检测异常的方法一:均方差
在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。
- 得到特征的异常值后可以进一步分析变量异常值和目标变量的关系
- 例如可以看到异常值在两个变量上的分布几乎复合整体的分布,如果异常值都属于为1的用户数据里面代表什么呢?
删除异常值
for fea in numerical_fea:
data_train = data_train[data_train[fea+'_outliers']=='正常值']
data_train = data_train.reset_index(drop=True)
2、 检测异常的方法二:箱型图
- 总结一句话:四分位数会将数据分为三个点和四个区间,IQR = Q3 -Q1,下触须=Q1 − 1.5x IQR,上触须=Q3 + 1.5x IQR;
2.3 数据分桶
-
特征分箱的目的:
- 从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
-
数据分桶的对象:
- 将连续变量离散化
- 将多状态的离散变量合并成少状态
-
分箱的原因:
- 数据的特征内的值跨度可能比较大,对有监督和无监督中如k-均值聚类它使用欧氏距离作为相似度函数来测量数据点之间的相似度。都会造成大吃小的影响,其中一种解决方法是对计数值进行区间量化即数据分桶也叫做数据分箱,然后使用量化后的结果。
-
分箱的优点:
- 处理缺失值:当数据源可能存在缺失值,此时可以把null单独作为一个分箱。
- 处理异常值:当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。例如,age若出现200这种异常值,可分入“age > 60”这个分箱里,排除影响。
- 业务解释性:我们习惯于线性判断变量的作用,当x越来越大,y就越来越大。但实际x与y之间经常存在着非线性关系,此时可经过WOE变换。
-
特别要注意一下分箱的基本原则:
- (1)最小分箱占比不低于5%
- (2)箱内不能全部是好客户
- (3)连续箱单调
1、固定宽度分箱
当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:09、1099、100999、10009999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子。
2. 分位数分箱
3. 卡方分箱及其他分箱方法的尝试
2.4 特征交互
- 交互特征的构造非常简单,使用起来却代价不菲。如果线性模型中包含有交互特征对,那它的训练时间和评分时间就会从 O(n) 增加到 O(n2),其中 n 是单一特征的数量。
2.5 特征编码
labelEncode 直接放入树模型中
#label-encode:subGrade,postCode,title
#高位类别特征需要进行转换
for col in tqdm(['employmentTitle', 'postCode', 'title','subGrade']):
le = LabelEncoder()
le.fit(list(data_train[col].astype(str).values) + list(data_test_a[col].astype(str).values))
data_train[col] = le.transform(list(data_train[col].astype(str).values))
data_test_a[col] = le.transform(list(data_test_a[col].astype(str).values))
print('Label Encoding 完成')
逻辑回归等模型要单独增加的特征工程
- 对特征做归一化,去除相关性高的特征
- 归一化目的是让训练过程更好更快的收敛,避免特征大吃小的问题
- 去除相关性是增加模型的可解释性,加快预测过程。
#举例归一化过程
#伪代码
for fea in [要归一化的特征列表]:
data[fea] = ((data[fea] - np.min(data[fea])) / (np.max(data[fea]) - np.min(data[fea])))
2.6 特征选择
1、 Filter(过滤式)( 基于特征间的关系进行筛选)
-
方差选择法
方差选择法中,先要计算各个特征的方差,然后根据设定的阈值,选择方差大于阈值的特征 -
相关系数法(pearson 相关系数)
Pearson 相关系数 皮尔森相关系数是一种最简单的,可以帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性。 结果的取值区间为 [-1,1] , -1 表示完全的负相关, +1表示完全的正相关,0 表示没有线性相关。 经典的卡方检验是用于检验自变量对因变量的相关性。 假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距。 其统计量如下: χ2=∑(A−T)2T,其中A为实际值,T为理论值
(注:卡方只能运用在正定矩阵上,否则会报错Input X must be non-negative)
- 互信息法
经典的互信息也是评价自变量对因变量的相关性的。 在feature_selection库的SelectKBest类结合最大信息系数法可以用于选择特征
2 、Wrapper(包裹式) (RFE)
- 递归特征消除法
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。 在feature_selection库的RFE类可以用于选择特征
3 、Embedded(嵌入式)
-
基于惩罚项的特征选择法
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。 在feature_selection库的SelectFromModel类结合逻辑回归模型可以用于选择特征 -
基于树模型的特征选择
树模型中GBDT也可用来作为基模型进行特征选择。 在feature_selection库的SelectFromModel类结合GBDT模型可以用于选择特征
2.7总结
特征工程是机器学习,甚至是深度学习中最为重要的一部分,在实际应用中往往也是所花费时间最多的一步。各种算法书中对特征工程部分的讲解往往少得可怜,因为特征工程和具体的数据结合的太紧密,很难系统地覆盖所有场景。本章主要是通过一些常用的方法来做介绍,例如缺失值异常值的处理方法详细对任何数据集来说都是适用的。但对于分箱等操作本章给出了具体的几种思路,需要读者自己探索。在特征工程中比赛和具体的应用还是有所不同的,在实际的金融风控评分卡制作过程中,由于强调特征的可解释性,特征分箱尤其重要。
三、问题与解答
3.1问:为什么要进行特征选择?
答:1、特征数量与分类器性能的关系
一般来说,进入模型的特征数量与模型的效果之间满足以下曲线,在某个位置达到最优。过多或过少都会使分类器的效果发生严重的下降。
2、特征不足的影响
当特征不足时,极易发生数据重叠,这种情况下任何分类器都会失效。如下图所示,仅依赖x1或x2都是无法区分这两类数据的。
3、特征冗余的影响
增加特征可以理解为向高维空间映射,当这个“维度”过高时,容易造成同类数据在空间中的距离边远,变稀疏,这也易使得很多分类算法失效。如下图所示,仅依赖x轴本可划分特征,但y轴的引入使得同一类别不再聚集。
4、特征选择的难点问题
首先我们已经明确,特征选择解决的工程问题是:当我们拥有大量特征时,需要判断哪些是相关特征、哪些是不相关特征。因而,特征选择的难点在于:其本质是一个复杂的组合优化问题。
当我们构建模型时,假设拥有N维特征,每个特征有两种可能的状态:保留和剔除。那么这组状态集合中的元素个数就是2N。如果使用穷举法,其时间复杂度即为O(2N)。假设N仅为10时,如果穷举所有特征集合,需要进行1024次尝试。这将是巨大的时间和计算资源的消耗,因而在特征选择时,我们需要找到明智的方法。
3.2问:进行特征选择时的过程?
答:1、生成过程:生成候选的特征子集;
2、评价函数:评价特征子集的好坏;
3、停止条件:决定什么时候该停止;
4、验证过程:特征子集是否有效;
四、学习总结
本节对特征工程进行了深度学习,帮助我们更好地从原始数据筛选出更好的数据特征,这对我们后来学习数据结构和数据处理有很大帮助。而代码的难度越来越大,还需要不断加强对代码的学习。