金融数据逾期还款预测

简介: 此项目是对金融数据做逾期还款的预测,相当于二分类问题 代码: 稍后上传

数据预处理

1. 数据集准备 数据中一共4700多条数据,一共89个field,status 表示最重要预测标签 0 :未逾期 1 :逾期 并且划分数据为测试集和训练集

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('input\data.csv',encoding='gbk')
print(data.shape)
Y=data['status']
X=data.drop('status',axis=1)
X_train,X_test,Y_train,Y_test =train_test_split(X,Y,test_size=0.3)

2.数据清洗

  1. 无关特征删除 删除没有意义的变量和缺失值太多的变量: bank_card_no 和id_name 没有意义可以去除 custid、trade_no、source、student_feature
  2. 缺失值处理 “student_feature”一列的特征值除了1就是NA,根据数据分布,判定其他的缺 失值大概率为1,因此该特征意义不大,也将这一列去除。
  3. 特征处理 文本处理 一线城市 采用 one-hot 编码

相关问题:

问题一 缺失数据: 1.1 为什么需要处理缺失值?

就如同一件喜欢的衣服上有洞的情况一样,洞小、洞少情况下舍不得扔,打打补丁不影响美观的情况下还可以继续穿。但若洞大洞多了,没法穿或穿出去被围观,就只能忍痛仍了缺失值的缺失率和重要性,
以及不同缺失值的处理方式在一定程度上影响了特征提取、建模和模型训练缺失值太多,可以尝试着直接删除,如果不删除,处理不好,可能会引来噪声缺失值较少,少于某一缺失率时,直接删除又会带来信息的损失,此时可以采取适当的填充方式

1.2 缺失率大于多少时应当抛弃该特征?

一般为70%,但是还要分析该特征与训练目标的重要程度

1.3 缺失值填充有哪些方法?   缺失值填充方法:均值,中位数,众数,拉格朗日填充,或者用模型去拟 合数据:相当于把缺失值所在的列当做是预测变量,然后去预测缺失值.

1.丢弃  
2.补全 统计法:对于数值型的数据,使用均值、加权均值、中位数等方法补足;对于分类型数据,使用类别众数最多的值补足。
3·模型法:更多时候我们会基于已有的其他字段,将缺失字段作为目标变量进行预测,从而得到最为可能的补全值。如果带有缺失值的列是数值变量,采用回归模型补全;如果是分类变量,则采用分类模型补全。
4.专家补全:对于少量且具有重要意义的数据记录,专家补足也是非常重要的一种途径。
5.真值转换。该思路的根本观点是,我们承认缺失值的存在,并且把数据缺失也作为数据分布规律的一部分,这将变量的实际值和缺失值都作为输入维度参与后续数据处理和模型计算。但是变量的实际值可以作为变量值参与模型计算,而缺失值通常无法参与运算,因此需要对缺失值进行真值转换。
6.很多模型对于缺失值有容忍度或灵活的处理方法,因此在预处理阶段可以不做处理。常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN

1.4 采用均值填充的影响或者优缺点?

大大降低数据的方差,即随机性

1.5 需要依据什么样的准则去选择合适的方法?

(1) 删除
    - 如果行和列的缺失达到一定的比例,建议放弃整行或整列数据(2) 插补
    - 列的维度上,如果是连续性,就使用平均值插补,如果是离散性,就使用众数来插补
    - 行的维度上,引入预测模型,可考虑辅助回归,通过变量间的关系来预测缺失数据
    
(3) 不处理
    当缺失值对模型的影响不大时,直接在包含空值的数据上进行数据挖掘

参考:http://blog.sina.com.cn/s/blog_1523c35670102xlcf.html

金融数据挖掘python 金融数据挖掘与处理_数据

 

问题二 数据探索

数据探索相关的问题:

对于字段较少的情况下经常使用绘图来更直观的观察数据的分布,进而对数据进行针对性的处理;但是再字段量较多的情况下一个一个字段去绘图会比较费时间,那应该用怎么的顺序逻辑对字段进行处理?

数据探索一般观察数据的分布 数据类型 等,常用的python语法有info(),describe() head()等

问题三 时间序列

时间序列应该怎么处理?除了提取天数还能做什么处理?

除了考虑时间序列这个单独的特征外,往往是将时间序列和具有时间属性的特征联合起来分析,查看组合特征的对所需要分析的内容的影响
其实就是构造不同的时间维度出来,年月日周小时等,或者也可以自己构造一个时间段出来(聚类)

参考链接: https://www.jianshu.com/p/29ece4592178

问题四 异常值和离群值

怎样判断离群值以及是否需要删除离群值或怎样替代离群值?(比如一些手动录入过程中出错产生的离群值等)

大多数的参数统计数值,如均值、标准差、相关系数 等,以及基于这些参数的统计分析,均对离群值高度敏感。因此,离群值的存在会对数据分析造成极大影响

参考: https://www.jianshu.com/p/0c967a1526ef

问题五 分类数据的编码

这里城市的分类显然不适合用独热码编码了,那么如果在其它时候使用sklearn.preprocessing中的LabelBinarizer后重新编码的文本特征又怎样应用到预测中?

需要根据实际情况去判断,我们的类别间到底存不存在距离关系。

比如成绩的 优良差。他们是有距离关系的,差和优的"距离"确实比 良和优的"距离”要远的

再比如,人种,人种之间是不存在距离区别的,黑人和白人的"距离"和白人和黄种人的"距离"是一样的

问题六 数据不平衡问题 如何处理数据不平衡的问题?(主要是指标签列的类别间不平衡) 一,信用卡欺诈 可能几百几千个客户里面才会有一个欺诈情况出现 二,网页广告点击率,这个比例更夸张 三, 医生病情误判情况

上采样 下采样  smote等方法这些都是从数据集数量本身的角度出发,增加少的类别 减少多的类别.
主要是两方面:
1. 改变数据量大小,使类别间变得平衡
2. 不改变数据量,设置成本矩阵或代价函数来限定~

参考: https://www.jiqizhixin.com/articles/021704

针对数据不平衡解决方法: 1.扩大数据集 2.小类的样本当作异常点检测问题 3.采样 :上采 ,下采 4.引入不同的评价标准 ROC曲线 5.代价敏感学习 : 不同的代价   列如:病人诊断为病人可以带来 100 的收益,健康的诊断为健康是 10 收益;但是错误的将病人诊断为健康的或者将健康的诊断为病人,有时可能会出现致命的情况,所以将这两种收益设置为-100000 6.集成学习 将多类别进行划分 然后和少的类别生成多个分类器 最后在集成