47、逻辑回归的分类模型的评估指标【用Python进行AI数据分析进阶教程】

用Python进行AI数据分析进阶教程47:

逻辑回归的分类模型的评估指标


关键词:逻辑回归、准确率、召回率、F1 值、混淆矩阵

摘要:本文介绍了逻辑回归分类模型的常用评估指标,包括准确率、召回率、F1 值和混淆矩阵。准确率衡量模型整体预测正确性,但在类别不平衡时可能不具代表性;召回率关注模型识别正例的能力,在医疗诊断等场景中尤为重要;F1 值综合考虑了准确率与召回率,适用于需要两者平衡的任务;混淆矩阵则直观展示分类结果,便于分析模型在各类别上的表现。文章通过 Python 示例代码演示了如何在 sklearn 中使用相关评估函数,并结合鸢尾花数据集进行实验。结果显示,逻辑回归模型在测试集上表现出较高的准确率、召回率和 F1 值,但作者也强调单一指标不足以全面评价模型性能,应结合多个指标综合分析。

👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏


在 Python 机器学习中,逻辑回归是常用的分类算法,评估其分类模型性能的指标有很多,下面详细介绍准确率、召回率、F1 值和混淆矩阵,并给出相应的示例代码和重点语句解读。

一、准确率(Accuracy)

1、关键点

  • 定义:准确率是指模型预测正确的样本数占总样本数的比例,公式为:,其中TP(True Positive)是真正例,TN(True Negative)是真反例,FP(False Positive)是假正例,FN(False Negative)是假反例。
  • 作用直观反映模型整体的预测正确性,是最常用的评估指标之一。

2、注意点

  • 类别不平衡当数据集中不同类别的样本数量差异较大时,准确率可能会给出有偏差的评估结果。例如,在一个疾病诊断数据集中,患病样本占比很小,模型可能会倾向于将所有样本都预测为未患病,从而获得较高的准确率,但实际上对患病样本的预测能力很差。

3、示例代码

Python脚本

# 从 sklearn 库的 datasets 模块导入 load_iris 函数
# 该函数用于加载鸢尾花数据集,鸢尾花数据集是一个经典的分类数据集
from sklearn.datasets import load_iris
# 从 sklearn 库的 linear_model 模块导入 LogisticRegression 类
# 该类用于创建逻辑回归模型,逻辑回归是一种常用的分类算法
from sklearn.linear_model import LogisticRegression
# 从 sklearn 库的 model_selection 模块导入 train_test_split 函数
# 该函数用于将数据集划分为训练集和测试集,方便评估模型性能
from sklearn.model_selection import train_test_split
# 从 sklearn 库的 metrics 模块导入 accuracy_score 函数
# 该函数用于计算分类模型的准确率
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
# 调用 load_iris 函数加载鸢尾花数据集,并将其存储在 iris 变量中
# iris 是一个 Bunch 对象,包含了数据、标签、特征名称等信息
iris = load_iris()
# 从 iris 数据集中提取特征矩阵 X
# X 是一个二维数组,每一行代表一个样本,每一列代表一个特征
X = iris.data
# 从 iris 数据集中提取标签数组 y
# y 是一个一维数组,每个元素代表对应样本的类别标签
y = iris.target

# 划分训练集和测试集
# 使用 train_test_split 函数将特征矩阵 X 和标签数组 y 划分为训练集和测试集
# test_size=0.2 表示测试集占总数据集的 20%
# random_state=42 是随机数种子,保证每次划分的结果相同,使实验可重复
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
# 实例化 LogisticRegression 类,创建一个逻辑回归模型对象 model
# 使用默认参数,默认可以处理多分类问题
model = LogisticRegression()

# 训练模型
# 调用 model 的 fit 方法,传入训练集的特征矩阵 X_train 和标签数组 y_train
# 模型会根据训练数据学习特征和标签之间的关系
model.fit(X_train, y_train)

# 预测
# 调用 model 的 predict 方法,传入测试集的特征矩阵 X_test
# 模型会根据学习到的关系对测试集的样本进行分类预测,并返回预测的标签数组 y_pred
y_pred = model.predict(X_test)

