广工大数协 阿里云天池 金融风控训练营-Task3

Task 3

本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,
学习链接
项目地址
比赛地址

一、学习大纲

1.数据预处理
2.异常值处理
3.数据分箱
4.特征交互
5.特征编码
6.特征选择

二、学习内容

1.数据预处理
1)缺失值的填充
  • 一般的方法:
    ①忽略该元组,在csv文件中来说就是删除这一行数据。这种方法除非在该行缺失很多属性值的情况下使用,否则不是很有效。
    ②人工填写缺失值,这种方法对于数据量和缺失量较小的数据来说还可以,在大量的数据下,未免太过于麻烦。
    ③使用给定元组的相似元组的该属性值进行填充。
    ④使用该属性的中位数、均值、众数等进行填充。
2) 时间格式处理
3) 对象类型特征转换到数值
2. 异常值处理

① 基于3segama原则:将数据的上下限限定在sigmoid内减小异常值的影响
②基于箱型图:可视化同理

3. 数据分箱
  • 目的: 从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
  • 对象:
    将连续变量离散化
    将多状态的离散变量合并成少状态
4. 特征交互

①特征和特征之间组合: 组合特征也叫特征交叉(Feature Crosses),即不同类型或者不同维度特征之间的交叉组合,其主要目的是为了弥补CTR场景中早期的模型无法有效的进行特征组合而产生的想法和实践。
②特征和特征之间衍生:特征衍生也叫特征构建,是指从原始数据中构建新的特征,也属于特征选择的一种手段。在计算机科学领域,衍生特征是指用原始数据进行特征学习得到新的特征。

5.特征编码
  • one-hot编码:适用于分类数量较少的特征
  • label-encode编码:对object类型如果不考虑大小值可以直接进行
6.特征选择

①Filter

  • 方差选择法
  • 相关系数法(pearson 相关系数)
  • 卡方检验
  • 互信息法

② Wrapper (RFE)

  • 递归特征消除法

③ Embedded

  • 基于惩罚项的特征选择法
  • 基于树模型的特征选择

三、代码示例

!pip install catboost --user
缺失值填充
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')
train = pd.read_csv('http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/FRC/data_set/train.csv')
testA = pd.read_csv('http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/FRC/data_set/testA.csv')
# 特征分为数值型和类别型
numerical_fea = list(train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(.columns)))
label = 'isDefault'
numerical_fea.remove(label)
#查看缺失值情况
train.isnull().sum()
#按照平均数填充数值型特征
train[numerical_fea]=train[numerical_fea].fillna(train[numerical_fea].median())
testA[numerical_fea]=testA[numerical_fea].fillna(train[numerical_fea].median())
#按照众数填充类别型特征
train[category_fea]=train[category_fea].fillna(train[category_fea].mode())
testA[category_fea]=testA[category_fea].fillna(train[category_fea].mode())
#按照中位数数填充数值型特征
train[numerical_fea]=train[numerical_fea].fillna(train[numerical_fea].median())
testA[numerical_fea]=test_a[numerical_fea].fillna(train[numerical_fea].median())
时间格式处理
for data in [train,testA]:
    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
对象类型特征转换到数值
train['employmentLength'].value_counts(dropna=False).sort_index()
 
def employmentLength_to_int(s):
    if pd.isnull(s):
        return s
    else:
        return np.int8(s.split()[0])
 
for data in [train, testA]:
    data['employmentLength'].replace(to_replace='10+ years', value='10 years', inplace=True)
    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()
异常值处理
#检测异常值
def find_outliers_by_3segama(data,fea):
    data_std = np.std(data[fea])
    data_mean = np.mean(data[fea])
    outliers_cut_off = data_std * 3
    lower_rule = data_mean - outliers_cut_off
    upper_rule = data_mean + outliers_cut_off
    data[fea+'_outliers'] = data[fea].apply(lambda x:str('异常值') if x > upper_rule or x < lower_rule else '正常值')
    return data
 
data_train = data_train.copy()
for fea in numerical_fea:
    data_train = find_outliers_by_3segama(data_train,fea)
    print(data_train[fea+'_outliers'].value_counts())
    print(data_train.groupby(fea+'_outliers')['isDefault'].sum())
    print('*'*10)
#删除异常值
for fea in numerical_fea:
    data_train = data_train[data_train[fea+'_outliers']=='正常值']
    data_train = data_train.reset_index(drop=True) 

特征交互
for col in ['grade', 'subGrade']: 
    temp_dict = 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()
 
    train[col + '_target_mean'] = train[col].map(temp_dict)
   testA[col + '_target_mean'] = testA[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')
特征编码
for col in tqdm(['employmentTitle', 'postCode', 'title','subGrade']):
    le = LabelEncoder()
    le.fit(list(data_train[col].astype(str).values) + list(data_test_a[col].astype(str).values))
    data_train[col] = le.transform(list(data_train[col].astype(str).values))
    data_test_a[col] = le.transform(list(data_test_a[col].astype(str).values))
print('Label Encoding 完成')
特征选择
# 方差选择法
from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(threshold=3).fit_transform(train,target_train)
# 相关系数法
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
SelectKBest(k=5).fit_transform(train,target_train)
# 卡方检验
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
SelectKBest(chi2, k=5).fit_transform(train,target_train)

[1]金融风控Task3-特征工程
[2]天池金融风控训练营

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值