数据中1的个数为a,预测1的次数为b,预测1命中的次数为c
准确率 precision = c / b
召回率 recall = c / a
f1_score = 2 * precision * recall / (precision + recall)
项目介绍:
p2p 借贷业务具有门槛低,渠道成本低的特性,风险防控对于出借企业来说非常重要。本项目需要
从大量借贷者的数据集中分析出容易违约和不容易违约的人群画像特征,以给业务做贷前决策使
用。同时使用机器学习算法,实现自动识别风险人群(精准率为 89.86%),加快人工审查效率。
项目具体内容:
1、使用 python pandas 工具进行数据清洗、缺失值、异常值处理以及特征指标筛选。
2、使用 python matplotlib 可视化工具进行探索式数据分析,展示用户关键特征如月收入、xyk
透支情况对于违约率的影响情况。
3、使用机器学习随机森林进行建模分析,使用学习曲线、网格搜索、交叉验证,最终得到了一个评
分为 84.9%、精准率为 89.86%、召回率为 80.70%、auc 面积为 0.9337 数据预测模型。
本次数据训练使用的模型是随机森林分类算法,通过对预处理过的数据集进行训练,使用学习曲线、网格搜索、交叉验证。最终得到了一个评分为84.9%、精准率为89.86%、召回率为80.70%、 auc面积为0.9337 数据预测模型。
数据预处理的基本流程与思路:
1、首先要明确有多少特征,哪些是连续的,哪些是类别的。
2、检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。
3、对连续的数值型特征进行标准化,使得均值为0,方差为1。
4、对类别型的特征进行one-hot编码。
5、将需要转换成类别型数据的连续型数据进行二值化。
6、为防止过拟合或者其他原因,选择是否要将数据进行正则化。
7、在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。
8、根据实际问题分析是否需要对特征进行相应的函数转换。
导入数据集,并查看数据基本情况。可以看到prosper原始数据量比较庞大,一个有113937个样本,80个特征列,1个标签列。
1.1、特征较多,先共删减一部分无用的特征。
1.2 查看数据缺失情况,可以看到有40个特征是存在数据缺失的,缺失率从0.000219-0.882909不等。下面处理缺失数据。
1.2.1 删除缺失值比较多的特征
下面两个特征缺失率太高,且与我们要分析的相关性不大,直接删除掉。
1.2.2 获取数据类型是分类变量的所有特征,并使用unknown进行填充
1.2.3 特殊变量使用计算公式进行填充
1.2.4 去掉意义重复列
1.2.5 删除缺失率比较少的特征的缺失数据行
处理完缺失数据后,样本量为106290,特征量为55
1.3 数据过滤
1.3.1 从2009年7月开始,Prosper调整了对客户的评估方式,此次我们只对2009-07-01后的贷款进行分析。
过滤完数据后,样本量变为82931,特征量为54
2.1单变量分析
0为未违约人数,1位违约人数,可以看到2009.07以后,违约率为22.90%
2.1.1不同地区贷款数量分布
从图中可以看到加利福尼亚州贷款数量远比其他州的数量高。由于prosper总部就位于加利福尼亚州,这与实际情况一致。其他排名靠前的分别是得克萨斯、纽约、佛罗里达、伊利诺伊,贷款数据均超过了5000条。根据2015年美国各州的GDP排名,这5个州刚好排名前五,而且顺序也是一致的。说明Prosper平台的用户主要分布在美国经济发达的地区。
2.1.2 贷款人收入情况分布
年薪在25000美金以上在美国属于技术性白领或者有一定学历的职员,50000美金已经是近金领阶层,比如:大学教授,医生等。从图中可以看出Prosper平台用户的收入水平都相对较高,有利于用户还款,利于平台和投资者的风险控制。
2.1.3贷款人职业分布
从图中可以看出,除了不愿意透露具体职业的人,大部分用户是教授、程序员、企业高管等具有一定社会地位的人,这部分人受过高等教育,信用有一定保障。另外,这与之前看到的收入情况相符。
2.1.4贷款人债务收入比分布
大部分用户的债务收入比在0.2左右,超过0.5的占很少部分。说明Prosper平台用户的还款能力还是比较乐观的
2.1.5 贷款者xyk使用情况
BankcardUtilization代表的是xyk使用金额和xyk额度的比值,可以体现用户的资金需求。Prosper用户多是0.5~1之间,说明用户每个月还有xyk要还,降低了其还款能力。
2.2 相关的关键因素对贷款违约率的影响
2.2.1借贷人收入IncomeRange对违约率的影响
从图中可以看出:
1.一般来说收入越高违约率越低
2.贷款的人员主要集中在中等收入群体
2.2.2 债务收入比DebtToIncomeRatio对违约率的影响
从上图可以看出:
1.债务收入比小于0.6时,违约数明显小于未违约数,
2.当债务收入比大于0.6时,两者的差距不是很明显甚至违约数大于未违约数,说明了债务收入比越大的人越容易违约
2.2.3 借款人BankcardUtilization对违约率的影响
1.总的来说,随着xyk的透支比例越来越高,违约率也越来越高
2.SuperUse的违约率到了37.5%,这部分人群需要严格了监控,No Use人群也有31%的违约率,当初将xyk透支比例为0和NA的数据都归类为No Use,显然没有这么简单,应该是大部分人群的NA值是为了隐藏自己的高透支比例而填写的
2.2.4 消费信用分CreditScoreRange对违约率的影响
从上图可以看出:
1.随着信用分数CreditScore的上升,它的违约率在下降
2.大部分贷款者的信用分为650-800,违约率在0.06-0.02
2.2.5 过去7年借款人违约次数DelinquenciesLast7Years对违约率的影响
过去七年违约次数(DelinquenciesLast7Years)能够衡量一个人在过去七年中征信情况,违约一次或以上的人在借款时违约概率更大。
从上图可以看出:
1.总体来说过去7年违约次数越多,违约率越高
2.过去7年未违约的人数相对来说比其他违约的人数高很多,具体看下面的分析
3.1 数据转化
3.1.1类变量进行哑变量化
样本量变为82931,特征量为127
3.1.2 标签变量进行二分类
已完成贷款的样本量变为26365,特征量为127
未违约率为:0.7709084012895885;违约率为0.22909159871041151
3.2 至此,数据预处理的工作就告一段落,保存预处理好的数据。
导入经过预处理的prosper借贷数据集
4.1 手工挑选特征查看一下建模效果
准确率为0.7695
4.2 使用模型自己选取特征
准确率为0.7780
4.3 使用学习曲线选取最优n_estimators
在0-200/20内学习,得到最优n_estimators=161,score = 0.8508
在151-171/20内学习,得到最优n_estimators=163,score = 0.8511
4.4 使用网格搜索调其他参数
在0-60/5内学习,得到最优max_depth=41
在0-60/5内学习,得到最优max_features=16
这里由于比较耗时,没有进一步细化选择更高的参数
4.4 最终模型效果
最终准确率 0.8490528905289052
混淆矩阵 :
[[5552 554]
[1175 4914]]
精准率 : [0.82533076 0.89868325]
召回率 : [0.90926957 0.80702907]
roc和auc面积为0.9337
4.5 查看各特征的重要性
4.6 数据预测
预测的违约率0.0427
preface:做着最近的任务,对数据处理,做些简单的提特征,用机器学习算法跑下程序得出结果,看看哪些特征的组合较好,这一系列流程必然要用到很多函数,故将自己常用函数记录上。应该说这些函数基本上都会用到,像是数据预处理,处理完了后特征提取、降维、训练预测、通过混淆矩阵看分类效果,得出报告。
1.输入
从数据集开始,提取特征转化为有标签的数据集,转为向量。拆分成训练集和测试集,这里不多讲,在上一篇博客中谈到用StratifiedKFold()函数即可。在训练集中有data和target开始。
2.处理
[python] view plain copy
def my_preprocessing(train_data):
from sklearn import preprocessing
X_normalized = preprocessing.normalize(train_data ,norm = "l2",axis=0)#使用l2范式,对特征列进行正则
return X_normalized
def my_feature_selection(data, target):
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
data_new = SelectKBest(chi2, k= 50).fit_transform(data,target)
return data_new
def my_PCA(data):#data without target, just train data, withou train target.
from sklearn import decomposition
pca_sklearn = decomposition.PCA()
pca_sklearn.fit(data)
main_var = pca_sklearn.explained_variance_
print sum(main_var)*0.9
import matplotlib.pyplot as plt
n = 15
plt.plot(main_var[:n])
plt.show()
def clf_train(data,target):
from sklearn import svm
#from sklearn.linear_model import LogisticRegression
clf = svm.SVC(C=100,kernel="rbf",gamma=0.001)
clf.fit(data,target)
#clf_LR = LogisticRegression()
#clf_LR.fit(x_train, y_train)
#y_pred_LR = clf_LR.predict(x_test)
return clf
def my_confusion_matrix(y_true, y_pred):
from sklearn.metrics import confusion_matrix
labels = list(set(y_true))
conf_mat = confusion_matrix(y_true, y_pred, labels = labels)
print "confusion_matrix(left labels: y_true, up labels: y_pred):"
print "labels\t",
for i in range(len(labels)):
print labels[i],"\t",
for i in range(len(conf_mat)):
print i,"\t",
for j in range(len(conf_mat[i])):
print conf_mat[i][j],'\t',
def my_classification_report(y_true, y_pred):
from sklearn.metrics import classification_report
print "classification_report(left: labels):"
print classification_report(y_true, y_pred)
my_preprocess()函数:
主要使用sklearn的preprocessing函数中的normalize()函数,默认参数为l2范式,对特征列进行正则处理。即每一个样例,处理标签,每行的平方和为1.
my_feature_selection()函数:
使用sklearn的feature_selection函数中SelectKBest()函数和chi2()函数,若是用词袋提取了很多维的稀疏特征,有必要使用卡方选取前k个有效的特征。
my_PCA()函数:
主要用来观察前多少个特征是主要特征,并且画图。看看前多少个特征占据主要部分。
clf_train()函数:
可用多种机器学习算法,如SVM, LR, RF, GBDT等等很多,其中像SVM需要调参数的,有专门调试参数的函数如StratifiedKFold()(见前几篇博客)。以达到最优。
my_confusion_matrix()函数:
主要是针对预测出来的结果,和原来的结果对比,算出混淆矩阵,不必自己计算。其对每个类别的混淆矩阵都计算出来了,并且labels参数默认是排序了的。
my_classification_report()函数:
主要通过sklearn.metrics函数中的classification_report()函数,针对每个类别给出详细的准确率、召回率和F-值这三个参数和宏平均值,用来评价算法好坏。另外ROC曲线的话,需要是对二分类才可以。多类别似乎不行。
主要参考sklearn官网欢迎分享,转载请注明来源:内存溢出
评论列表(0条)