Pytorch升级之旅——基础概念

目录

一、人工智能简史

三次浪潮

DL,ML,AI三者之间的关系

二、模型评价指标

混淆矩阵

[Overall Accuracy](#Overall Accuracy)

​编辑

[Average accuracy](#Average accuracy)

Kappa系数

Recall

Precision

F1

PR曲线

置信度

IOU

AP

mAP

三、常用包Numpy、pandas、matplotlib

Numpy

pandas

matplotlib

[四、Jupyter notebook/Lab 简述](#四、Jupyter notebook/Lab 简述)

安装


学习链接:深入浅出PyTorch --- 深入浅出PyTorch (datawhalechina.github.io)

一、人工智能简史

三次浪潮

①1956-1966 人工智能元年 达特茅斯会议

②20世纪80年代 统计学思想引入 提出BP神经网络

③1993年以后 2006年深度学习 2016年AIphaGO围棋

DL,ML,AI三者之间的关系

深度学习(DL)、机器学习(ML)和人工智能(AI)之间的关系可以用层级结构来理解:

  1. 人工智能(AI):AI是一个广泛的领域,旨在开发能够模拟人类智能的计算机系统。它包括许多子领域,如机器学习、计算机视觉、自然语言处理等。AI的目标是让计算机能够执行通常需要人类智能的任务,例如理解语言、识别图像、做决策等。

  2. 机器学习(ML):ML是AI的一个子领域,专注于开发算法和统计模型,使计算机能够从数据中学习和做出预测或决策,而不需要明确的编程指令。换句话说,机器学习通过数据驱动的方法来提高AI系统的性能。

  3. 深度学习(DL):DL是机器学习的一个子领域,主要使用人工神经网络,特别是多层神经网络(深度神经网络),来处理复杂的数据表示和模式识别任务。深度学习在图像识别、语音识别、自然语言处理等方面表现出了极高的效能,是近年来推动AI快速发展的核心技术之一。

总结来说,深度学习是机器学习的一个子集,而机器学习又是人工智能的一个子集

二、模型评价指标

混淆矩阵

混淆矩阵是评估分类模型性能的重要工具,特别是在二分类和多分类问题中。它以矩阵的形式展示了模型的预测结果与实际标签之间的对比。

混淆矩阵的结构

对于二分类问题,混淆矩阵通常是一个2x2的矩阵,包含以下四个部分:

  • True Positive (TP): 真正例。模型正确预测为正类的样本数。
  • True Negative (TN): 真负例。模型正确预测为负类的样本数。
  • False Positive (FP): 假正例。模型错误地将负类预测为正类的样本数(也称为"类型I错误")。
  • False Negative (FN): 假负例。模型错误地将正类预测为负类的样本数(也称为"类型II错误")。

实际正类 (Positive) 实际负类 (Negative)

预测正类 (Positive) TP FP

预测负类 (Negative) FN TN

Overall Accuracy

Overall Accuracy(总体准确率)是衡量分类模型性能的一项指标,表示模型正确分类的样本数量占总样本数量的比例。它是混淆矩阵中所有正确分类结果(包括所有类别的正确预测)的总和除以总样本数的结果。

对于二分类或多分类问题,Overall Accuracy 的计算公式是:Overall Accuracy=所有类别的正确预测数​/总样本数

如果使用混淆矩阵的表示法,对于二分类问题:Overall Accuracy=(TP+TN)/(TP+TN+FP+FN)

python 复制代码
def compute_oa(matrix):
    """
    计算总体准确率,OA=(TP+TN)/(TP+TN+FP+FN)
    :param matrix:
    :return:
    """
    return np.trace(matrix) / np.sum(matrix)

Overall Accuracy 是评估模型性能的一个直观指标,但在类别不平衡的数据集上,它可能会掩盖模型在少数类别上的差距。因此,在分析模型性能时,还应考虑其他指标如精确率、召回率和F1分数等。

Average accuracy

Average Accuracy(平均准确率)通常用于多分类问题中,表示每个类别的分类准确率的平均值。这种方法对每个类别的表现给予相同的权重,适合在类别不平衡的数据集上评估模型性能,因为它能够更好地反映模型在所有类别上的表现。

对于 nnn 个类别,首先计算每个类别的分类准确率,然后取这些准确率的平均值。具体公式为:

python 复制代码
def compute_aa(matrix):
    """
    计算每一类的准确率,AA=(TP/(TP+FN)+TN/(FP+TN))/2
    :param matrix:
    :return:
    """
    return np.mean(np.diag(matrix) / np.sum(matrix, axis=1))

与 Overall Accuracy 的对比

  • Overall Accuracy 计算的是所有样本中预测正确的比例,因此在类别不平衡的情况下,少数类别的影响可能会被多数类别掩盖。
  • Average Accuracy 则通过计算每个类别的准确率,并取其平均值,使得每个类别对最终结果都有相同的影响,能够更公平地评估模型在不同类别上的表现。

Kappa系数

Kappa系数(Cohen's Kappa)是一种统计指标,用于衡量分类模型的预测结果与实际类别之间的一致性。与简单的准确率不同,Kappa系数考虑了分类中的偶然因素(即,随机猜测所带来的准确性),因此可以提供比准确率更可靠的一致性评估。

Cohen's Kappa 系数的计算公式为:

具体步骤

Kappa 系数的解读

  • κ=1 表示完全一致,即模型的预测结果与实际类别完全一致。
  • κ=0\kappa = 0κ=0 表示模型的预测结果与随机猜测的结果没有区别。
  • κ<0\kappa < 0κ<0 表示一致性低于随机水平,模型的表现比随机猜测还要差。

Kappa 系数的具体值通常按以下标准解读:

  • 0.81-1.00:几乎完美的一致性
  • 0.61-0.80:显著一致性
  • 0.41-0.60:中等一致性
  • 0.21-0.40:公平一致性
  • 0.01-0.20:轻微一致性
  • 0.00 或更低:无一致性
python 复制代码
import numpy as np

def compute_oa(matrix):
    """
    计算总体准确率 (Overall Accuracy)
    :param matrix: 混淆矩阵
    :return: 总体准确率
    """
    return np.trace(matrix) / np.sum(matrix)

def compute_kappa(matrix):
    """
    计算Kappa系数
    :param matrix: 混淆矩阵
    :return: Kappa系数
    """
    # 计算总体准确率 (Overall Accuracy)
    oa = compute_oa(matrix)
    
    # 计算期望准确率 (Expected Accuracy)
    pe = 0
    for i in range(len(matrix)):
        pe += np.sum(matrix[i]) * np.sum(matrix[:, i])
    pe = pe / np.sum(matrix) ** 2
    
    # 计算Kappa系数
    kappa = (oa - pe) / (1 - pe)
    return kappa
  • 计算总体准确率 (Overall Accuracy, OA):

    • np.trace(matrix):计算混淆矩阵的对角线元素之和,即正确分类的总数。
    • np.sum(matrix):计算混淆矩阵的所有元素之和,即总样本数。
    • oa = np.trace(matrix) / np.sum(matrix):计算总体准确率。
  • 计算期望准确率 (Expected Accuracy, PE):

    • np.sum(matrix[i]) * np.sum(matrix[:, i]):对于每个类别,计算该类别的行和列的乘积(即分别为实际和预测中的总数)。
    • pe = pe / np.sum(matrix) ** 2:将上述乘积的累加结果除以总样本数的平方,得到期望准确率。
  • 计算 Kappa 系数:

    • kappa = (oa - pe) / (1 - pe):使用总体准确率和期望准确率计算Kappa系数。Kappa系数的范围在[-1, 1]之间,1表示完全一致,0表示与随机一致性相同,负值表示比随机一致性还差。

Recall

Recall(召回率)是分类模型性能评估的重要指标之一,尤其在关注模型能否正确识别正类样本时非常有用。它表示在所有实际为正类的样本中,模型正确预测为正类的比例。

对于二分类问题,Recall的计算公式是:Recall=TP​/TP+FN

  • TP (True Positive): 真正例,模型正确预测为正类的样本数。
  • FN (False Negative): 假负例,模型错误地将正类预测为负类的样本数。

召回率的意义

  • 高召回率意味着模型能够识别大部分的正类样本,但可能会增加假阳性(误将负类预测为正类)的数量。
  • 召回率通常与精确率(Precision)一起使用。二者之间存在权衡:提高召回率可能会降低精确率,反之亦然。

多分类问题中的 Recall

在多分类问题中,召回率通常是针对每个类别分别计算的,然后可以选择计算每个类别的平均召回率(如微平均、宏平均等)。

  • 宏平均(Macro-Averaging): 计算每个类别的召回率,然后取平均值。
  • 微平均(Micro-Averaging): 将所有类别的 TP 和 FN 总和,然后计算召回率。

召回率在实际中的应用

  • 在医疗诊断中,高召回率意味着较少的漏诊,特别适用于一些不容错过的疾病检测。
  • 在信息检索中,高召回率意味着能检索到更多的相关信息。

Recall 是评价模型在实际应用中捕获正类样本能力的重要指标,特别是在对假阴性结果敏感的场景中具有重要意义。

Precision

Precision也称精准率,代表的是在全部预测为正的结果中,被预测正确的正样本所占的比例,用于衡量模型在正类预测中的准确性。

用数学公式表示为:Precision=True Positives (TP)​/True Positives (TP)+False Positives (FP)

  • 其中:

    • True Positives (TP) 是模型正确预测为正类的样本数。
    • False Positives (FP) 是模型错误预测为正类的样本数。

精确度高意味着模型在预测正类时较少出现错误的预测(即假阳性)。在处理不平衡数据集时,精确度尤其重要,因为它可以帮助我们评估模型在正类样本上的预测质量。

python 复制代码
import torch

def calculate_precision(preds, labels):
    """
    计算精确度(Precision)。

    参数:
    preds (torch.Tensor): 模型的预测结果,0 或 1。
    labels (torch.Tensor): 真实标签,0 或 1。

    返回:
    float: 精确度。
    """
    # 计算 True Positives 和 False Positives
    true_positives = torch.sum((preds == 1) & (labels == 1)).item()
    false_positives = torch.sum((preds == 1) & (labels == 0)).item()

    # 计算精确度
    precision = true_positives / (true_positives + false_positives) if (true_positives + false_positives) > 0 else 0.0
    return precision

# 示例
preds = torch.tensor([1, 0, 1, 1, 0])
labels = torch.tensor([1, 0, 0, 1, 1])

precision = calculate_precision(preds, labels)
print(f"Precision: {precision:.2f}")

F1

F1 分数 是精确度(Precision)和召回率(Recall)的调和平均值,用于综合评估模型的性能。F1 分数在分类任务中尤为重要,特别是在处理不平衡数据集时,它可以提供对模型性能的更全面的评估。

F1 分数的定义

其中:

  • 精确度(Precision):真正正类样本数与所有被预测为正类样本数的比例。
  • 召回率(Recall):真正正类样本数与所有真实正类样本数的比例。
python 复制代码
import torch

def calculate_f1(preds, labels):
    """
    计算 F1 分数。

    参数:
    preds (torch.Tensor): 模型的预测结果,0 或 1。
    labels (torch.Tensor): 真实标签,0 或 1。

    返回:
    float: F1 分数。
    """
    # 计算 True Positives, False Positives 和 False Negatives
    true_positives = torch.sum((preds == 1) & (labels == 1)).item()
    false_positives = torch.sum((preds == 1) & (labels == 0)).item()
    false_negatives = torch.sum((preds == 0) & (labels == 1)).item()

    # 计算精确度(Precision)和召回率(Recall)
    precision = true_positives / (true_positives + false_positives) if (true_positives + false_positives) > 0 else 0.0
    recall = true_positives / (true_positives + false_negatives) if (true_positives + false_negatives) > 0 else 0.0

    # 计算 F1 分数
    f1_score = 2 * (precision * recall) / (precision + recall) if (precision + recall) > 0 else 0.0
    return f1_score

# 示例
preds = torch.tensor([1, 0, 1, 1, 0])
labels = torch.tensor([1, 0, 0, 1, 1])

f1 = calculate_f1(preds, labels)
print(f"F1 Score: {f1:.2f}")

F1 分数的扩展形式,通常称为 Fβ 分数 ,其中 β 用于控制精确度(Precision)和召回率(Recall)的权重。Fβ 分数的定义式如下:

  • 当 β > 1:Fβ 分数更侧重于召回率(Recall)。
  • 当 β < 1:Fβ 分数更侧重于精确度(Precision)。
  • 当 β = 1:Fβ 分数与 F1 分数相同,平衡了精确度和召回率。

计算全局性能 时,通常有两种方法:macromicro

  1. Macro 方法

    • 对每个类别分别计算精确度、召回率和 Fβ 分数。
    • 对所有类别的 Fβ 分数取平均值。
  2. Micro 方法

    • 首先将所有类别的 TP、FP 和 FN 合并,计算总体的精确度、召回率和 Fβ 分数。
python 复制代码
from sklearn.metrics import precision_recall_fscore_support

def calculate_macro_f1(preds, labels):
    """
    计算宏观 F1 分数(Macro F1)。

    参数:
    preds (torch.Tensor): 模型的预测结果,0 或 1。
    labels (torch.Tensor): 真实标签,0 或 1。

    返回:
    float: 宏观 F1 分数。
    """
    precision, recall, f1, _ = precision_recall_fscore_support(labels.numpy(), preds.numpy(), average='macro')
    return f1

# 示例
import torch
preds = torch.tensor([1, 0, 1, 1, 0])
labels = torch.tensor([1, 0, 0, 1, 1])

macro_f1 = calculate_macro_f1(preds, labels)
print(f"Macro F1 Score: {macro_f1:.2f}")

precision_recall_fscore_supportscikit-learn 提供的函数,它可以计算精确度、召回率和 F1 分数,并通过 average 参数来选择宏观或微观计算方式。

PR曲线

PR 曲线(Precision-Recall Curve)是一种评估分类模型性能的图形工具,特别适用于处理不平衡数据集。PR 曲线描绘了模型在不同决策阈值下的精确度(Precision)和召回率(Recall)的关系。

PR 曲线的定义

  • 精确度(Precision):真正正类样本数与所有被预测为正类样本数的比例。
  • 召回率(Recall):真正正类样本数与所有真实正类样本数的比例。

PR 曲线通常是通过在不同的阈值下计算精确度和召回率来绘制的,横轴表示召回率(Recall),纵轴表示精确度(Precision)。

在 Python 中,可以使用 scikit-learn 库绘制 PR 曲线。

python 复制代码
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score

def plot_pr_curve(y_true, y_scores):
    """
    绘制 PR 曲线(Precision-Recall Curve)。

    参数:
    y_true (list or numpy array): 真实标签,0 或 1。
    y_scores (list or numpy array): 模型的预测分数或概率。
    """
    precision, recall, _ = precision_recall_curve(y_true, y_scores)
    average_precision = average_precision_score(y_true, y_scores)
    
    plt.figure(figsize=(8, 6))
    plt.plot(recall, precision, marker='.')
    plt.title(f'PR Curve (Average Precision: {average_precision:.2f})')
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.grid()
    plt.show()

# 示例数据
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练模型
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = LogisticRegression()
model.fit(X_train_scaled, y_train)

# 获取模型预测概率
y_scores = model.predict_proba(X_test_scaled)[:, 1]

# 绘制 PR 曲线
plot_pr_curve(y_test, y_scores)
  • precision_recall_curve:计算不同阈值下的精确度和召回率。
  • average_precision_score:计算平均精确度,用于量化整个 PR 曲线的性能。

PR 曲线和平均精确度(Average Precision, AP)提供了模型在所有可能的阈值下的综合性能指标,尤其在处理正负样本不平衡时非常有用。

  • 初始化混淆矩阵计数 :在 get_confusion_matrix 函数中,初始化 TP、FP、TN 和 FN 时不应设置为固定值,而是应从零开始计算。

  • 改进 get_pr_pairs 函数:在每个阈值下计算精确度(Precision)和召回率(Recall),需要确保所有阈值都被处理,并避免冗余计算。

  • 绘制 PR 曲线:在绘制时应确保曲线显示正确,且包含合理的标签和标题。

python 复制代码
from typing import List, Tuple
import matplotlib.pyplot as plt

def get_confusion_matrix(
    y_pred: List[int], 
    y_true: List[int]
    ) -> Tuple[int, int, int, int]:
    tp, fp, tn, fn = 0, 0, 0, 0
    for i in range(len(y_pred)):
        if y_pred[i] == 1 and y_true[i] == 1:
            tp += 1
        elif y_pred[i] == 1 and y_true[i] == 0:
            fp += 1
        elif y_pred[i] == 0 and y_true[i] == 1:
            fn += 1
        elif y_pred[i] == 0 and y_true[i] == 0:
            tn += 1
    return (tp, fp, tn, fn)

def calc_p(tp: int, fp: int) -> float:
    return tp / (tp + fp) if (tp + fp) > 0 else 0

def calc_r(tp: int, fn: int) -> float:
    return tp / (tp + fn) if (tp + fn) > 0 else 0

def get_pr_pairs(
    y_pred_prob: List[float], 
    y_true: List[int]
    ) -> Tuple[List[float], List[float]]:
    thresholds = sorted(set(y_pred_prob), reverse=True)
    ps = []
    rs = []
    for threshold in thresholds:
        y_pred_i = [1 if prob >= threshold else 0 for prob in y_pred_prob]
        tp, fp, tn, fn = get_confusion_matrix(y_pred_i, y_true)
        p = calc_p(tp, fp)
        r = calc_r(tp, fn)
        ps.append(p)
        rs.append(r)
    ps.append(0)
    rs.append(1)
    return rs, ps

# 示例数据
y_pred_prob = [0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.505,
               0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.3, 0.1]
y_true = [1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0]

# 计算 PR 曲线
rs, ps = get_pr_pairs(y_pred_prob, y_true)

# 绘制 PR 曲线
fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(rs, ps, marker='.')
ax.set_xlabel('Recall')
ax.set_ylabel('Precision')
ax.set_title('Precision-Recall Curve')
ax.grid(True)
plt.show()
  • get_confusion_matrix 函数:初始化 TP、FP、TN 和 FN 为 0,并在循环中计算真实的 TP、FP、TN 和 FN。

  • get_pr_pairs 函数 :先按概率排序,并遍历每个阈值来计算精确度和召回率。使用 setsorted 去除重复的阈值。

  • 绘图:为 PR 曲线添加了标签和标题,使图形更具可读性。

置信度

置信度(Confidence)在机器学习和统计中通常指的是模型对其预测结果的确定程度。对于分类模型而言,置信度通常表示模型预测为某个类别的概率。这种概率表示了模型对某一预测的信心水平。

置信度的定义和应用

  1. 分类任务中的置信度

    • 在分类问题中,模型通常会输出每个类别的预测概率。例如,对于一个二分类问题,模型可能会输出一个概率值,例如 0.85,表示模型认为该样本属于正类的置信度为 85%。
    • 置信度可以用来选择分类阈值,决定是否将样本分配给某个特定的类别。
  2. 置信度区间

    • 在统计学中,置信度也用来表示估计值的可靠性。一个 95% 的置信度区间意味着如果重复实验很多次,有 95% 的概率区间会包含真实的参数值。

置信度的计算和使用

在机器学习中,置信度通常由模型的输出概率计算得出。以一个简单的示例为例,假设我们有一个分类模型,它给出每个样本的预测概率。可以使用这些概率作为置信度来绘制 ROC 或 PR 曲线,或用于阈值选择。

python 复制代码
import torch
import torch.nn.functional as F

def calculate_confidence(logits: torch.Tensor) -> torch.Tensor:
    """
    计算预测的置信度。

    参数:
    logits (torch.Tensor): 模型的输出,未经归一化的 logits。

    返回:
    torch.Tensor: 预测的置信度。
    """
    probabilities = F.softmax(logits, dim=1)
    confidence, _ = torch.max(probabilities, dim=1)
    return confidence

# 示例数据
logits = torch.tensor([[2.0, 1.0], [0.5, 1.5], [1.0, 1.0]])
confidence = calculate_confidence(logits)
print(f"Confidence: {confidence.tolist()}")

IOU

**IOU(Intersection over Union),**雅卡尔指数( Jaccard index),交并比,是一种常用的评估指标,用于衡量两个区域(如预测框和真实框)之间的重叠程度。IOU 在目标检测和分割任务中尤为重要,用于评估模型的预测框或分割区域的准确性。

IOU 的定义

IOU 是预测框与真实框的交集面积与它们的并集面积的比值。公式如下:

其中:

  • Intersection(交集):预测框和真实框重叠的区域面积。
  • Union(并集):预测框和真实框合并的区域面积。

计算 IOU 的步骤

  1. 计算交集面积:预测框和真实框重叠区域的面积。
  2. 计算并集面积:预测框和真实框的总面积减去交集面积。
  3. 计算 IOU:用交集面积除以并集面积。
python 复制代码
import torch

def calculate_iou(box1, box2):
    """
    计算两个矩形框的 IOU。

    参数:
    box1 (torch.Tensor): 第一个框的坐标 (x1, y1, x2, y2)。
    box2 (torch.Tensor): 第二个框的坐标 (x1, y1, x2, y2)。

    返回:
    float: 两个框的 IOU。
    """
    # 计算交集区域的坐标
    x1_inter = max(box1[0], box2[0])
    y1_inter = max(box1[1], box2[1])
    x2_inter = min(box1[2], box2[2])
    y2_inter = min(box1[3], box2[3])

    # 计算交集的面积
    inter_area = max(0, x2_inter - x1_inter) * max(0, y2_inter - y1_inter)

    # 计算两个框的面积
    box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])
    box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1])

    # 计算并集的面积
    union_area = box1_area + box2_area - inter_area

    # 计算 IOU
    iou = inter_area / union_area if union_area > 0 else 0.0
    return iou