# 计算准确率
# 调用 accuracy_score 函数,传入真实标签数组 y_test 和预测标签数组 y_pred
# 函数会计算模型预测正确的样本数占总样本数的比例,即准确率,
# 并将结果存储在 accuracy 变量中
accuracy = accuracy_score(y_test, y_pred)

# 打印准确率
# 使用格式化字符串输出准确率,方便查看模型在测试集上的分类性能
print(f"准确率: {accuracy}")

输出 / 打印结果示例

plaintext

准确率: 0.9666666666666667

结果注释

  • 输出的准确率约为 0.97,这意味着在测试集的所有样本中,模型正确预测类别标签的样本占比约为 97%。
  • 较高的准确率表明该逻辑回归模型在鸢尾花数据集的分类任务上表现良好。不过,准确率并不是评估模型性能的唯一指标,尤其是在类别不平衡的数据集上,可能需要结合其他指标(如精确率、召回率、F1 值等)来全面评估模型。

重点语句解读

  • from sklearn.metrics import accuracy_score:从sklearn库的metrics模块导入accuracy_score函数,用于计算准确率。
  • accuracy = accuracy_score(y_test, y_pred):调用accuracy_score函数,传入真实标签y_test和预测标签y_pred,计算并返回准确率。

二、召回率(Recall)

1、关键点

  • 定义:召回率也称为灵敏度或真正例率,是指模型正确预测的正例样本数占实际正例样本数的比例,公式为:
  • 作用衡量模型找出所有正例样本的能力,在关注正例样本识别的场景中很重要,如疾病诊断中找出所有患病患者。

2、注意点

  • 阈值影响召回率会受到分类阈值的影响,降低阈值可能会提高召回率,但同时可能会增加假正例的数量。

3、示例代码

Python脚本

# 从 sklearn 库的 datasets 模块导入 load_iris 函数
# 此函数用于加载经典的鸢尾花数据集,该数据集常用于分类任务的示例和测试
from sklearn.datasets import load_iris
# 从 sklearn 库的 linear_model 模块导入 LogisticRegression 类
# 该类用于创建逻辑回归模型,逻辑回归是一种常用的分类算法
from sklearn.linear_model import LogisticRegression
# 从 sklearn 库的 model_selection 模块导入 train_test_split 函数
# 该函数可将数据集划分为训练集和测试集,便于评估模型的泛化能力
from sklearn.model_selection import train_test_split
# 从 sklearn 库的 metrics 模块导入 recall_score 函数
# 该函数用于计算分类模型的召回率
from sklearn.metrics import recall_score

# 加载鸢尾花数据集
# 调用 load_iris 函数加载鸢尾花数据集,并将其存储在变量 iris 中
# iris 是一个 Bunch 对象,包含数据、标签、特征名称等信息
iris = load_iris()
# 从 iris 数据集中提取特征矩阵 X
# X 是一个二维数组,每一行代表一个样本,每一列代表一个特征
X = iris.data
# 从 iris 数据集中提取标签数组 y
# y 是一个一维数组,每个元素代表对应样本的类别标签
y = iris.target

# 为了演示二分类情况,只取前两类
# 通过布尔索引筛选出标签不等于 2 的样本
# 这样就将原始的三分类鸢尾花数据集转换为二分类数据集
X = X[y != 2]
y = y[y != 2]

# 划分训练集和测试集
# 使用 train_test_split 函数将特征矩阵 X 和标签数组 y 划分为训练集和测试集
# test_size=0.2 表示测试集占总数据集的 20%
# random_state=42 是随机数种子,保证每次运行代码时划分的结果相同,使实验可重复
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
# 实例化 LogisticRegression 类,得到一个逻辑回归模型对象 model
# 使用默认参数,默认可以处理二分类问题
model = LogisticRegression()

# 训练模型
# 调用 model 的 fit 方法,传入训练集的特征矩阵 X_train 和标签数组 y_train
# 模型会根据训练数据学习特征和标签之间的关系
model.fit(X_train, y_train)

# 预测
# 调用 model 的 predict 方法,传入测试集的特征矩阵 X_test
# 模型会根据学习到的关系对测试集的样本进行分类预测,并返回预测的标签数组 y_pred
y_pred = model.predict(X_test)

# 计算召回率
# 调用 recall_score 函数,传入真实标签数组 y_test 和预测标签数组 y_pred
# 召回率的计算公式为:真正例数 / (真正例数 + 假反例数)
# 该函数会计算并返回模型的召回率,存储在变量 recall 中
recall = recall_score(y_test, y_pred)

