【天池】金融风控-贷款违约预测(三)—— 特征工程

本文详细介绍了在金融风控贷款违约预测中特征工程的各个环节,包括数据预处理、异常值处理、数据分桶、特征交互、编码和选择。针对缺失值填充、时间格式处理、对象类型特征转换、异常值检测(3σ原则、箱型图)以及特征编码(one-hot、label-encode)等方面提供了代码示例。此外,文章还探讨了特征选择的不同方法,如Filter、Wrapper(RFE)和Embedded策略。特征工程在机器学习中的重要性不言而喻,特别是在金融风控评分卡制作中,特征分箱的可解释性尤为关键。
摘要由CSDN通过智能技术生成

【天池】金融风控-贷款违约预测(三)—— 特征工程

前言

【天池】金融风控-贷款违约预测(赛题链接)。
上一篇数据分析时已经对赛题进行了数据探索(EDA,Exploratory Data Analysis),主要熟悉了解整个数据集的基本情况(缺失值,异常值),了解了变量间的相互关系、变量与预测值之间的存在关系。本篇将进行各种特征工程以及分析方法的介绍:

  1. 特征预处理、缺失值、异常值处理、数据分桶等特征处理方法;
  2. 特征交互、编码、选择的相应方法。

内容介绍

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

代码示例

1. 导入包并读取数据

# 导入相关包
import pandas as pd 
import numpy as np 
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('./data/train.csv')
data_test_a = pd.read_csv('./data/testA.csv')

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

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

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)

在比赛中数据预处理是必不可少的一部分,对于缺失值的填充往往会影响比赛的结果,在比赛中不妨尝试多种填充然后比较结果选择结果最优的一种;另外比赛数据相比真实场景的数据相对要“干净”一些,但是还是会有一定的“脏”数据存在,清洗一些异常值往往会获得意想不到的效果。
2.1 缺失值填充
a.把所有缺失值替换为指定的值0:data_train = data_train.fillna(0)
b.向用缺失值上面的值替换缺失值:data_train = data_train.fillna(axis=0,method=‘ffill’)
c.纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值:data_train = data_train.fillna(axis=0,method=‘bfill’,limit=2)

#查看缺失值情况 
data_train.isnull().sum()

在这里插入图片描述

#按照平均数填充数值型特征 
data_train[numerical_fea] = data_train[numerical_fea].fillna(data_train[numerical_fea].median()) 
data_test_a[numerical_fea] = data_test_a[numerical_fea].fillna(data_train[numerical_fea].median()) 
#按照众数填充类别型特征 
data_train[category_fea] = data_train[category_fea].fillna(data_train[category_fea].mode()) 
data_test_a[category_fea] = data_test_a[category_fea].fillna(data_train[category_fea].mode())

data_train.isnull().sum()

在这里插入图片描述

#查看类别特征 
category_fea

在这里插入图片描述
category_fea:对象型类别特征需要进行预处理,其中[‘issueDate’]为时间格式特征。

2.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

2.3 对象类型特征转换到数值
查看对象类型特征“employmentLength”情况:

data_train['employmentLength'].value_counts(dropna=False).sort_index()

在这里插入图片描述
将对象类型特征“employmentLength”转为数值型:

def employmentLength_to_int(s): 
    if pd.isnull(s): 
        retu
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值