广东工业大学金融风控大赛-Task3学习大赛

学习目标

今天主要是学习怎么处理数据的特征,还有数据的预分析。

内容介绍

  • 数据预处理
    • 缺失值的填充
    • 时间格式处理
    • 对象类型特征转换到数值
  • 异常值处理
    • 基于3segama原则
    • 基于箱型图
  • 数据分箱
    • 固定宽度分箱
    • 分位数分箱
      • 离散数值型数据分箱
      • 连续数值型数据分箱
    • 卡方分箱(选做作业)
  • 特征交互
    • 特征和特征之间组合
    • 特征和特征之间衍生
    • 其他特征衍生的尝试(选做作业)
  • 特征编码
    • one-hot编码
    • label-encode编码
  • 特征选择
    • 1 Filter
    • 2 Wrapper (RFE)
    • 3 Embedded

导入包并读取数据

 

 
 
Requirement already satisfied: catboost in d:\pycharm\ynn\lib\site-packages (0.15.2)

Requirement already satisfied: matplotlib in d:\pycharm\ynn\lib\site-packages (from catboost) (3.1.0)

Requirement already satisfied: plotly in d:\pycharm\ynn\lib\site-packages (from catboost) (3.10.0)

Requirement already satisfied: numpy>=1.16.0 in d:\pycharm\ynn\lib\site-packages (from catboost) (1.16.4)

Requirement already satisfied: six in d:\pycharm\ynn\lib\site-packages (from catboost) (1.12.0)

Requirement already satisfied: pandas>=0.19.1 in d:\pycharm\ynn\lib\site-packages (from catboost) (0.24.2)

Requirement already satisfied: graphviz in d:\pycharm\ynn\lib\site-packages (from catboost) (0.11.1)

Requirement already satisfied: python-dateutil>=2.1 in d:\pycharm\ynn\lib\site-packages (from matplotlib->catboost) (2.8.0)

Requirement already satisfied: kiwisolver>=1.0.1 in d:\pycharm\ynn\lib\site-packages (from matplotlib->catboost) (1.1.0)

Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in d:\pycharm\ynn\lib\site-packages (from matplotlib->catboost) (2.4.0)

Requirement already satisfied: cycler>=0.10 in d:\pycharm\ynn\lib\site-packages (from matplotlib->catboost) (0.10.0)

Requirement already satisfied: decorator>=4.0.6 in d:\pycharm\ynn\lib\site-packages (from plotly->catboost) (4.4.0)

Requirement already satisfied: retrying>=1.3.3 in d:\pycharm\ynn\lib\site-packages (from plotly->catboost) (1.3.3)

Requirement already satisfied: pytz in d:\pycharm\ynn\lib\site-packages (from plotly->catboost) (2019.1)

Requirement already satisfied: requests in d:\pycharm\ynn\lib\site-packages (from plotly->catboost) (2.22.0)

Requirement already satisfied: nbformat>=4.2 in d:\pycharm\ynn\lib\site-packages (from plotly->catboost) (4.4.0)

Requirement already satisfied: setuptools in d:\pycharm\ynn\lib\site-packages (from kiwisolver>=1.0.1->matplotlib->catboost) (41.6.0)

Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in d:\pycharm\ynn\lib\site-packages (from requests->plotly->catboost) (1.25.3)

Requirement already satisfied: chardet<3.1.0,>=3.0.2 in d:\pycharm\ynn\lib\site-packages (from requests->plotly->catboost) (3.0.4)

Requirement already satisfied: idna<2.9,>=2.5 in d:\pycharm\ynn\lib\site-packages (from requests->plotly->catboost) (2.8)

Requirement already satisfied: certifi>=2017.4.17 in d:\pycharm\ynn\lib\site-packages (from requests->plotly->catboost) (2019.6.16)

Requirement already satisfied: traitlets>=4.1 in d:\pycharm\ynn\lib\site-packages (from nbformat>=4.2->plotly->catboost) (4.3.2)

Requirement already satisfied: ipython-genutils in d:\pycharm\ynn\lib\site-packages (from nbformat>=4.2->plotly->catboost) (0.2.0)

Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in d:\pycharm\ynn\lib\site-packages (from nbformat>=4.2->plotly->catboost) (3.0.1)

