跳至主要内容

理解 Python 中的逻辑回归

了解逻辑回归及其基本性质,并使用 scikit-learn 在 Python 中基于真实应用构建机器学习模型。
· 10分钟 阅读

使用 AI 探索

分类技术是机器学习和数据挖掘应用中不可或缺的一部分。大约 70% 的数据科学问题属于分类问题。分类问题很多,但逻辑回归较为常见,并且是解决二元分类问题的一种有用回归方法。另一类分类是多项式分类(Multinomial classification),用于处理目标变量包含多个类别的情况。例如,IRIS 数据集就是著名的多类分类示例。其他示例还包括对文章/博客/文档类别进行分类。

逻辑回归可用于多种分类问题,例如垃圾邮件检测。其他示例包括:糖尿病预测、某位客户是否会购买特定产品、客户是否会流失、用户是否会点击某个广告链接,等等。

逻辑回归是最简单、最常用的二分类机器学习算法之一。它易于实现,可作为任何二元分类问题的基线模型。其基本概念在深度学习中也很有启发性。逻辑回归用于描述并估计一个二元因变量与自变量之间的关系。

若要轻松亲自运行本教程中的所有示例代码,您可以免费创建一个 DataLab 工作簿,其中已预装 Python,并包含全部代码示例。若想进一步练习逻辑回归,请查看我们课程 Credit Risk Modeling in R 中的练习,该课程提供大量真实案例。 

什么是逻辑回归?

逻辑回归是一种用于预测二元类别的统计方法。结果或目标变量具有二分性质。二分意味着只有两种可能的类别。例如,它可用于癌症检测问题。该方法计算事件发生的概率。

它是线性回归的一种特例,其中目标变量的性质为分类变量。它使用对数几率作为因变量。逻辑回归利用 logit 函数来预测二元事件发生的概率。 

线性回归方程:

linear regression equation

其中 y 为因变量,x1、x2 …… Xn 为自变量(解释变量)。

Sigmoid 函数:

sigmoid function equation

在线性回归上应用 Sigmoid 函数:

sigmoid function and linear regression equation

逻辑回归的性质:

  • 逻辑回归中的因变量服从伯努利分布。
  • 参数估计通过极大似然法完成。
  • 没有 R 平方,模型拟合度通过一致性(Concordance)、KS 统计量计算。

线性回归 vs. 逻辑回归

线性回归给出连续型输出,而逻辑回归给出离散型输出。连续输出的例子有房价和股价。离散输出的例子包括预测患者是否患癌、预测客户是否会流失。逻辑回归通常采用极大似然估计(MLE)方法估计参数,而线性回归通常采用普通最小二乘(OLS)估计;当模型误差服从正态分布时,OLS 也可视为 MLE 的特殊情形。

Linear regression vs logistic regression visualized

极大似然估计 vs. 最小二乘法

MLE 是一种“似然”最大化方法,而 OLS 是一种距离最小化的逼近方法。通过最大化似然函数,可以确定最有可能产生观测数据的参数。从统计角度看,MLE 将均值与方差作为参数,用于确定给定模型的具体参数取值。该参数集合可用于预测正态分布情形下所需的数据。

普通最小二乘法通过在给定数据点上拟合一条使平方偏差和最小(最小二乘误差)的回归直线来计算估计。二者都用于估计线性回归模型的参数。MLE 假设存在联合概率质量函数,而 OLS 在最小化距离时不需要随机性假设。

Sigmoid 函数

Sigmoid 函数(也称逻辑函数)产生一条“S”形曲线,可将任意实数映射到 0 与 1 之间的值。当曲线趋于正无穷时,预测的 y 将接近 1;当曲线趋于负无穷时,预测的 y 将接近 0。若 Sigmoid 函数的输出大于 0.5,我们可将结果分类为 1 或 YES;若小于 0.5,则可分类为 0 或 NO。比如,若输出为 0.75,我们可以用概率表述为:患者患癌的可能性为 75%。

eq4

Sigmoid function graph in Python

逻辑回归的类型

逻辑回归的类型:

  • 二元逻辑回归:目标变量只有两种可能结果,如垃圾/非垃圾、患癌/未患癌。
  • 多项逻辑回归:目标变量有三个或更多名义类别,例如预测葡萄酒的类型。
  • 有序逻辑回归:目标变量有三个或更多有序类别,例如餐厅或产品的 1 到 5 分评级。

在 Scikit-learn 中构建模型

让我们使用逻辑回归分类器来构建一个糖尿病预测模型。

首先使用 pandas 的 CSV 读取函数加载所需的 Pima 印第安人糖尿病数据集。您可以从以下链接下载数据:https://www.kaggle.com/uciml/pima-indians-diabetes-database,或从 DataCamp 选择数据集:https://www.datacamp.com/datalab/datasets。该即用型数据集支持您在 DataLab(DataCamp 的云端免费 Jupyter 笔记本)上训练模型。 

加载数据

