机器学习【系列】之第二章逻辑回归模型

机器学习【系列】之第二章逻辑回归模型

第二章 逻辑回归模型


前言

本章主要讲解机器学习中非常经典的逻辑回归模型,包括逻辑回归的算法原理和编程实现等,并通过一个逻辑回归的经典案例------客户流失预警模型,来巩固所学知识,最后会讲解机器学习中对于分类模型常见的模型评估方法。

上一章学习的线性回归模型是一种回归模型,它对连续变量进行预测,如预测收入范围,客户价值等。如果要对离散变量进行预测,则要使用分类模型。分类模型与回归模型的区别在于其预测的变量是不连续的,而是离散的一些区别,例如,最常见的二分类模型可以预测一个人是否违约、客户是否会流失、肿瘤是良性的还是恶性的等。本章要学习的逻辑回归模型中虽然名字中有“回归”二字,但其在本质上却是分类模型。


一、逻辑回归模型的算法原理

可以通过如下代码绘制Sigmoid函数的图像:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-6,6)  # 通过linespace()函数生成-6——6的等差数列,默认50个数
y = 1.0/(1.0+np.exp(-x))
# Sigmod函数计算公式,exp()为以自然数常数e为底的指数函数
plt.plot(x,y)
plt.show()

在这里插入图片描述

逻辑回归模型的本质就是预测属于各个分类的概率,有了概率之后,就可以进行分类了。对于二分类的问题来说,例如在预测客户是否会进行违约的模型中,如果预测违约的概率为P为70%,则违约的概率为30%,违约概率大于不违约概率,此时就可以认为该客户会违约。对于多分类问题来说,逻辑回归模型会预测属于各个分类的概率(各个概率之和为1),然后根据哪个概率最大,判定属于哪个分类。
了解了逻辑回归模型的基本原理后,在实际模型搭建中,就是要找到合适的系数ki和截距项k0,使预测的概率较为准确,在数学中使用极大似然估计法来确定合适的系数ki和截距项k0。

想要深入了解其数学算法原理的同学可以在搜索资料,这里就不展开了。

二、逻辑回归模型的代码实现

1.逻辑回归模型的代码实现

X = [[1, 0], [5, 1], [6, 4], [4, 2], [3, 2]]
y = [0, 1, 1, 0, 0]

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X, y)  

print(model.predict([[2,2]]))
print(model.predict([[1,1], [2,2], [5, 5]]))
print(model.predict([[1, 0], [5, 1], [6, 4], [4, 2], [3, 2]]))  
# 因为这里演示的多个数据和X是一样的,所以也可以直接写成model.predict(X)

-->输出结果为:
[0]
[0 0 1]
[0 1 1 1 0]

2.逻辑回归模型的深入理解

代码如下(示例):

import pandas as pd
a = pd.DataFrame(y_pred_proba, columns=['分类为0的概率', '分类为1的概率'])  # 2.2.1 通过numpy数组创建DataFrame
print(a)
print(model.coef_)  # 打印输出系数k1,k2
print(model.intercept_) #打印输出截距项k0

在这里插入图片描述

3.补充知识点:用逻辑回归模型处理多分类问题

X = [[1, 0], [5, 1], [6, 4], [4, 2], [3, 2]]
y = [-1, 0, 1, 1, 1]

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X, y)

print(model.predict([[0, 0]]))

model.predict(X)
print(model.predict_proba([[0, 0]]))

-->输出结果为:
[-1]
[[0.40456707 0.27958903 0.3158439 ]]

三、案例实战:客户流失预警模型

1.案例背景

如果一个客户不再通过某个证劵公司交易,即该客户流失了,那么该证劵公司便损失了一个收入来源,因此,证劵公司会搭建一套客户流失预警模型来预测客户是否会流失,并对流失概率较大的客户采取相对应的挽回措施,因为通常情况下,获得新客户的成本比保留现有客户的成本要高得多。

2.数据读取与变量划分

# 1.读取数据
df = pd.read_excel("股票客户流失.xlsx")
# print(df.head())

# 2.划分特征变量和目标变量
X = df.drop(columns='是否流失')
y = df["是否流失"]

3.模型的搭建与使用

1.划分训练集和测试集

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=1)

2.模型搭建

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train,y_train)  # 传入参数是上一步骤获得的训练集数剧X_train,y_train

3模型使用1:预测数据结果

y_pred = model.predict(X_test)

a = pd.DataFrame() # 创建一个空的DataFrame
a["预测值"] = list(y_pred)
a["实际值"] = list(y_test)
# print(a.head())
# 查看所有测试集数据的预测准确度
# 方法一:
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred,y_test)
# print(score)
# 方法二:
# print(model.score(X_test,y_test))

