Datawhale学习笔记【阿里云天池 金融风控-贷款违约预测】Task3特征工程

特征工程

项目地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl

比赛地址:https://tianchi.aliyun.com/competition/entrance/531830/introduction

学习目标

  • 学习特征预处理、缺失值、异常值处理、数据分桶等特征处理方法
  • 学习特征交互、编码、选择的相应方法

内容介绍

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

代码示例

导入库

import matplotlib.pyplot as plt
import seaborn as sns
import datetime
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler
import xgboost as xgb
import lightgbm as lgb
from catboost import CatBoostRegressor
import warnings
from sklearn.model_selection import StratifiedKFold, KFold
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score, log_loss
warnings.filterwarnings('ignore')
data_train =pd.read_csv('../train.csv')
data_test_a = pd.read_csv('../testA.csv')

特征预处理

查找出数据中的对象特征和数值特征

#查找出数据中的对象特征和数值特征
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
label = 'isDefault'
numerical_fea.remove(label)

缺失值处理

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

 #查看缺失值情况
data_train.isnull().sum()
 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

数据分桶

  1. 固定宽度分箱
    当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:09、1099、100999、10009999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子。
# 通过除法映射到间隔均匀的分箱中,每个分箱的取值范围都是loanAmnt/1000
data['loanAmnt_bin1'] = np.floor_divide(data['loanAmnt'], 1000)
## 通过对数函数映射到指数宽度分箱
data['loanAmnt_bin2'] = np.floor(np.log10(data['loanAmnt']))
  1. 分位数分箱
data['loanAmnt_bin3'] = pd.qcut(data['loanAmnt'], 10, labels=False)

特征交互

  • 交互特征的构造非常简单,使用起来却代价不菲。如果线性模型中包含有交互特征对,那它的训练时间和评分时间就会从 O(n) 增加到 O(n2),其中 n 是单一特征的数量。
for col in ['grade', 'subGrade']: 
    temp_dict = data_train.groupby([col])['isDefault'].agg(['mean']).reset_index().rename(columns={'mean': col + '_target_mean'})
    temp_dict.index = temp_dict[col].values
    temp_dict = temp_dict[col + '_target_mean'].to_dict()

    data_train[col + '_target_mean'] = data_train[col].map(temp_dict)
    data_test_a[col + '_target_mean'] = data_test_a[col].map(temp_dict)
# 其他衍生变量 mean 和 std
for df in [data_train, data_test_a]:
    for item in ['n0','n1','n2','n2.1','n4','n5','n6','n7','n8','n9','n10','n11','n12','n13','n14']:
        df['grade_to_mean_' + item] = df['grade'] / df.groupby([item])['grade'].transform('mean')
        df['grade_to_std_' + item] = df['grade'] / df.groupby([item])['grade'].transform('std')
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页