# 示例
box1 = torch.tensor([1, 1, 4, 4], dtype=torch.float32)  # (x1, y1, x2, y2)
box2 = torch.tensor([2, 2, 5, 5], dtype=torch.float32)  # (x1, y1, x2, y2)

iou = calculate_iou(box1, box2)
print(f"IOU: {iou:.2f}")
  • 交集区域:使用最大和最小坐标计算两个框的重叠部分。
  • 并集区域:计算两个框的总面积减去交集面积。
  • IOU:用交集面积除以并集面积。

IOU 在目标检测中通常用于筛选预测框或评估模型的预测效果。常见的做法是设定一个 IOU 阈值,例如 0.5,用于确定一个预测框是否与真实框匹配。

一般情况下在目标检测任务中,人们将IOU ≥0.7时判定为正样本,其余情况判定为负样本。

AP

AP(Average Precision) 是用于评估目标检测和信息检索任务中模型性能的重要指标。AP 综合了精确度(Precision)和召回率(Recall),特别是在不同的置信度阈值下进行评估。

AP 的定义

AP 是精确度和召回率之间的关系的综合度量,通常通过绘制 PR 曲线(Precision-Recall Curve) 并计算其下面积来获得。

计算 AP 的步骤

  1. 计算 PR 曲线

    • 在不同的置信度阈值下计算模型的精确度和召回率。
  2. 计算 AP

    • 通过对 PR 曲线下的面积进行积分,得到 AP。对于每一个召回率值,计算对应的精确度,然后对这些精确度取平均值,得到 AP。