# 打印召回率
# 使用格式化字符串输出召回率,方便查看模型在测试集上的召回性能
print(f"召回率: {recall}")

输出 / 打印结果示例

plaintext

召回率: 1.0

结果注释

  • 召回率含义:召回率衡量的是模型找出所有正例样本的能力。这里召回率为 1.0,表示模型在测试集上成功地找出了所有实际为正例的样本,没有遗漏任何正例。
  • 局限性与综合评估:虽然召回率达到 1.0 看起来模型在找出正例方面表现完美,但仅依靠召回率评估模型是不够的。例如,模型可能会将很多负例错误地预测为正例,导致精确率较低。所以,通常需要结合精确率、F1 值等其他指标来全面评估模型的性能。

重点语句解读

  • from sklearn.metrics import recall_score:从sklearn库的metrics模块导入recall_score函数,用于计算召回率。
  • recall = recall_score(y_test, y_pred):调用recall_score函数,传入真实标签y_test和预测标签y_pred,计算并返回召回率。

三、F1 值(F1-score)

1、关键点

  • 定义:F1 值是精确率和召回率的调和平均数,公式为:
  • 作用综合考虑了精确率和召回率,在两者之间取得平衡,用于评估模型的整体性能。

2、注意点

  • 适用场景当需要同时关注精确率和召回率,且两者都很重要时,F1 值是一个较好的评估指标。

3、示例代码

Python脚本

# 从 sklearn 库的 datasets 模块导入 load_iris 函数
# 该函数用于加载经典的鸢尾花数据集,此数据集包含多个特征以及对应的类别标签,
# 常用于分类算法的测试和验证
from sklearn.datasets import load_iris
# 从 sklearn 库的 linear_model 模块导入 LogisticRegression 类
# LogisticRegression 类可用于创建逻辑回归模型,逻辑回归是一种常用的分类算法,
# 适用于二分类和多分类问题
from sklearn.linear_model import LogisticRegression
# 从 sklearn 库的 model_selection 模块导入 train_test_split 函数
# train_test_split 函数的作用是将数据集划分为训练集和测试集,
# 有助于评估模型在未见过数据上的性能
from sklearn.model_selection import train_test_split
# 从 sklearn 库的 metrics 模块导入 f1_score 函数
# f1_score 函数用于计算分类模型的 F1 值,
# f1 值是精确率和召回率的调和平均数,能综合评估模型性能
from sklearn.metrics import f1_score

# 加载鸢尾花数据集
# 调用 load_iris 函数,将加载的鸢尾花数据集存储在 iris 变量中
# iris 是一个 Bunch 对象,包含了数据(特征矩阵)、目标(类别标签)、特征名称等信息
iris = load_iris()
# 从 iris 数据集中提取特征矩阵 X
# X 是一个二维数组,每一行代表一个样本,每一列代表一个特征
X = iris.data
# 从 iris 数据集中提取目标标签数组 y
# y 是一个一维数组,每个元素对应一个样本的类别标签
y = iris.target

# 为了演示二分类情况,只取前两类
# 通过布尔索引筛选出标签不等于 2 的样本
# 这样 X 就只包含前两类样本的特征,y 只包含前两类样本的标签
X = X[y != 2]
y = y[y != 2]

# 划分训练集和测试集
# 使用 train_test_split 函数将特征矩阵 X 和标签数组 y 划分为训练集和测试集
# test_size=0.2 表示测试集占总数据集的 20%
# random_state=42 是随机数种子,保证每次运行代码时划分的结果相同,使实验具有可重复性
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
# 实例化 LogisticRegression 类,得到一个逻辑回归模型对象 model
# 这里使用默认参数,默认情况下可以处理二分类问题
model = LogisticRegression()

# 训练模型
# 调用 model 的 fit 方法,传入训练集的特征矩阵 X_train 和对应的标签数组 y_train
# 模型会根据训练数据学习特征和标签之间的关系,调整模型的参数
model.fit(X_train, y_train)

# 预测
# 调用 model 的 predict 方法,传入测试集的特征矩阵 X_test
# 模型会根据学习到的关系对测试集的样本进行分类预测,返回预测的标签数组 y_pred
y_pred = model.predict(X_test)

