2020-09-20数据挖掘实践-金融风控

TASK03特征工程

学习目标

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

学习提纲

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

代码实现

1.导入相关的包:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns//Seaborn是基于matplotlib的图形可视化python包。能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。
import datetime//datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta(时间加减),tzinfo(时区)。
from tqdm import tqdm//代码进度可视化,包括tqdm、trange等子模块
from sklearn.preprocessing import LabelEncoder//LabelEncoder 是对不连续的数字或者文本进行编号
from sklearn.feature_selection import SelectKBest//选择出前k个与标签最相关的特征
from sklearn.feature_selection import chi2//特征选择过滤器 -chi2(卡方统计量)
from sklearn.preprocessing import MinMaxScaler//数据归一化
import xgboost as xgb
import lightgbm as lgb//LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架
from catboost import CatBoostRegressor//CatBoost库可以用来解决分类和回归挑战。对于分类,你可以使用“CatBoostClassifier”,对于回归,使用“CatBoostRegressor”。
import warnings
from sklearn.model_selection import StratifiedKFold, KFold
//KFold划分数据集的原理:根据n_split直接进行划分
//StratifiedKFold划分数据集的原理:划分后的训练集和验证集中类别分布尽量和原数据集一样
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score, log_loss//评估指标
warnings.filterwarnings('ignore')//忽略报警

2.数据读取

data_train =pd.read_csv('./tianchi//202009/DataSet/train.csv')
data_test_a = pd.read_csv('./tianchi//202009/DataSet/testA.csv')

3.特征预处理

numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)//取出所有属性不是object的量的列名存入list
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))//lambda定义函数,filter(判断函数,可迭代对象)
label = 'isDefault'
numerical_fea.remove(label)//去除列名中的isDefault字符串

4.缺失值填充

data_train = data_train.fillna(0)//缺失值替换为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()//空值数量统计

在这里插入图片描述

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()

在这里插入图片描述
在这里插入图片描述

5.时间格式处理

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')//datetime模块还包含一个datetime类; strptime:把str转换为datetime
    data['issueDateDT'] = data['issueDate'].apply(lambda x: x-startdate).dt.days
data_train['employmentLength'].value_counts(dropna=False).sort_index()
//value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。dropna = False 表示保留 nan,默认情况下 dropna 是true,即默认情况下不包含 nan

6.对象类型特征转换到数值

def employmentLength_to_int(s):
    if pd.isnull(s):
        return s
    else:
        return np.int8(s.split()[0])//非空的数据集,以空格分隔字符串;空的数据集,直接返回
for data in [data_train, data_test_a]:
    data['employmentLength'].replace(to_replace='10+ years', value='10 years', inplace=True)
    //replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
    data['employmentLength'].replace('< 1 year', '0 years', inplace=True)
    data['employmentLength'] = data['employmentLength'].apply(employmentLength_to_int)
data['employmentLength'].value_counts(dropna=False).sort_index()
//统计employmentLength数量,保留空值

out:
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作预处理

data_train['earliesCreditLine'].sample(5)//随机抽取5个数
for data in [data_train, data_test_a]:
    data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
//从倒数第四行到最后,转int类型

7.类别特征处理

for f in cate_features:
    print(f, '类型数:', data[f].nunique())//获取 'f’列中所有唯一值的数量

out:
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或者自映射。
LabelEncoder可以将标签分配一个0—n_classes-1之间的编码。

for data in [data_train, data_test_a]:
    data['grade'] = data['grade'].map({'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7})
//map() 会根据提供的函数对指定序列做映射。
for data in [data_train, data_test_a]:
    data = pd.get_dummies(data, columns=['subGrade', 'homeOwnership', 'verificationStatus', 
'purpose', 'regionCode'], drop_first=True)
//get_dummies 是利用pandas实现one hot encode的方式

8.异常值处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值