常用的 AP 计算方法

  1. 11 点插值(11-point interpolation)

    • 在 0 到 1 的召回率范围内,以 0.0、0.1、0.2、...、1.0 为步长计算精确度,然后对这些精确度进行平均。
  2. 平滑 AP

    • 使用更多的召回率点(例如 101 个点)进行计算,得到更平滑的 AP 曲线。
python 复制代码
import torch
from sklearn.metrics import precision_recall_curve, average_precision_score
import numpy as np

def calculate_ap(pred_probs, true_labels):
    """
    计算平均精确度(AP)。

    参数:
    pred_probs (torch.Tensor): 模型的预测概率(通常是 softmax 的输出)。
    true_labels (torch.Tensor): 真实标签(0 或 1)。

    返回:
    float: 平均精确度(AP)。
    """
    # 将 PyTorch 张量转换为 numpy 数组
    pred_probs_np = pred_probs.numpy()
    true_labels_np = true_labels.numpy()

    # 计算精确度和召回率
    precision, recall, _ = precision_recall_curve(true_labels_np, pred_probs_np)

    # 计算平均精确度(AP)
    ap = average_precision_score(true_labels_np, pred_probs_np)
    return ap

# 示例
pred_probs = torch.tensor([0.9, 0.2, 0.8, 0.6, 0.4], dtype=torch.float32)
true_labels = torch.tensor([1, 0, 1, 1, 0], dtype=torch.float32)