# 计算 F1 值
# 调用 f1_score 函数,传入真实标签数组 y_test 和预测标签数组 y_pred
# F1 值的计算公式为:F1 = 2 * (精确率 * 召回率) / (精确率 + 召回率)
# 该函数会根据公式计算并返回模型的 F1 值,存储在变量 f1 中
f1 = f1_score(y_test, y_pred)

# 打印 F1 值
# 使用格式化字符串输出计算得到的 F1 值,方便查看模型在测试集上的综合性能
print(f"F1 值: {f1}")

输出 / 打印结果示例

plaintext

F1 值: 1.0

结果注释

  • F1 值含义F1 值综合考虑了精确率和召回率,取值范围在 0 到 1 之间,越接近 1 表示模型性能越好。这里 F1 值为 1.0,说明模型在精确率和召回率方面都达到了理想状态,即在正确预测正例(精确率)和找出所有正例(召回率)上都表现出色。
  • 实际情况分析在实际应用中,达到 F1 值为 1.0 可能意味着数据比较简单、模型复杂度与数据匹配度高或者存在数据泄露等情况。需要进一步检查数据和模型,确保结果的可靠性。同时,对于不同的业务场景,可能需要结合其他评估指标以及对精确率和召回率的具体需求来综合判断模型的优劣。

重点语句解读

  • from sklearn.metrics import f1_score:从sklearn库的metrics模块导入f1_score函数,用于计算 F1 值。
  • f1 = f1_score(y_test, y_pred):调用f1_score函数,传入真实标签y_test和预测标签y_pred,计算并返回 F1 值。

四、混淆矩阵(Confusion Matrix)

1、关键点

  • 定义混淆矩阵是一个n×n的矩阵(n为类别数),用于展示模型在每个类别上的预测情况。对于二分类问题,矩阵的形式为:
  • 作用直观地展示模型的分类结果,能清晰地看到模型在哪些类别上容易出错,帮助分析模型的性能。

2、注意点

  • 可视化对于多分类问题,混淆矩阵可能会比较复杂,需要进行可视化处理(如使用seaborn库绘制热力图),以便更好地理解。

4、示例代码

Python脚本

# 从 sklearn 库的 datasets 模块导入 load_iris 函数
# 该函数用于加载经典的鸢尾花数据集,鸢尾花数据集常用于分类算法的测试和验证
from sklearn.datasets import load_iris
# 从 sklearn 库的 linear_model 模块导入 LogisticRegression 类
# 此类别用于创建逻辑回归模型,逻辑回归是一种常用的分类算法
from sklearn.linear_model import LogisticRegression
# 从 sklearn 库的 model_selection 模块导入 train_test_split 函数
# 该函数可将数据集划分为训练集和测试集,有助于评估模型在未见过数据上的性能
from sklearn.model_selection import train_test_split
# 从 sklearn 库的 metrics 模块导入 confusion_matrix 函数
# 该函数用于计算分类模型的混淆矩阵,混淆矩阵能直观展示模型的分类结果
from sklearn.metrics import confusion_matrix
# 导入 seaborn 库,它是一个基于 matplotlib 的数据可视化库
# 可用于绘制各种统计图形,这里用于绘制混淆矩阵的热力图
import seaborn as sns
# 导入 matplotlib 库的 pyplot 模块
# matplotlib 是 Python 中常用的绘图库,pyplot 提供了类似 MATLAB 的绘图接口
import matplotlib.pyplot as plt

# 加载鸢尾花数据集
# 调用 load_iris 函数加载鸢尾花数据集,并将其存储在 iris 变量中
# iris 是一个 Bunch 对象,包含了数据、标签、特征名称等信息
iris = load_iris()
# 从 iris 数据集中提取特征矩阵 X
# X 是一个二维数组,每一行代表一个样本,每一列代表一个特征
X = iris.data
# 从 iris 数据集中提取目标标签数组 y
# y 是一个一维数组,每个元素对应一个样本的类别标签
y = iris.target

# 划分训练集和测试集
# 使用 train_test_split 函数将特征矩阵 X 和标签数组 y 划分为训练集和测试集
# test_size=0.2 表示测试集占总数据集的 20%
# random_state=42 是随机数种子,保证每次运行代码时划分的结果相同,使实验可重复
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
# 实例化 LogisticRegression 类,得到一个逻辑回归模型对象 model
# 使用默认参数,默认可处理多分类问题
model = LogisticRegression()

