金融风控数据挖掘 · Task 3 特征工程

金融风控数据挖掘 · Task 3 特征工程

一、常见的特征工程包括:

1.异常处理:
  • 通过箱线图(或 3-Sigma)分析删除异常值;
  • BOX-COX 转换(处理有偏分布);
  • 长尾截断;
2.特征归一化/标准化:
  • 标准化(转换为标准正态分布);
  • 归一化(抓换到 [0,1] 区间);
  • 针对幂律分布,可以采用公式: l o g ( 1 + x 1 + m e d i a n ) log(\frac{1+x}{1+median}) log(1+median1+x)
3.数据分桶:
  • 等频分桶;
  • 等距分桶;
  • Best-KS 分桶(类似利用基尼指数进行二分类);
  • 卡方分桶;
4.缺失值处理:
  • 不处理(针对类似 XGBoost 等树模型);

  • 删除(缺失数据太多);

  • 插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全等;

  • 分箱,缺失值一个箱;

5.特征构造:
  • 构造统计量特征,报告计数、求和、比例、标准差等;

  • 时间特征,包括相对时间和绝对时间,节假日,双休日等;

  • 地理信息,包括分箱,分布编码等方法;

  • 非线性变换,包括 log/ 平方/ 根号等;

  • 特征组合,特征交叉;

6.特征筛选
  • 过滤式(filter):先对数据进行特征选择,然后在训练学习器,常见的方法有 Relief/方差选择发/相关系数法/卡方检验法/互信息法;

  • 包裹式(wrapper):直接把最终将要使用的学习器的性能作为特征子集的评价准则,常见方法有

  • LVM(Las Vegas Wrapper) ;

  • 嵌入式(embedding):结合过滤式和包裹式,学习器训练过程中自动进行了特征选择,常见的有lasso 回归;

7.降维
  • PCA/ LDA/ ICA;

  • 特征选择也是一种降维。

二、代码:

1)数据预处理
1.缺失值填充
#查看缺失值情况 
data_train.isnull().sum()
#把所有缺失值替换为指定的值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[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())
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 123456
3.对象类型特征转换到数值
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)
	data['employmentLength'].replace('< 1 year', '0 years', inplace=True) 
	data['employmentLength'] = data['employmentLength'].apply(employmentLength_to_int)
#对earliesCreditLine进行预处理
data_train['earliesCreditLine'].sample(5)
for data in [data_train, data_test_a]: 
	data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
4.类别特征处理
# 部分类别特征 
cate_features = ['grade', 'subGrade', 'employmentTitle', 'homeOwnership', 'verificationStatus', 'purpose', 'postCode', 'regionCode', \ 'applicationType', 'initialListStatus', 'title', 'policyCode'] 
for f in cate_features: 
	print(f, '类型数:', data[f].nunique())
#等级这种类别特征,是有优先级的可以labelencode或者自映射
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})
# 类型数在2之上,又不是高维稀疏的,且纯分类特征 
for data in [data_train, data_test_a]: 
	data = pd.get_dummies(data, columns=['subGrade', 'homeOwnership', 'verificationStatus', 'purpose', 'regionCode'], drop_first=True)
2)异常值处理
1 均方差检测

在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。

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 12345678

得到特征的异常值后可以进一步分析变量异常值和目标变量的关系

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) 1234
2 箱型图检测异常

总结一句话:四分位数会将数据分为三个点和四个区间, I Q R = Q 3 − Q 1 IQR = Q3 -Q1 IQR=Q3Q1,下触须 = Q 1 − 1.5 x I Q R =Q1 − 1.5x IQR =Q11.5xIQR,上触须 = Q 3 + 1.5 ∗ I Q R =Q3+ 1.5* IQR =Q3+1.5IQR

3) 数据分桶
1. 特征分箱的目的:

从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。

2. 数据分桶的对象:

a. 将连续变量离散化
b. 将多状态的离散变量合并成少状态

3. 分箱的原因:

数据的特征内的值跨度可能比较大,对有监督和无监督中如k-均值聚类它使用欧氏距离作为相似度函数来测量数据点之间的相似度。都会造成大吃小的影响,其中一种解决方法是对计数值进行区间量化即数据分桶也叫做数据分箱,然后使用量化后的结果。

4. 分箱的优点:

a. 处理缺失值:当数据源可能存在缺失值,此时可以把null单独作为一个分箱。
b. 处理异常值:当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰
能力)。例如,age若出现200这种异常值,可分入“age > 60”这个分箱里,排除影响。
c. 业务解释性:我们习惯于线性判断变量的作用,当x越来越大,y就越来越大。但实际x与y之间经常存在
着非线性关系,此时可经过WOE变换。

5. 特别要注意一下分箱的基本原则:

a. 最小分箱占比不低于5%
b. 箱内不能全部是好客户
c. 连续箱单调

4) 特征交互

交互特征的构造非常简单,使用起来却代价不菲。如果线性模型中包含有交互特征对,那它的训练时间和评分时间就会从 O(n) 增加到 O(n2),其中 n 是单一特征的数量。

for col in ['grade', 'subGrade']: 
	temp_dict = data_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() 	
	data_train[col + '_target_mean'] = data_train[col].map(temp_dict) 
	data_test_a[col + '_target_mean'] = data_test_a[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')
5)特征编码
#label-encode:subGrade,postCode,title 
# 高维类别特征需要进行转换 
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 完成')
6)特征选择

特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间。

特征选择的方法:

  1. Filter
    a. 方差选择法
    b. 相关系数法(pearson 相关系数)
    c. 卡方检验
    d. 互信息法
  2. Wrapper (RFE)
    a. 递归特征消除法
  3. Embedded
    a. 基于惩罚项的特征选择法
    b. 基于树模型的特征选择
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值