ap = calculate_ap(pred_probs, true_labels)
print(f"Average Precision (AP): {ap:.2f}")
  • precision_recall_curve:计算不同置信度下的精确度和召回率。
  • average_precision_score:计算 PR 曲线下的面积,即 AP。

AP 是评估目标检测模型性能的关键指标,特别是当数据集具有类不平衡或多类别问题时,它可以提供对模型综合性能的深入了解。在 COCO 和 PASCAL VOC 等挑战中,AP 是常用的评价标准。

mAP

mAP(mean Average Precision) 是一种常用于评估目标检测和信息检索任务中模型性能的综合指标。它是对所有类别的平均精确度(AP)的平均值,用于总结模型在不同类别上的表现。

mAP 的计算步骤:

  1. 计算每个类别的 AP

    • 对于每个类别,计算其精确度-召回率(PR)曲线,并求出该曲线下的面积,即 Average Precision(AP)。
  2. 计算 mAP

    • 对所有类别的 AP 取平均值,得到 mean Average Precision(mAP)。
python 复制代码
import numpy as np
from sklearn.metrics import average_precision_score

def calculate_ap(pred_probs, true_labels):
    """
    计算平均精确度(AP)。

    参数:
    pred_probs (numpy.ndarray): 模型的预测概率。
    true_labels (numpy.ndarray): 真实标签。

    返回:
    float: 平均精确度(AP)。
    """
    return average_precision_score(true_labels, pred_probs)

