python逻辑回归

逻辑回归的概念

    逻辑回归是大数据技术的机器学习一种方法,它借助对某个事件的历史数据结果进行分析,从而预测某个事件未来发生的概率,是一种概率型非线性回归。其中概率取值只有“是”和“否”两种可能,并分别记为“1”和“0”。它最初是研究导致某年流行疾病发生的原因并找到相关的影响因素,然后通过流行疾病相关的影响因素去预测某年发生该流行疾病的可能性,后来慢慢地应用于信贷风险控制。


                                                                   图1.python数据挖掘流程图


Python逻辑回归步骤:

第一将数据进行预处理,并分为训练集和预测集:2016年某银行历史数据为训练集、2017年某银行历史数据为预测集;

第二对训练集进行训练,并得到相关模型:将2016年某银行历史数据进行python逻辑回归分析得到筛选出有效的特征值,根据筛选出有效的特征值建立风险控制模型,并计算模型平均正确率。当模型的平均正确率较高时则可以采用模型。否则继续之前步骤想办法提高模型的平均正确率到较高的水平; 

第三将得到模型对预测集进行预测:假设我们不知道2017年某银行历史数据违约结果,将建立的模型对2017年某银行历史数据进行违约结果预测

第四模型预测结束获得结果:当模型运行结束,我们将得到2017年某银行历史数据的违约预测结果

第五将得到的结果进行数据可视化:将2017年某银行历史数据违约预测结果以图或者表形式进行展现

第六评估模型的可行性:将2017年某银行历史数据违约预测结果与真实结果比较,如果结果相差不大,我们则可以说模型是可行的 ,并可以用它对未来2018年某银行数据进行预测最终达到风险控制的目的。


我们现有一笔2016年某银行的客户信息和违约情况经数据处理后,获得如下图所示,共计1490条数据。同样模板的2017年某银行历史数据共计700条数据。


                                            图2.2016年某银行历史数据

注:这里推荐使用Anaconda3软件运行代码 ,不要使用Anaconda2软件或者python2软件、python3软件

#-*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel("c:/2018/2016myjb.xlsx")
print (data)

x = data.iloc[:,:8].as_matrix() #行全选,列选下标0-7
print ("x: \n", x) 

y = data.iloc[:,8].as_matrix()#行全选,列选下标8
print ("y: \n", y) 


from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR

#建立随机逻辑回归模型,筛选变量,特征筛选用了默认阈值0.25
rlr = RLR(selection_threshold=0.25)

#训练模型
rlr.fit(x, y)

#获取特征筛选结果,也可以通过.scores_方法获取各个特征的分数
rlr.get_support()

print(u'通过随机逻辑回归模型筛选特征结束')
print(u'有效特征为:%s' % ','.join(data.drop('违约', axis=1).columns[rlr_support]))

x = data[data.drop('违约', axis=1).columns[rlr_support]].as_matrix() #筛选好特征
lr = LR() #建立逻辑回归模型
lr.fit(x, y) #用筛选后的特征数据来训练模型
print(u'逻辑回归模型训练结束')
print(u'模型的平均正确率为:%s' % lr.score(x, y)) #给出模型的平均正确率

#用测试集预测
te = pd.read_excel("c:/2018/2017myjb.xlsx")
print (te)

# 8个属性
xte =te.iloc[:, :8].as_matrix()

# 第九列  结果标签
yte= te.iloc[:, 8].as_matrix()

#筛选特征
xte1 = te[te.drop('违约', axis=1).columns[rlr.get_support()]].as_matrix()

#预测
pte=lr.predict(xte1)
print (pte)

我们将得到如下的输出结果:

图3.训练、预测结果


参考图3,我们看到利用逻辑回归分析从2016年某银行历史数据的客户属性中筛选出有效特征:工龄、地址、负债率、信用卡负债,利用这些特征值去构建风险控制模型,模型的平均正确率为81.71%,模型的平均正确率处于较高的水平,因此我们可以采用模型。拿建立模型对同样模板但假设我们不知道客户的违约情况的2017年某银行历史数据进行预测分析,图中1代表预测2017年某银行历史数据中某客户可能会有违约情况发生,0代表预测2017年某银行历史数据中某客户可能不会有违约情况发生。为了评估模型是否可行,我们进行2017年某银行历史数据预测的违约结果与真实结果进行误差比较。继续加上下面这段代码运行。

#二元分类法
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"] #用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False #用来正常显示负号
confusion_matrix = confusion_matrix(yte,pte)
print(confusion_matrix)
plt.matshow(confusion_matrix)
plt.colorbar()
plt.ylabel(u"实际类型")
plt.xlabel(u"预测类型")
plt.show()


图4.预测结果与真实结果比较

为了方便分析,将上图的结果进行表格统计分析

                                                                    表1.  预测结果与真实结果比较


从上表中,我们可以看到2017年某银行历史数据(预测集)一共有480+37+92+91=700条数据,能正确预测客户是否违约的有480+91=571条,占总数据比例为81.57%,不能正确预测客户是否违约的有37+92=129条,占总数据比例为18.43%,其中有37个“实际不违约”的客户被系统错误判断为“预测违约”,有92个“实际违约”客户被系统错误判断为“预测不违约”。我们可以发现对2017年某银行历史数据的违约预测结果与真实结果比较相差不是很大,说明我们建立的风险控制模型是可行的 。就可以建立风险模型对未来2018年的某银行数据进行客户预测是否会有违约情况后决定是否贷款,当输出结果为1时预测客户可能会有违约情况发生,为了避免风险可以决定不贷款给该用户。当输出结果为0时预测客户可能不会有违约情况发生,相对违约可能性会比较小可以决定贷款给该用户。




猜你喜欢

转载自blog.csdn.net/tjfsuxyy/article/details/80801888