近几年,随着互联网技术的发展,互联网金融越来越受到人们的青睐。P2P网络借贷模式作为互联网金融的重要创新形式,近年来呈现爆发式增长,引发了各类"校园贷"事件。为了研究P2P平台个人信用风险,本文从Prosper平台信贷行为与客户基本情况入手,建立基于statsmodels库的Logistic回归模型和基于sklean的朴素贝叶斯模型的P2P平台个人信用评估模型,通过此模型可以对信用状况风险进行预测。使用到的库有pandas,numpy,seaborn,statsmodels。
Logistic回归
一、数据清洗
原始数据集共包含81个变量,113937条数据,选取的重要模型需求字段有有
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('相关性热力图')
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倍。
每一显著变量分组统计计数情况(数字表示每个分箱)
朴素贝叶斯模型
由于传统统计库中logistic模型召回率与精度不高,预测能力有限,所以用机器学习中的朴素贝叶斯模型再次进行探索。
一、变量分析
删除含na值的列后,绘制各变量间的相关性热力图
二、划分测试集
按照训练集与测试集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%
整体上来看此模型对违约用户预测具有较好的性能。