我们将通过为 pandas 的 read_csv() 函数提供 col_names 来简化列名。

#import pandas
import pandas as pd
col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()

screenshot of Pima Indian Diabetes dataset

选择特征

此处需要将给定列分为两类变量:因变量(或目标变量)与自变量(或特征变量)。

#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

切分数据

为理解模型表现,将数据集划分为训练集与测试集是一个好策略。

我们使用 train_test_split() 函数来分割数据集。您需要传入 3 个参数:features、target 和 test_set 的大小。此外,您可以使用 random_state 随机选择记录。

# split X and y into training and testing sets
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=16)

此处数据集按 75:25 的比例被拆分。这意味着 75% 的数据用于模型训练,25% 用于模型测试。

模型开发与预测

首先导入 LogisticRegression 模块,并使用 LogisticRegression() 函数创建一个逻辑回归分类器对象,同时设置 random_state 以保证可复现性。

然后在训练集上使用 fit() 拟合模型,并在测试集上使用 predict() 进行预测。 

# import the class
from sklearn.linear_model import LogisticRegression

# instantiate the model (using the default parameters)
logreg = LogisticRegression(random_state=16)

# fit the model with data
logreg.fit(X_train, y_train)

y_pred = logreg.predict(X_test)

使用混淆矩阵进行模型评估

混淆矩阵是一张用于评估分类模型性能的表。您也可以借此可视化算法的表现。混淆矩阵的核心在于按类别汇总的正确与错误预测数量。

# import the metrics class
from sklearn import metrics

cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
cnf_matrix
array([[115,   8],
      [ 30,  39]])

此处您可以看到以数组对象形式呈现的混淆矩阵。该矩阵维度为 2×2,因为这是一个二分类模型。您有两个类别 0 和 1。对角线上的值表示预测正确,非对角线元素表示预测错误。在输出中,115 和 39 是正确预测,30 和 8 是错误预测。

使用热力图可视化混淆矩阵

让我们使用 matplotlib 和 seaborn 以混淆矩阵的形式可视化模型结果。

这里您将使用热力图来可视化混淆矩阵。

# import required modules
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

class_names=[0,1] # name  of classes
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
# create heatmap
sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu" ,fmt='g')
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')

Text(0.5,257.44,'Predicted label');

confusion matrix for Pima Indian Diabetes dataset

混淆矩阵评估指标

让我们使用 classification_report 来评估准确率(accuracy)、精确率(precision)和召回率(recall)。

from sklearn.metrics import classification_report
target_names = ['without diabetes', 'with diabetes']
print(classification_report(y_test, y_pred, target_names=target_names))
   precision    recall  f1-score   support

without diabetes       0.79      0.93      0.86       123
  with diabetes       0.83      0.57      0.67        69

        accuracy                           0.80       192
      macro avg       0.81      0.75      0.77       192
    weighted avg       0.81      0.80      0.79       192

模型的分类准确率为80%,可视为不错的精度。

精确率(Precision):强调“精确”,即模型有多准确。换言之,当模型做出正类预测时,它有多大概率是对的。在您的预测中,当逻辑回归模型预测患者将患糖尿病时,该预测有 73% 的时间是正确的。

召回率(Recall):若测试集中确有患糖尿病的患者,您的逻辑回归模型能有 57% 的概率将其识别出来。

ROC 曲线

ROC(受试者工作特征)曲线是以真正率对假正率作图,展示灵敏度与特异性的权衡。

y_pred_proba = logreg.predict_proba(X_test)[::,1]
fpr, tpr, _ = metrics.roc_curve(y_test,  y_pred_proba)
auc = metrics.roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
plt.legend(loc=4)
plt.show()

ROC for Pima Indian Diabetes dataset

本例的 AUC 得分为 0.88。AUC 为 1 表示完美分类器,0.5 表示无效分类器。

代码源可在 DataLab 获取:Understanding Logistic Regression in Python。

优势

由于其高效而简洁,它不需要高计算能力,易于实现、易于解释,被数据分析师和科学家广泛采用。同时,它不需要对特征进行缩放。逻辑回归还能为观测提供概率分数。

劣势

逻辑回归难以处理大量的分类特征/变量,容易过拟合;它也无法解决非线性问题,因此需要对非线性特征进行变换。当自变量与目标变量不相关,或彼此高度相似/相关时,逻辑回归表现也会较差。

总结

在本教程中,您学习了关于逻辑回归的诸多内容。您了解了什么是逻辑回归、如何构建相应模型、如何可视化结果,以及一些理论背景知识。同时还回顾了 Sigmoid 函数、极大似然、混淆矩阵、ROC 曲线等基础概念。

希望您现在可以将逻辑回归技术应用于您自己的数据集。感谢阅读本教程!

如果您想继续学习逻辑回归,请学习 DataCamp 的 Machine Learning with scikit-learn 课程。您也可以通过报名 Machine Learning Scientist with Python 职业路径,开启成为机器学习工程师的旅程。

主题