4.模型使用2:预测概率

y_pred_prba = model.predict_log_proba(X_test)
a = pd.DataFrame(y_pred_prba,columns=["不流失概率","流失概率"])
print(a.head())

在这里插入图片描述
5.获得逻辑回归系数

print(model.coef_)
print(model.intercept_)

-->输出结果为:
[[ 2.38800779e-05  8.05683618e-03  1.03327747e-02 -2.52102650e-03 -1.11180522e-04]]
[-1.41822666e-06]

四、模型评估方法:ROC曲线与KS曲线

1.ROC曲线的基本原理

(根据上述的案例来解释)其中

  1. 986为True Positive(TP)正确肯定
  2. 93为False Negative(FN)漏报
  3. 194为False Positive(FP)虚报
  4. 154为True Negative(TN)正确否定

在这里插入图片描述
命中率(TPR)= 预测为流失且实际流失的客户 / 实际流失的客户
假警报率(FPR)= 预测为流失但实际未流失的客户 / 实际未流失的客户

一个优秀的客户流失预警模型,命中率(TPR)应该尽可能高,即能尽量揪出潜在流失客户,同时假报警率(RPR)应该尽可能低,即不要把未流失客户误判为流失客户。

2.混淆矩阵的Python代码实现

from sklearn.metrics import confusion_matrix
m = confusion_matrix(y_test,y_pred)
a = pd.DataFrame(m,index=["0(实际不流失)","1(预测流失)"],columns=["0(预测不流失)","1(预测流失)"])
print(a)

from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))  # 传入预测值和实际值

在这里插入图片描述

3.案例实战:用ROC曲线评估客户流失预警

模型

from sklearn.metrics import roc_curve
fpr,tpr,thres = roc_curve(y_test,y_pred_proba[:,1])
a = pd.DataFrame()
a["阀值"] = list(thres)
a["假报警率"] = list(fpr)
a["命中率"] = list(tpr)

roc_curve()函数传入测试集的目标变量y_test及预测流失概率y_pred_proba[:,1],计算出不同阀值的下的命中率和假报警率。因为roc_curve()函数返回的是一个含有3个元素的元组,其中默认第1个元素为假报警率,第2个元素为命中率,第3个元素为阀值,所以这里将这三者赋给变量fpr(假报警率)、tpr(命中率)、thres(阀值)。

import matplotlib.pyplot as plt
plt.plot(fpr,tpr)
plt.title("ROC")
plt.xlabel("FPR")
plt.ylabel("TPR")
plt.show()

在这里插入图片描述

4.KS曲线的基本原理

KS曲线和ROC曲线在本质上是相同的,同样关注命中率(TPR)和假报警率(FPR),希望命中率(TPR)尽可能高,即揪出潜在流失客户,同时也希望假报警率(FPR)尽可能低,即不要把未流失客户误判为流失客户。
KS值就是KS曲线的峰值
一般情况下,我们希望模型有较大的KS值,因为较大的KS值说明模型有较强的区分能力,不同取值范围的KS值的含义如下:

  • KS值小于0.2,一般认为模型的区分能力较弱;
  • KS值在区间[0.2,0.3]区间内,模型具有一定区分能力;
  • KS值在区间[0.3,0.5]区间内,模型具有较强的区分能力。

但KS值也不是越大越好,如果KS值大于0.75,往往表示模型有异常。在商业实战中,KS值处于[0.2,0.3]区间内就已经算是挺不错的了。

5.案例实战:用KS曲线评估客户流失预警模型

from sklearn.metrics import roc_curve
fpr,tpr,thres = roc_curve(y_test,y_pred_proba[:,1])
a = pd.DataFrame()
a["阀值"] = list(thres)
a["假报警率"] = list(fpr)
a["命中率"] = list(tpr)


# 因为表格第一行中的阀值大于1,无意义,会导致绘制出的图形不美观,所以通过切片的方式将第一行剔除,
其中thres[1:],tpr[1:],fpr[1:]都表示从第二个元素开始绘制。
plt.plot(thres[1:],tpr[1:])
plt.plot(thres[1:],fpr[1:])
plt.plot(thres[1:],tpr[1:]-fpr[1:])
plt.xlabel("threshold")
plt.legend(["tpr","fpr","tpr-fpr"])
plt.gca().invert_xaxis()
# 先用gca()函数获取坐标轴的信息,在用invert_xaxis()函数反转x轴
plt.show()


# 快速求出KS值
print(max(tpr-fpr))
--->输出结果为:
0.4754081488944501

在这里插入图片描述


总结

参考书籍:《Python大数据分析与机器学习商业案例实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值