def calculate_map(pred_probs_list, true_labels_list):
    """
    计算平均平均精确度(mAP)。

    参数:
    pred_probs_list (list of numpy.ndarray): 每个类别的预测概率。
    true_labels_list (list of numpy.ndarray): 每个类别的真实标签。

    返回:
    float: 平均平均精确度(mAP)。
    """
    ap_list = []
    for pred_probs, true_labels in zip(pred_probs_list, true_labels_list):
        ap = calculate_ap(pred_probs, true_labels)
        ap_list.append(ap)
    
    map_score = np.mean(ap_list)
    return map_score

# 示例数据(假设有三个类别)
pred_probs_list = [
    np.array([0.9, 0.8, 0.7]),  # 类别 1 的预测概率
    np.array([0.4, 0.6, 0.5]),  # 类别 2 的预测概率
    np.array([0.7, 0.2, 0.9])   # 类别 3 的预测概率
]

true_labels_list = [
    np.array([1, 1, 0]),  # 类别 1 的真实标签
    np.array([0, 1, 0]),  # 类别 2 的真实标签
    np.array([1, 0, 1])   # 类别 3 的真实标签
]

map_score = calculate_map(pred_probs_list, true_labels_list)
print(f"Mean Average Precision (mAP): {map_score:.2f}")

