机器学习【系列】之第二章逻辑回归模型
第二章 逻辑回归模型
文章目录
- 机器学习【系列】之第二章逻辑回归模型
- 前言
- 一、逻辑回归模型的算法原理
- 二、逻辑回归模型的代码实现
- 1.逻辑回归模型的代码实现
- 2.逻辑回归模型的深入理解
- 3.补充知识点:用逻辑回归模型处理多分类问题
- 三、案例实战:客户流失预警模型
- 1.案例背景
- 2.数据读取与变量划分
- 3.模型的搭建与使用
- 四、模型评估方法:ROC曲线与KS曲线
- 1.ROC曲线的基本原理
- 2.混淆矩阵的Python代码实现
- 3.案例实战:用ROC曲线评估客户流失预警
- 4.KS曲线的基本原理
- 5.案例实战:用KS曲线评估客户流失预警模型
- 总结
前言
本章主要讲解机器学习中非常经典的逻辑回归模型,包括逻辑回归的算法原理和编程实现等,并通过一个逻辑回归的经典案例------客户流失预警模型,来巩固所学知识,最后会讲解机器学习中对于分类模型常见的模型评估方法。
上一章学习的线性回归模型是一种回归模型,它对连续变量进行预测,如预测收入范围,客户价值等。如果要对离散变量进行预测,则要使用分类模型。分类模型与回归模型的区别在于其预测的变量是不连续的,而是离散的一些区别,例如,最常见的二分类模型可以预测一个人是否违约、客户是否会流失、肿瘤是良性的还是恶性的等。本章要学习的逻辑回归模型中虽然名字中有“回归”二字,但其在本质上却是分类模型。
一、逻辑回归模型的算法原理
可以通过如下代码绘制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曲线的基本原理
(根据上述的案例来解释)其中
- 986为True Positive(TP)正确肯定
- 93为False Negative(FN)漏报
- 194为False Positive(FP)虚报
- 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大数据分析与机器学习商业案例实战》