Requirement already satisfied: jupyter-core in d:\pycharm\ynn\lib\site-packages (from nbformat>=4.2->plotly->catboost) (4.6.3)

Requirement already satisfied: pyrsistent>=0.14.0 in d:\pycharm\ynn\lib\site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2->plotly->catboost) (0.15.3)

Requirement already satisfied: attrs>=17.4.0 in d:\pycharm\ynn\lib\site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2->plotly->catboost) (19.3.0)

Requirement already satisfied: pywin32>=1.0; sys_platform == "win32" in d:\pycharm\ynn\lib\site-packages (from jupyter-core->nbformat>=4.2->plotly->catboost) (228)

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 

3.3.2特征预处理

  • 数据EDA部分我们已经对数据的大概和某些特征分布有了了解,数据预处理部分一般我们要处理一些EDA阶段分析出来的问题,这里介绍了数据缺失值的填充,时间格式特征的转化处理,某些对象类别特征的处理。

首先我们查找出数据中的对象特征和数值特征

 

 
 
 
 

在比赛中数据预处理是必不可少的一部分,对于缺失值的填充往往会影响比赛的结果,在比赛中不妨尝试多种填充然后比较结果选择结果最优的一种; 比赛数据相比真实场景的数据相对要“干净”一些,但是还是会有一定的“脏”数据存在,清洗一些异常值往往会获得意想不到的效果。

缺失值填充

  • 把所有缺失值替换为指定的值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)

 

 
 

[6]:

id                        0
,loanAmnt                  0
,term                      0
,interestRate              0
,installment               0
,grade                     0
,subGrade                  0
,employmentTitle           1
,employmentLength      46799
,homeOwnership             0
,annualIncome              0
,verificationStatus        0
,issueDate                 0
,isDefault                 0
,purpose                   0
,postCode                  1
,regionCode                0
,dti                     239
,delinquency_2years        0
,ficoRangeLow              0
,ficoRangeHigh             0
,openAcc                   0
,pubRec                    0
,pubRecBankruptcies      405
,revolBal                  0
,revolUtil               531
,totalAcc                  0
,initialListStatus         0
,applicationType           0
,earliesCreditLine         0
,title                     1
,policyCode                0
,n0                    40270
,n1                    40270
,n2                    40270
,n2.1                  40270
,n4                    33239
,n5                    40270
,n6                    40270
,n7                    40270
,n8                    40271
,n9                    40270
,n10                   33239
,n11                   69752
,n12                   40270
,n13                   40270
,n14                   40270
,dtype: int64

 

 
 
 
 
 
 

 

 

[8]:

id                        0
,loanAmnt                  0
,term                      0
,interestRate              0
,installment               0
,grade                     0
,subGrade                  0
,employmentTitle           0
,employmentLength      46799
,homeOwnership             0
,annualIncome              0
,verificationStatus        0
,issueDate                 0
,isDefault                 0
,purpose                   0
,postCode                  0
,regionCode                0
,dti                       0
,delinquency_2years        0
,ficoRangeLow              0
,ficoRangeHigh             0
,openAcc                   0
,pubRec                    0
,pubRecBankruptcies        0
,revolBal                  0
,revolUtil                 0
,totalAcc                  0
,initialListStatus         0
,applicationType           0
,earliesCreditLine         0
,title                     0
,policyCode                0
,n0                        0
,n1                        0
,n2                        0
,n2.1                      0
,n4                        0
,n5                        0
,n6                        0
,n7                        0
,n8                        0
,n9                        0
,n10                       0
,n11                       0
,n12                       0
,n13                       0
,n14                       0
,dtype: int64

 

 
 

[9]:

['grade', 'subGrade', 'employmentLength', 'issueDate', 'earliesCreditLine']
  • category_fea:对象型类别特征需要进行预处理,其中['issueDate']为时间格式特征。

时间格式处理

 

 
 
 
 
 
 

 

 

[11]:

1 year        52489
,10+ years    262753
,2 years       72358
,3 years       64152
,4 years       47985
,5 years       50102
,6 years       37254
,7 years       35407
,8 years       36192
,9 years       30272
,< 1 year      64237
,NaN           46799
,Name: employmentLength, dtype: int64

 

 
 
 
 
 
 
 
 
 

 

 