三、常用包Numpy、pandas、matplotlib

python 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# NumPy 示例
array = np.array([1, 2, 3, 4, 5])
mean_value = np.mean(array)

# pandas 示例
df = pd.DataFrame({
    'X': [1, 2, 3, 4, 5],
    'Y': [1, 4, 9, 16, 25]
})
df['Z'] = df['X'] + df['Y']

# matplotlib 示例
plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.plot(df['X'], df['Y'], marker='o')
plt.title('Line Plot')
plt.xlabel('X')
plt.ylabel('Y')

plt.subplot(1, 2, 2)
plt.scatter(df['X'], df['Z'])
plt.title('Scatter Plot')
plt.xlabel('X')
plt.ylabel('Z')

plt.tight_layout()
plt.show()

Numpy

参考官方文档:NumPy 快速入门 --- NumPy v2.0 手册 - NumPy 中文

NumPy 是一个 Python 库,提供了对多维数组对象和多种数值计算功能的支持,是数据科学和机器学习中常用的基础包。它提供了高效的数组操作、数学函数、线性代数运算、统计分析等功能。

NumPy 的主要对象是同构多维数组。它是一个元素表(通常是数字),所有元素类型相同,由非负整数元组索引。在 NumPy 中,维度称为

常用功能和函数

创建数组

  • np.array(): 从列表或元组创建数组。
  • np.zeros(): 创建全零数组。
  • np.ones(): 创建全一数组。
  • np.arange(): 创建具有指定范围的数组。
  • np.linspace(): 创建具有指定范围和步长的数组。
  • np.empty(): 创建未初始化的数组。
