金融风控task3-特征工程

特征工程是算法竞赛中重要的一环,是决定模型效果上限的重要标准,特征工程的作用在决定最后分数时是非常大的,因此通常将大量时间用于特征工程中,特征的复杂性也往往决定特征工程的工作量,因此一个好的特征工程需要细细打磨。

1 缺失值的处理:

对于缺失值,可以采用向上,向下填充,固定值填充等方法,但是具体那种作用更大需要逐个实验

#按照平均数填充数值型特征
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())

但是对于object型特征需要单独进行预处理

#转化成时间格式
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

这里几个知识点 1 datetime函数将时间转化为计算机能识别的时间戳 2 strptime 函数将开始时间转化为时间元组的形式,将一个(时间)字符串解析为时间的一个类型对象 ,即将将一个字符串格式化为一个tm结构 3 lambda函数将issuedate转为x-started的形式,并赋给一个新的特征

 上图是分别转为时间戳和转为时间元组后的效果图

对于employmentLength这个特征,由于原本是1 year,2 year的形式,因此直接按照有顺序的lablecode的形式转化就行,但是由于含有小于一年大于10年的类别和空值,因此不能直接用labelcode函数,而是用if和循环的形式转化

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这个特征,由于是

Sep-2002

这种类型直接将sep用切片的方式舍去即可

对于类别特征,一般是由大小规律的利用labelcode,对于只表示类别的,用onehot即可

异常值处理

对于异常值,特别是欺诈环境中的异常值很普遍,如果由研究价值的可以重新拟合进模型,但是没有价值的可以删去

因此需要对异常值进行检测

在统计学中,如果一个数据分布近似正态,那么大约 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
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) 

 

  1. 固定宽度分箱

当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:09、1099、100999、10009999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子

# 通过除法映射到间隔均匀的分箱中,每个分箱的取值范围都是loanAmnt/1000
data['loanAmnt_bin1'] = np.floor_divide(data['loanAmnt'], 1000)
## 通过对数函数映射到指数宽度分箱
data['loanAmnt_bin2'] = np.floor(np.log10(data['loanAmnt']))
分位数分箱
data['loanAmnt_bin3'] = pd.qcut(data['loanAmnt'], 10, labels=False)

特征交互

特征交互即是运用各种特征交叉,相乘相加之后取频域等方法生成新的特征

同时也可以运用tfidf等nlp处理的手法,对字段特征进行处理

采样

采样是对于如果数据标签分别不平均时所使用的技巧经过采样后会形成平均的标签分布

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

print('训练集的交易记录条数:',X_train.shape[0])
print('测试集的交易记录条数:',X_test.shape[0])
print('交易记录总数:',X_train.shape[0] + X_test.shape[0])
print('上采样前,类别为‘1’的共有{}个,类别为‘0’的共有{}个。'.format(sum(y_train==1),sum(y_train==0)))
print('------------------------')

# 对训练集进行上采样处理
smote = SMOTE(random_state=2)
X_train_os,y_train_os = smote.fit_sample(X_train, y_train.ravel()) # ravel(): change the shape of y to (n_samples, )

print('上采样后,训练集的交易记录条数:', len(X_train_os))
print('其中,训练集X的shape:',X_train_os.shape,',y的shape:',y_train_os.shape)
print('交易记录总数:',X_train_os.shape[0] + X_test.shape[0])
print('上采样后,类别为‘1’的共有{}个,类别为‘0’的共有{}个。'.format(sum(y_train_os==1),sum(y_train_os==0)))

归一化,归一化是将与其他数据数量级相差的数据转化成相同的数量级

准确率: 0.62393536546567

                                       (进行后模型的准确率)

不进行降维

准确率: 0.5940453246319576

因此降维对模型的精度也具有很大影响

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值