[13]:

0.0     15989
,1.0     13182
,2.0     18207
,3.0     16011
,4.0     11833
,5.0     12543
,6.0      9328
,7.0      8823
,8.0      8976
,9.0      7594
,10.0    65772
,NaN     11742
,Name: employmentLength, dtype: int64
  • 对earliesCreditLine进行预处理

 

 

[14]:

136347    Aug-2004
,314392    Feb-2002
,135401    Feb-2000
,151874    Aug-2006
,123346    Jun-2000
,Name: earliesCreditLine, dtype: object

 

 
 

类别特征处理

 

 
 
 
 
 
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或者自映射

 

 
 

 

 
 
 

3.3.3 异常值处理

  • 当你发现异常值后,一定要先分清是什么原因导致的异常值,然后再考虑如何处理。首先,如果这一异常值并不代表一种规律性的,而是极其偶然的现象,或者说你并不想研究这种偶然的现象,这时可以将其删除。其次,如果异常值存在且代表了一种真实存在的现象,那就不能随便删除。在现有的欺诈场景中很多时候欺诈数据本身相对于正常数据勒说就是异常的,我们要把这些异常点纳入,重新拟合模型,研究其规律。能用监督的用监督模型,不能用的还可以考虑用异常检测的算法来做。
  • 注意test的数据不能删。

检测异常的方法一:均方差

在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。

 

 
 
 
 
 
 
 
 
  • 得到特征的异常值后可以进一步分析变量异常值和目标变量的关系

 

 
 
 
 
 
 
正常值    800000

Name: id_outliers, dtype: int64

id_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    800000

Name: loanAmnt_outliers, dtype: int64

loanAmnt_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    800000

Name: term_outliers, dtype: int64

term_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    794259

异常值      5741

Name: interestRate_outliers, dtype: int64

interestRate_outliers

异常值      2916

正常值    156694

Name: isDefault, dtype: int64

**********

正常值    792046

异常值      7954

Name: installment_outliers, dtype: int64

installment_outliers

异常值      2152

正常值    157458

Name: isDefault, dtype: int64

**********

正常值    800000

Name: employmentTitle_outliers, dtype: int64

employmentTitle_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    799701

异常值       299

Name: homeOwnership_outliers, dtype: int64

homeOwnership_outliers

异常值        62

正常值    159548

Name: isDefault, dtype: int64

**********

正常值    793973

异常值      6027

Name: annualIncome_outliers, dtype: int64

annualIncome_outliers

异常值       756

正常值    158854

Name: isDefault, dtype: int64

**********

正常值    800000

Name: verificationStatus_outliers, dtype: int64

verificationStatus_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    783003

异常值     16997

Name: purpose_outliers, dtype: int64

purpose_outliers

异常值      3635

正常值    155975

Name: isDefault, dtype: int64

**********

正常值    798931

异常值      1069

Name: postCode_outliers, dtype: int64

postCode_outliers

异常值       221

正常值    159389

Name: isDefault, dtype: int64

**********

正常值    799994

异常值         6

Name: regionCode_outliers, dtype: int64

regionCode_outliers

异常值         1

正常值    159609

Name: isDefault, dtype: int64

**********

正常值    798440

异常值      1560

Name: dti_outliers, dtype: int64

dti_outliers

异常值       466

正常值    159144

Name: isDefault, dtype: int64

**********

正常值    778245

异常值     21755

Name: delinquency_2years_outliers, dtype: int64

delinquency_2years_outliers

异常值      5089

正常值    154521

Name: isDefault, dtype: int64

**********

正常值    788261

异常值     11739

Name: ficoRangeLow_outliers, dtype: int64

ficoRangeLow_outliers

异常值       778

正常值    158832

Name: isDefault, dtype: int64

**********

正常值    788261

异常值     11739

Name: ficoRangeHigh_outliers, dtype: int64

ficoRangeHigh_outliers

异常值       778

正常值    158832

Name: isDefault, dtype: int64

**********

正常值    790889

异常值      9111

Name: openAcc_outliers, dtype: int64

openAcc_outliers

异常值      2195

正常值    157415