# 训练模型
# 调用 model 的 fit 方法,传入训练集的特征矩阵 X_train 和对应的标签数组 y_train
# 模型会根据训练数据学习特征和标签之间的关系,调整自身参数
model.fit(X_train, y_train)

# 预测
# 调用 model 的 predict 方法,传入测试集的特征矩阵 X_test
# 模型会根据学习到的关系对测试集的样本进行分类预测,返回预测的标签数组 y_pred
y_pred = model.predict(X_test)

# 计算混淆矩阵
# 调用 confusion_matrix 函数,传入真实标签数组 y_test 和预测标签数组 y_pred
# 函数会计算并返回混淆矩阵,存储在变量 cm 中
# 混淆矩阵是一个方阵,其元素表示模型将真实类别预测为各个类别的样本数量
cm = confusion_matrix(y_test, y_pred)

# 绘制混淆矩阵热力图
# 使用 seaborn 库的 heatmap 函数绘制混淆矩阵的热力图
# annot=True 表示在热力图的每个单元格中显示具体数值
# fmt='d' 表示以整数形式显示数值
# cmap='Blues' 指定热力图的颜色映射为蓝色系
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')

# 设置 x 轴标签
# 为热力图的 x 轴添加标签,说明 x 轴代表的是模型的预测标签
plt.xlabel('预测标签')

# 设置 y 轴标签
# 为热力图的 y 轴添加标签,说明 y 轴代表的是样本的真实标签
plt.ylabel('真实标签')

# 设置图形标题
# 为热力图添加标题,表明这是一个混淆矩阵的可视化图形
plt.title('混淆矩阵')

# 显示图形
# 调用 plt.show() 函数将绘制好的热力图显示出来
plt.show()

输出 / 打印结果

运行代码后,会弹出一个窗口显示混淆矩阵的热力图。图中,横轴表示模型的预测标签,纵轴表示样本的真实标签,每个单元格内显示的是相应真实类别被预测为该预测类别的样本数量。

结果注释

  • 主对角线元素混淆矩阵主对角线上的元素表示模型正确分类的样本数量。例如,主对角线上第一个元素表示真实类别为第一类且被模型正确预测为第一类的样本数。主对角线上元素值越大,说明模型的分类准确性越高。
  • 非主对角线元素非主对角线上的元素表示模型分类错误的情况。例如,第 i 行第 j 列(i=j)的元素表示真实类别为第 i 类但被模型错误预测为第 j 类的样本数量。通过观察非主对角线元素,可以了解模型容易将哪些类别混淆。
  • 整体评估通过观察混淆矩阵的热力图,可以直观地评估模型在不同类别上的分类性能,帮助我们发现模型的优势和不足,进而进行针对性的改进,如调整模型参数、增加数据等。

重点语句解读

  • from sklearn.metrics import confusion_matrix:从sklearn库的metrics模块导入confusion_matrix函数,用于计算混淆矩阵。
  • cm = confusion_matrix(y_test, y_pred):调用confusion_matrix函数,传入真实标签y_test和预测标签y_pred,计算并返回混淆矩阵。
  • sns.heatmap(cm, annot=True, fmt='d', cmap='Blues'):使用seaborn库的heatmap函数绘制混淆矩阵的热力图,annot=True表示显示每个单元格的数值,fmt='d'表示以整数形式显示数值,cmap='Blues'指定颜色映射。

——The END——


🔗 欢迎订阅专栏

序号专栏名称说明
1用Python进行AI数据分析进阶教程《用Python进行AI数据分析进阶教程》专栏
2AI大模型应用实践进阶教程《AI大模型应用实践进阶教程》专栏
3Python编程知识集锦《Python编程知识集锦》专栏
4字节跳动旗下AI制作抖音视频《字节跳动旗下AI制作抖音视频》专栏
5智能辅助驾驶《智能辅助驾驶》专栏
6工具软件及IT技术集锦《工具软件及IT技术集锦》专栏

👉 关注我 @理工男大辉郎 获取实时更新

欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
优快云博客:理工男大辉郎
抖音号:31580422589

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男大辉郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值