【数据挖掘】金融风控 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

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

5583

被折叠的 条评论
为什么被折叠?