Name: isDefault, dtype: int64

**********

正常值    792471

异常值      7529

Name: pubRec_outliers, dtype: int64

pubRec_outliers

异常值      1701

正常值    157909

Name: isDefault, dtype: int64

**********

正常值    794120

异常值      5880

Name: pubRecBankruptcies_outliers, dtype: int64

pubRecBankruptcies_outliers

异常值      1423

正常值    158187

Name: isDefault, dtype: int64

**********

正常值    790001

异常值      9999

Name: revolBal_outliers, dtype: int64

revolBal_outliers

异常值      1359

正常值    158251

Name: isDefault, dtype: int64

**********

正常值    799948

异常值        52

Name: revolUtil_outliers, dtype: int64

revolUtil_outliers

异常值        23

正常值    159587

Name: isDefault, dtype: int64

**********

正常值    791663

异常值      8337

Name: totalAcc_outliers, dtype: int64

totalAcc_outliers

异常值      1668

正常值    157942

Name: isDefault, dtype: int64

**********

正常值    800000

Name: initialListStatus_outliers, dtype: int64

initialListStatus_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    784586

异常值     15414

Name: applicationType_outliers, dtype: int64

applicationType_outliers

异常值      3875

正常值    155735

Name: isDefault, dtype: int64

**********

正常值    775134

异常值     24866

Name: title_outliers, dtype: int64

title_outliers

异常值      3900

正常值    155710

Name: isDefault, dtype: int64

**********

正常值    800000

Name: policyCode_outliers, dtype: int64

policyCode_outliers

正常值    159610

Name: isDefault, dtype: int64

**********

正常值    782773

异常值     17227

Name: n0_outliers, dtype: int64

n0_outliers

异常值      3485

正常值    156125

Name: isDefault, dtype: int64

**********

正常值    790500

异常值      9500

Name: n1_outliers, dtype: int64

n1_outliers

异常值      2491

正常值    157119

Name: isDefault, dtype: int64

**********

正常值    789067

异常值     10933

Name: n2_outliers, dtype: int64

n2_outliers

异常值      3205

正常值    156405

Name: isDefault, dtype: int64

**********

正常值    789067

异常值     10933

Name: n2.1_outliers, dtype: int64

n2.1_outliers

异常值      3205

正常值    156405

Name: isDefault, dtype: int64

**********

正常值    788660

异常值     11340

Name: n4_outliers, dtype: int64

n4_outliers

异常值      2476

正常值    157134

Name: isDefault, dtype: int64

**********

正常值    790355

异常值      9645

Name: n5_outliers, dtype: int64

n5_outliers

异常值      1858

正常值    157752

Name: isDefault, dtype: int64

**********

正常值    786006

异常值     13994

Name: n6_outliers, dtype: int64

n6_outliers

异常值      3182

正常值    156428

Name: isDefault, dtype: int64

**********

正常值    788430

异常值     11570

Name: n7_outliers, dtype: int64

n7_outliers

异常值      2746

正常值    156864

Name: isDefault, dtype: int64

**********

正常值    789625

异常值     10375

Name: n8_outliers, dtype: int64

n8_outliers

异常值      2131

正常值    157479

Name: isDefault, dtype: int64

**********

正常值    786384

异常值     13616

Name: n9_outliers, dtype: int64

n9_outliers

异常值      3953

正常值    155657

Name: isDefault, dtype: int64

**********

正常值    788979

异常值     11021

Name: n10_outliers, dtype: int64

n10_outliers

异常值      2639

正常值    156971

Name: isDefault, dtype: int64

**********

正常值    799434

异常值       566

Name: n11_outliers, dtype: int64

n11_outliers

异常值       112

正常值    159498

Name: isDefault, dtype: int64

**********

正常值    797585

异常值      2415

Name: n12_outliers, dtype: int64

n12_outliers

异常值       545

正常值    159065

Name: isDefault, dtype: int64

**********

正常值    788907

异常值     11093

Name: n13_outliers, dtype: int64

n13_outliers

异常值      2482

正常值    157128

Name: isDefault, dtype: int64

**********
  • 例如可以看到异常值在两个变量上的分布几乎复合整体的分布,如果异常值都属于为1的用户数据里面代表什么呢?

