所有文章 > AI驱动 > 逻辑回归模型(logistic regression)

逻辑回归模型(logistic regression)

前言

逻辑回归(Logistic Regression)是一种用于处理分类问题的统计学习方法,尽管名字中包含“回归”一词,但它实际上是一种分类算法,通常用于解决二分类问题(也可扩展到多分类问题)。逻辑回归适用于预测一个二分类目标变量的概率,它的输出值是0到1之间的一个概率。

下面是逻辑回归的基本原理:

假设:逻辑回归基于线性回归的思想,但它使用了逻辑函数(也称为sigmoid函数)来将线性输出映射到概率。逻辑函数的数学表达式为:

  是线性组合(权重乘以特征值的和)

模型:对于给定的输入特征  ,逻辑回归的模型表达式为:

其中,  是观测为类别1的概率,  是目标变量,  ,  ,…,  是模型参数

训练:模型的参数  通过最大似然估计(Maximum Likelihood Estimation,MLE)来学习,最终的目标是使观测到的样本属于其真实类别的概率最大化

决策边界: 当概率  大于某个阈值时,模型将样本预测为类别1;否则,预测为类别0。通常,阈值被设置为0.5

逻辑回归的优点包括简单、易于理解和实现,适用于线性可分或近似线性可分的问题。然而,它也有一些局限性,例如对于非线性关系的建模能力较弱。在处理复杂的非线性问题时,可能需要考虑其他更复杂的模型。

代码实现

from ucimlrepo import fetch_ucirepo 

# fetch dataset
heart_failure_clinical_records = fetch_ucirepo(id=519)

# data (as pandas dataframes)
X = heart_failure_clinical_records.data.features
y = heart_failure_clinical_records.data.targets

# metadata
print(heart_failure_clinical_records.metadata)
# variable information
print(heart_failure_clinical_records.variables)

访问UCI机器学习数据集为实验进行数据支撑。该数据集包含随访期间收集的29 9名心力衰竭患者的病历,其中每个患者档案有 13 个临床特征。目标为死亡事件:患者是否在随访期间死亡。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,roc_curve, auc
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确度
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

# 预测并计算性能指标(如AUC)
y_pred_proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc_nb = auc(fpr,tpr)

使用 scikit-learn 实现逻辑回归模型,包括数据集划分、特征标准化、模型训练、准确度计算以及通过 ROC 曲线计算 AUC 等步骤,用于解决二分类问题。

from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 输出混淆矩阵
confusion_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize = (6, 6), dpi = 300)
sns.heatmap(confusion_matrix, annot = True, annot_kws = {'size':15}, fmt = 'd', cmap = 'YlGnBu_r')
# 绘制热力图 annot = True热力图上显示数值,annot_kws设置单元格数值标签的其他属性,fmt指定单元格数据显示格式cmap用于热力图填色
plt.title('混淆矩阵热力图')
plt.xlabel('预测值')
plt.ylabel('真实值')
plt.show()

使用scikit-learn库评估分类模型的性能。它根据预测值(y_pred)和真实标签(y_test)生成混淆矩阵。通过seaborn和matplotlib,将混淆矩阵可视化为热力图,直观展示模型在预测不同类别方面的表现。

# 绘制ROC曲线
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc_nb)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC曲线')
plt.legend(loc="lower right")
plt.show()

绘制二分类模型的ROC曲线(Receiver Operating Characteristic)。ROC曲线是一种用于评估分类模型性能的图形工具,它以真正例率(True Positive Rate,又称为灵敏度或召回率)为纵轴,假正例率(False Positive Rate)为横轴,展示了在模型的性能,ROC曲线越靠近左上角,模型性能越好。

# 输出模型报告, 查看评价指标
print(classification_report(y_test, y_pred))

逻辑回归分类模型的性能报告,报告中包含了针对每个类别(在这里是0和1)的精确度(precision)、召回率(recall)、F1分数(f1-score)以及支持数量(support)。下面是对这些指标的简要解释:

  • Precision(精确度):对于预测为正类别的样本,有多少确实属于正类别。对于类别0,精确度是0.76,对于类别1,精确度是0.93。这意味着对于模型预测为0的样本,有76%确实是0;对于预测为1的样本,有93%确实是1。
  • Recall(召回率):对于实际为正类别的样本,有多少被正确地预测为正类别。对于类别0,召回率是0.97,对于类别1,召回率是0.56。这表示对于实际为0的样本,有97%被成功预测为0;对于实际为1的样本,只有56%被成功预测为1。
  • F1-Score(F1分数):精确度和召回率的调和平均值,是一个综合指标。对于类别0,F1分数是0.85,对于类别1,F1分数是0.70。
  • Support(支持数量):在测试集中属于每个类别的样本数量。对于类别0,有35个样本;对于类别1,有25个样本。
  • Accuracy(准确度):整个模型的正确分类比例,是一个综合指标。在这里,准确度为0.80,表示模型正确分类了80%的样本。
  • Macro Avg和Weighted Avg:这是宏平均和加权平均,分别是所有类别的平均值。Macro Avg计算了每个类别指标的简单平均,而Weighted Avg考虑了每个类别的样本数量,进行了加权平均。在这里,Macro Avg和Weighted Avg给出了模型整体性能的平均指标。

总体而言,这个模型对类别0的性能较好(高精确度和高召回率),但对类别1的性能稍显下降。

本文章转载微信公众号@Python机器学习AI