python 复制代码
import numpy as np

# 创建数组
array = np.array([1, 2, 3, 4, 5])
print("Original Array:", array)

# 数组操作
print("Shape:", array.shape)
print("Reshaped Array:", array.reshape((1, 5)))

# 数学运算
print("Array + 10:", array + 10)
print("Array * 2:", array * 2)
print("Mean:", np.mean(array))

# 随机数生成
random_array = np.random.rand(2, 2)
print("Random Array:\n", random_array)

# 矩阵运算
matrix = np.array([[1, 2], [3, 4]])
print("Matrix:\n", matrix)
print("Matrix Product:\n", np.dot(matrix, matrix))

# 保存和加载
np.save('matrix.npy', matrix)
loaded_matrix = np.load('matrix.npy')
print("Loaded Matrix:\n", loaded_matrix)

pandas

pandas 是一个用于数据操作和分析的库,提供了高效的数据结构,如 DataFrame 和 Series。

创建 DataFrame 和 Series

python 复制代码
import pandas as pd

# 创建 DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

# 创建 Series
series = pd.Series([1, 2, 3, 4])

数据操作

python 复制代码
# 数据筛选
filtered_df = df[df['A'] > 1]

# 数据排序
sorted_df = df.sort_values(by='A')

# 缺失值处理
df_filled = df.fillna(0)

