【数据挖掘】金融风控 Task03 特征工程

本文详细介绍了一个金融风控场景下的特征工程流程,包括数据预处理、特征选择、特征编码等多个环节,并提供了丰富的代码实例。


学习地址:https: //github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl
天池竞赛地址:https://tianchi.aliyun.com/competition/entrance/531830/introduction


根据本节内容及直播课程整理的数据分析过程
在这里插入图片描述


3.1 特征工程介绍

特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。特征工程在机器学习中占有非常重要的作用,一般认为括特征构建(数据预处理)、特征提取、特征选择三个部分。

  • 特征构建比较麻烦,需要一定的经验。
  • 特征提取与特征选择都是为了从原始特征中找出最有效的特征。它们之间的区别是特征提取强调通过特征转换的方式得到一组具有明显物理或统计意义的特征;而特征选择是从特征集合中挑选一组具有明显物理或统计意义的特征子集。两者都能帮助减少特征的维度、数据冗余,特征提取有时能发现更有意义的特征属性,特征选择的过程经常能表示出每个特征的重要性对于模型构建的重要性。

相关包及数据导入

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
'''
Tqdm 是一个快速,可扩展的Python进度条,
可以在 Python 长循环中添加一个进度提示信息,
用户只需要封装任意的迭代器 tqdm(iterator)
使用参考:https://blog.csdn.net/zkp_987/article/details/81748098
'''
from tqdm import tqdm 
from sklearn.preprocessing import LabelEncoder
'''
class sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, *, k=10)
作用:根据k的最高分数选择特征。
使用参考:https://blog.csdn.net/niutingbaby/article/details/96102393
'''
from sklearn.feature_selection import SelectKBest
'''
计算每个非负要素与类之间的卡方统计量。

此分数可用于从X中选择测试卡方统计量具有最高值的n_features特征,
该特征必须仅包含非负特征,例如布尔值或频率(例如,文档分类中的术语计数),相对于类。
'''
from sklearn.feature_selection import chi2
#数据归一化函数 MinMaxScaler:归一到 [ 0,1 ] MaxAbsScaler:归一到 [ -1,1 ]
from sklearn.preprocessing import MinMaxScaler
import xgboost as xgb
import lightgbm as lgb
'''
对于catboost的安装可以直接在jupyter中进行 采用
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple catboost
'''
from catboost import CatBoostRegressor
import warnings
warnings.filterwarnings('ignore')
from sklearn.model_selection import StratifiedKFold,KFold
from sklearn.metrics import accuracy_score,f1_score,roc_auc_score,log_loss
#导入数据
data_train=pd.read_csv('train.csv')
data_test_a=pd.read_csv('testA.csv')

3.2 数据预处理

  • 定义:从数据中检测,纠正或者损坏不准确,不适用模型的记录的过程
  • 目的:让数据适应模型,匹配模型的需求
  • 面对的问题:
    • 数据类型不同:有的是文字,有的是数字,有的连续,有的间断
    • 数据质量不行:有噪声,有异常,有缺失,有重复,量纲不一,数据量过大或者过小

3.2.1 查找出对象和数值特征

#数值特征
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中剔除,这是需要预测的结果
numerical_fea.remove(label) #注意如何从list中移除某值采用的是remove()

3.2.2 进行缺失值填充

进行缺失值的处理方法有多种,可以尝试多种填充方式,选择效果最好的一种

  • 把所有缺失值替换为指定的值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()
#按照平均数填充数值型特征
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_test_a[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_test_a[category_fea].mode())
data_train.isnull().sum()
#发现只有employmentLength没有被填充上
#查看类别特征
category_fea
#['grade', 'subGrade', 'employmentLength', 'issueDate', 'earliesCreditLine']

for i in category_fea:
    print('=={}的变量分布=='.format(i))
    print(data_train[i].value_counts())
    print('\n')
==grade的变量分布==
B    233690
C    227118
A    139661
D    119453
E     55661
F     19053
G      5364
Name: grade, dtype: int64


==subGrade的变量分布==
C1    50763
B4    49516
B5    48965
B3    48600
C2    47068
C3    44751
C4    44272
B2    44227
B1    42382
C5    40264
A5    38045
A4    30928
D1    30538
D2    26528
A1    25909
D3    23410
A3    22655
A2    22124
D4    21139
D5    17838
E1    14064
E2    12746
E3    10925
E4     9273
E5     8653
F1     5925
F2     4340
F3     3577
F4     2859
F5     2352
G1     1759
G2     1231
G3      978
G4      751
G5      645
Name: subGrade, dtype: int64


==employmentLength的变量分布==
10+ years    262753
2 years       72358
< 1 year      64237
3 years       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值