检测异常的方法二:箱型图

 

当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:0~9、10~99、100~999、1000~9999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子。

 

 
 

 

 
 

 

 

 

 

3.3.5 特征交互

 

 

 
 
 
 
 
 
 

 

 
 
 
 
 

这里给出一些特征交互的思路,但特征和特征间的交互衍生出新的特征还远远不止于此,抛砖引玉,希望大家多多探索。请学习者尝试其他的特征交互方法。

3.3.6 特征编码

labelEncode 直接放入树模型中

 

 
 
 
 
 
 
 
 
100%|████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:03<00:00,  1.04it/s]
Label Encoding 完成
100%|██████████| 4/4 [00:08<00:00,  2.04s/it]

Label Encoding 完成

逻辑回归等模型要单独增加的特征工程

 

 

 
 
 
 
  File "<ipython-input-28-fa43f959a4d9>", line 3
    for fea in [要归一化的特征列表]:
                          ^
SyntaxError: invalid character in identifier

3.3.7 特征选择

 

特征选择的方法:

 

Filter

 

方差选择法

 

from sklearn.feature_selection import VarianceThreshold
#其中参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(train,target_train)

相关系数法

 

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,
#输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数

SelectKBest(k=5).fit_transform(train,target_train)

卡方检验

 

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#参数k为选择的特征个数

SelectKBest(chi2, k=5).fit_transform(train,target_train)

互信息法

 

from sklearn.feature_selection import SelectKBest
from minepy import MINE
#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,
#返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(train,target_train)

Wrapper (Recursive feature elimination,RFE)

 

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数

RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(train,target_train)

Embedded

 

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带L1惩罚项的逻辑回归作为基模型的特征选择

SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(train,target_train)

 

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(train,target_train)

本数据集中我们删除非入模特征后,并对缺失值填充,然后用计算协方差的方式看一下特征间相关性,然后进行模型训练

 

 
 
 

 

 
 

 

 
 
 
 
 
 

 

 
 
 
 
 
 
 

[33]:

<matplotlib.axes._subplots.AxesSubplot at 0x220aca48948>

<matplotlib.axes._subplots.AxesSubplot at 0x12d88ad10>

output_81_1.png

 

 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 

 

 
************************************ 1 ************************************

Training until validation scores don't improve for 200 rounds

[200]	training's auc: 0.74899	valid_1's auc: 0.729686

[400]	training's auc: 0.764681	valid_1's auc: 0.730508

[600]	training's auc: 0.778892	valid_1's auc: 0.730374

Early stopping, best iteration is:

[440]	training's auc: 0.767697	valid_1's auc: 0.73054

[0.7305399905125283]

************************************ 2 ************************************

Training until validation scores don't improve for 200 rounds

[200]	training's auc: 0.74894	valid_1's auc: 0.731142

[400]	training's auc: 0.764652	valid_1's auc: 0.731723

[600]	training's auc: 0.77816	valid_1's auc: 0.731763

Early stopping, best iteration is:

[509]	training's auc: 0.77206	valid_1's auc: 0.731929

[0.7305399905125283, 0.7319289931459529]

************************************ 3 ************************************

Training until validation scores don't improve for 200 rounds

[200]	training's auc: 0.748202	valid_1's auc: 0.732441

[400]	training's auc: 0.763979	valid_1's auc: 0.733223

Early stopping, best iteration is:

[378]	training's auc: 0.762425	valid_1's auc: 0.733328

[0.7305399905125283, 0.7319289931459529, 0.73332775976538]

************************************ 4 ************************************

Training until validation scores don't improve for 200 rounds

[200]	training's auc: 0.749456	valid_1's auc: 0.727989

[400]	training's auc: 0.764402	valid_1's auc: 0.728576

Early stopping, best iteration is:

[390]	training's auc: 0.763724	valid_1's auc: 0.728673

[0.7305399905125283, 0.7319289931459529, 0.73332775976538, 0.7286733163044455]

************************************ 5 ************************************

Training until validation scores don't improve for 200 rounds

[200]	training's auc: 0.748363	valid_1's auc: 0.732701

[400]	training's auc: 0.76389	valid_1's auc: 0.733229

Early stopping, best iteration is:

[348]	training's auc: 0.76005	valid_1's auc: 0.733396

[0.7305399905125283, 0.7319289931459529, 0.73332775976538, 0.7286733163044455, 0.7333959358768154]

lgb_scotrainre_list: [0.7305399905125283, 0.7319289931459529, 0.73332775976538, 0.7286733163044455, 0.7333959358768154]

lgb_score_mean: 0.7315731991210244

lgb_score_std: 0.0017890937427853105

总结和思考

特征工程对于整个过程来说是最重要的,也是耗时最久的,长久以来不同的数据有不同的处理方法,文中有讲到一些对数据的处理方法,例如缺失异常值,还有就是常见的数据预处理,我觉得这两个都是可以通用的,对于很多情景,虽然有很多都是对应相关情景,缺失值的处理有两种,一是比较简单直观的均差法,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。还有就是箱型图,通过化图,分点来得出异常值,从而找到相关信息来分析。后面还有讲到如何将数据简化,减少复杂性,并且减少数据特征跨度,这就是数据分桶,再数据分桶时要注意分桶的原则。还有就是固定宽度分桶,当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:0~9、10~99、100~999、1000~9999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子。后文还有讲到数据选择等方法内容。

  • 总结一句话:四分位数会将数据分为三个点和四个区间,IQR = Q3 -Q1,下触须=Q1 − 1.5x IQR,上触须=Q3 + 1.5x IQR;
  • 数据分桶

  • 特征分箱的目的:
    • 从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
  • 数据分桶的对象:
    • 将连续变量离散化
    • 将多状态的离散变量合并成少状态
  • 分箱的原因:
    • 数据的特征内的值跨度可能比较大,对有监督和无监督中如k-均值聚类它使用欧氏距离作为相似度函数来测量数据点之间的相似度。都会造成大吃小的影响,其中一种解决方法是对计数值进行区间量化即数据分桶也叫做数据分箱,然后使用量化后的结果。
  • 分箱的优点:

    • 处理缺失值:当数据源可能存在缺失值,此时可以把null单独作为一个分箱。
    • 处理异常值:当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。例如,age若出现200这种异常值,可分入“age > 60”这个分箱里,排除影响。
    • 业务解释性:我们习惯于线性判断变量的作用,当x越来越大,y就越来越大。但实际x与y之间经常存在着非线性关系,此时可经过WOE变换。
  • 特别要注意一下分箱的基本原则:

    • (1)最小分箱占比不低于5%
    • (2)箱内不能全部是好客户
    • (3)连续箱单调
  • 固定宽度分箱 

  • 分位数分箱
  • 卡方分箱及其他分箱方法的尝试
    • 这一部分属于进阶部分,学有余力的同学可以自行搜索尝试。
  • 交互特征的构造非常简单,使用起来却代价不菲。如果线性模型中包含有交互特征对,那它的训练时间和评分时间就会从 O(n) 增加到 O(n2),其中 n 是单一特征的数量。
  • 对特征做归一化,去除相关性高的特征
  • 归一化目的是让训练过程更好更快的收敛,避免特征大吃小的问题
  • 去除相关性是增加模型的可解释性,加快预测过程。
  • 特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间。
  • 1 Filter
    • 方差选择法
    • 相关系数法(pearson 相关系数)
    • 卡方检验
    • 互信息法
  • 2 Wrapper (RFE)
    • 递归特征消除法
  • 3 Embedded
    • 基于惩罚项的特征选择法
    • 基于树模型的特征选择
  • 基于特征间的关系进行筛选
  • 方差选择法中,先要计算各个特征的方差,然后根据设定的阈值,选择方差大于阈值的特征
  • 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类结合最大信息系数法可以用于选择特征,相关代码如下:
  • 递归特征消除法 递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。 在feature_selection库的RFE类可以用于选择特征,相关代码如下(以逻辑回归为例):
  • 基于惩罚项的特征选择法 使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。 在feature_selection库的SelectFromModel类结合逻辑回归模型可以用于选择特征,相关代码如下:
  • 基于树模型的特征选择 树模型中GBDT也可用来作为基模型进行特征选择。 在feature_selection库的SelectFromModel类结合GBDT模型可以用于选择特征,相关代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值