R 回归 虚拟变量na_基于Logistic回归与朴素贝叶斯模型的P2P平台个人信用评估

近几年,随着互联网技术的发展,互联网金融越来越受到人们的青睐。P2P网络借贷模式作为互联网金融的重要创新形式,近年来呈现爆发式增长,引发了各类"校园贷"事件。为了研究P2P平台个人信用风险,本文从Prosper平台信贷行为与客户基本情况入手,建立基于statsmodels库的Logistic回归模型和基于sklean的朴素贝叶斯模型的P2P平台个人信用评估模型,通过此模型可以对信用状况风险进行预测。使用到的库有pandas,numpy,seaborn,statsmodels。

Logistic回归

一、数据清洗

原始数据集共包含81个变量,113937条数据,选取的重要模型需求字段有有

32d286884951b70415498c8da5a14503.png

1.统计缺失值——其中两列有缺失值,数字较小因此直接删除。

http://drop.info()

drop=base.dropna()

2.筛选所需要的时间段并重建索引

df=drop[drop['ListingCreationDate']>'2008-1-1']

df.reset_index(drop=True)

3.对因变量,分类变量进行赋值并筛选(LoanStatus,EmploymentStatus,Term,IsBorrowerHomeowner)

df['LoanStatus'].replace({'Completed':1,'FinalPaymentInProgress':1,'Defaulted':0,'Chargedoff':0},inplace=True)

df=df[df['LoanStatus'].isin([0,1])]

df['EmploymentStatus'].replace({'Employed':1,'Self-employed':1,'Other':1,'Full-time':1,'Not employed':0,'Retired':0,'Part-time':1},inplace=True)

df['Term'].replace({12.0:1,60.0:2,36.0:3},inplace=True)

df['IsBorrowerHomeowner'].replace({True:1,False:0},inplace=True)

4.对连续变量分箱(DebtToIncomeRatio,BorrowerRate,StatedMonthlyIncom)

dcat=pd.cut(list(df['DebtToIncomeRatio'].values),[-0.001,0.15,0.3,0.5,10.01])

df['DebtToIncomeRatio']=dcat.codes

rate=pd.cut(list(df['BorrowerRate'].values),[-0.001,0.1,0.2,0.3,2])

df['BorrowerRate']=rate.codes

mcat=pd.cut(list(df['StatedMonthlyIncome'].values),[1,2000,4000,6000,8000,10000000])

df['StatedMonthlyIncome']=mcat.codes

5.随机重排数据

r=np.random.permutation(23404)

df=df.take(r)

df=df.sort_index()

二、logistic回归模型建立

考虑到变量若存在多重共线性会影响模型稳定性,先对各个变量取其相关系数作为验证。

从结果来看各个变量之间无显著相关。

plt.rcParams['font.family'] = 'SimHei'

plt.rcParams['axes.unicode_minus'] = False

fig, ax = plt.subplots(figsize = (6,6))

sns.heatmap(round(corr,2),annot=True,xticklabels= True, yticklabels= True,square=True,vmin=-1,vmax=1,cmap="rainbow")

ax.set_title('相关性热力图')

87a6213007b3cecdd9cb5ae1132c027f.png

1.选择前20000条数据做训练

train=df[:20000]

x_t=train[['EmploymentStatus','IsBorrowerHomeowner','StatedMonthlyIncome','BorrowerRate','Term','DebtToIncomeRatio']].values

y_t=train['LoanStatus'].values

2.估计模型

lg=sma.Logit(y_t.astype(int),x_t)

result=lg.fit()

print(result.summary())

3.取OR值,从结果来看,是否有房产,负债收入比与违约与否没有显著影响。

np.exp(result.params)

4.模型检验,模型估计精度在76%

test=df[20001:23405]

x_test=test[['EmploymentStatus','IsBorrowerHomeowner','StatedMonthlyIncome','BorrowerRate','Term','DebtToIncomeRatio']].values

y_p=result.predict(x_test)

三、数据可视化

各变量OR值一览,由此可得出有工作人群不违约概率比无业人群高2.5倍,有工作人群利率每增长一个数量级就比上一级别不违约率小1倍。

660356c25502b703e2dfd32e34094a84.png

每一显著变量分组统计计数情况(数字表示每个分箱)

87fe8e94c25d5b07bd4468e256e57bbd.png

朴素贝叶斯模型

由于传统统计库中logistic模型召回率与精度不高,预测能力有限,所以用机器学习中的朴素贝叶斯模型再次进行探索。

一、变量分析

删除含na值的列后,绘制各变量间的相关性热力图

a560c86a0d483f72b21cee1fc60b6ca2.png

二、划分测试集

按照训练集与测试集7:3的比例对数据进行划分

X = f2.drop(["LoanStatus"],axis=1)

y = f2["LoanStatus"]

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.3, random_state=42)

三、数据处理

对连续数值变量进行归一化。归一化将各范围不同的数值变量统一处理至0-1区间,能够消除各变量取值范围不同给模型带来的影响。

scaler = MinMaxScaler()

scaler.fit(X_train)

X_train = scaler.transform(X_train)

X_test= scaler.transform(X_test)

四、建立模型

mnb=MultinomialNB()

mnb.fit(X_train,Y_train.astype(int))

五、模型评估

mnb.score(X_test,Y_test.astype(int))

模型准确率达91%

print(classification_report(Y_test.astype(int),Y_p))

精度与召回率表现良好,其中对违约行为的预测精度达到100%

96bb23c674236694c8065673c6fa25d9.png

整体上来看此模型对违约用户预测具有较好的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值