荐 基于逻辑回归预测贷款违约
基于逻辑回归预测贷款违约
摘要
金融机构审批贷款时会收集客户个人信息,包括年龄、收入、学历、职业、家庭情况、借贷历史等信息,在对各项信息综合考虑的基础上决定是否审批贷款。过去该项工作主要依靠人工审核,随着人工智能技术的发展,数据分析和机器学习成为金融风控领域的重要工具。本文利用数据竞赛平台Kaggle提供的贷款历史数据,对数据进行预处理后,使用python构建逻辑回归模型,利用模型预测贷款人的违约情况。
关键词:数据分析,逻辑回归,预测
本文尝试使用python构建模型,利用模型预测贷款人的违约情况。通过贷款数据(如用户个人信息、贷款状态等)来训练模型,通过模型分析贷款人的偿还能力,预测贷款申请人是否会发生违约。因为已知贷款状态是否违约以及各特征变量的值,判定贷款申请人会不会违约是一个二分类问题,是一个监督学习的场景,可以通过分类算法来处理。
本文采用kaggle提供的数据,包含大于284807条用户贷款数据。具体如图1。Class是因变量,0表示没有违约,1表示发生了违约,其他的是自变量。
图1
- 数据处理
1.1数据读取与分析
data=pd.read_csv('creditcard.csv'),读入数据,使用describe()查看数据基本信息,包括每个特征值的均值、各分位数等。结果见图2
图2
Class的均值是0.001727,说明违约率是0.1727%,说明数据不均衡,违约的数据量远远小于正常的数据量,需要进行样本均衡化;Amount变量范围较大,远远大于V1-V28,需要进行标准化处理。Time变量无实际意义,丢弃即可。
1.2.特征标准化
特征标准化就是将数据处理后在一个小范围内波动,公式如下:
Z为标准化后的数据,X为原始数据,Xmean为原始数据的均值,std(X)为原始数据的标准差。Python中提供了StandardScaler模块可以进行特征标准化。
1.3样本均衡化
图3是Class=0和Class=1的数据对比,可以发现正常数据远远超过异常数据,样本存在不均衡现象。
图3
样本不均衡的解决方法分为下采样和过采样,下采样会误杀样本数量,使用过采样解决样本不均衡,使用SMOTE算法生成数据,python中提供了imblearn包可以实现该算法。
oversampler=SMOTE(random_state=0)
X_train,y_train=oversampler.fit_sample(X_train,y_train)
2.建立逻辑回归模型
按照80%是比例,把数据分为训练集和测试集。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)
logic_clf=LogisticRegression() #生成一个逻辑回归模型
logic_clf.fit(X_train,y_train.values.ravel()) #用训练集进行拟合,获得模型
score=logic_clf.score(X_test,y_test) 使用模型对X_test数据进行测试,并与y_test比较,获得准确率
使用confusion_matrix方法获得混淆矩阵
y_pred=logic_clf.predict(X_test)
cnf_matrix=confusion_matrix(y_test,y_pred)
准确率和混淆矩阵如下:
0.9450257636776112
[[55300 1424]
[ 4828 52174]]
3.结论
使用逻辑回归模型,得到的预测准确率94.5%,具有很高的使用价值,在后续的工作中,将尝试采用其他算法例如贝叶斯模型、神经网络的方法构建模型,进一步提高模型准确度。
代码:
import pandas as pd
data=pd.read_csv('creditcard.csv')
print(data)
#查看数据概述
print(data.describe())
# #查看样本数据是否均衡
# import matplotlib.pyplot as plt
# count_class=pd.value_counts(data['Class'],sort=True).sort_index()
# count_class.plot(kind='bar')
# plt.title('class histogram')
# plt.xlabel('Class')
# plt.ylabel('Frequency')
# plt.show()
#特征标准化
from sklearn.preprocessing import StandardScaler
data['normAmount']=StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))
data=data.drop(['Time','Amount'],axis=1)
print(data)
#切分数据
#数据
X=data.loc[:,data.columns!='Class']
#标签
y=data.loc[:,data.columns=='Class']
#过采样
from imblearn.over_sampling import SMOTE
oversampler=SMOTE(random_state=0)
X,y=oversampler.fit_sample(X,y)
print("过采样")
print(X)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)
print(X_train)
# #过采样方案
# from imblearn.over_sampling import SMOTE
# oversampler=SMOTE(random_state=0)
# X_train,y_train=oversampler.fit_sample(X_train,y_train)
# print(X_train)
from sklearn.linear_model import LogisticRegression
logic_clf=LogisticRegression() #生成一个逻辑回归模型
logic_clf.fit(X_train,y_train.values.ravel()) #训练
y_pred=logic_clf.predict(X_test)
#计算准确率
score=logic_clf.score(X_test,y_test)
print(score)
#计算混淆矩阵
from sklearn.metrics import confusion_matrix
cnf_matrix=confusion_matrix(y_test,y_pred)
print(cnf_matrix)
本文地址:https://blog.csdn.net/MATLAB_matlab/article/details/107574723