数据读写

python 复制代码
# 读取 CSV 文件
df = pd.read_csv('data.csv')

# 保存为 CSV 文件
df.to_csv('output.csv', index=False)

数据聚合

python 复制代码
# 分组操作
grouped_df = df.groupby('A').sum()

matplotlib

matplotlib 是一个绘图库,用于创建静态、动态和交互式的图形。

绘制基本图形

python 复制代码
import matplotlib.pyplot as plt

# 绘制线图
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.title('Line Plot')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.show()

# 绘制散点图
plt.scatter(x, y)
plt.title('Scatter Plot')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.show()

绘制直方图

python 复制代码
data = [1, 2, 2, 3, 4, 4, 4, 5, 6]
plt.hist(data, bins=5)
plt.title('Histogram')
plt.xlabel('Bins')
plt.ylabel('Frequency')
plt.show()

绘制子图

python 复制代码
plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.title('Line Plot')

plt.subplot(1, 2, 2)
plt.scatter(x, y)
plt.title('Scatter Plot')

plt.show()

四、Jupyter notebook/Lab 简述

安装

python 复制代码
conda create -n pytorch python=3.8 ipykernel
python 复制代码
conda activate pytorch

conda install jupyter notebook
python 复制代码
conda install -c conda-forge jupyterlab
python 复制代码
jupyter notebook  # 打开Jupyter Notebook
python 复制代码
jupyter lab 
相关推荐
铭瑾熙7 分钟前
深度学习之人脸检测
人工智能·深度学习
白光白光38 分钟前
量子卷积神经网络
人工智能·神经网络·cnn
Tony_long74832 小时前
Python学习——猜拳小游戏
开发语言·python·学习
陈苏同学2 小时前
机器翻译 & 数据集 (NLP基础 - 预处理 → tokenize → 词表 → 截断/填充 → 迭代器) + 代码实现 —— 笔记3.9《动手学深度学习》
人工智能·pytorch·笔记·python·深度学习·自然语言处理·机器翻译
狂放不羁霸2 小时前
组会 | 大语言模型 + LoRA
人工智能·语言模型·自然语言处理
sp_fyf_20242 小时前
【大语言模型】ACL2024论文-20 SCIMON:面向新颖性的科学启示机器优化
人工智能·深度学习·机器学习·语言模型·自然语言处理·数据挖掘
宋138102797202 小时前
SouVR Feedback force7 力反馈设备
人工智能·机器人·vr
股票GPT分析3 小时前
《Python 股票交易分析:开启智能投资新时代》(二)
大数据·服务器·python·c#·fastapi
大熊程序猿3 小时前
python Flask指定IP和端口
开发语言·python·flask
我叫白小猿3 小时前
【大模型-智能体】AutoGen Studio测试和导出工作流程
人工智能·python·workflow·工作流·智能体·autogen