NDCG 是信息检索和排序任务中常用的评价指标,用于衡量模型预测的排序质量与真实相关性排序的一致程度。
DCG@k=∑i=1krelilog2(i+1) \text{DCG@k} = \sum_{i=1}^{k} \frac{rel_i}{\log_2(i+1)} DCG@k=i=1∑klog2(i+1)reli
IDCG@k=∑i=1krelisortedlog2(i+1) \text{IDCG@k} = \sum_{i=1}^{k} \frac{rel_i^{\text{sorted}}}{\log_2(i+1)} IDCG@k=i=1∑klog2(i+1)relisorted
NDCG@k=DCG@kIDCG@k \text{NDCG@k} = \frac{\text{DCG@k}}{\text{IDCG@k}} NDCG@k=IDCG@kDCG@k
假设有5个项目,真实相关性如下:
真实相关性: [3, 2, 3, 0, 1]
模型预测排序对应的标签值: [0, 3, 2, 3, 1]
DCG@5=0log2(1+1)+3log2(2+1)+2log2(3+1)+3log2(4+1)+1log2(5+1) \text{DCG@5} = \frac{0}{\log_2(1+1)} + \frac{3}{\log_2(2+1)} + \frac{2}{\log_2(3+1)} + \frac{3}{\log_2(4+1)} + \frac{1}{\log_2(5+1)} DCG@5=log2(1+1)0+log2(2+1)3+log2(3+1)2+log2(4+1)3+log2(5+1)1
≈0+31.58496+22+32.32193+12.58496≈4.5722 \approx 0 + \frac{3}{1.58496} + \frac{2}{2} + \frac{3}{2.32193} + \frac{1}{2.58496} \approx 4.5722 ≈0+1.584963+22+2.321933+2.584961≈4.5722
IDCG@5=3log2(1+1)+3log2(2+1)+2log2(3+1)+1log2(4+1)+0log2(5+1)≈6.3235 \text{IDCG@5} = \frac{3}{\log_2(1+1)} + \frac{3}{\log_2(2+1)} + \frac{2}{\log_2(3+1)} + \frac{1}{\log_2(4+1)} + \frac{0}{\log_2(5+1)} \approx 6.3235 IDCG@5=log2(1+1)3+log2(2+1)3+log2(3+1)2+log2(4+1)1+log2(5+1)0≈6.3235
NDCG@5=4.57226.3235≈0.723 \text{NDCG@5} = \frac{4.5722}{6.3235} \approx 0.723 NDCG@5=6.32354.5722≈0.723
逻辑回归用于二分类任务,模型输出的是一个概率值 y^i=σ(wTxi)\hat{y}_i = \sigma(w^T x_i)y^i=σ(wTxi),表示样本为正类yi=1y_i = 1yi=1的概率。
逻辑回归从概率建模角度出发,假设每个标签服从 伯努利分布:
yi∼Bernoulli(y^i) y_i \sim \text{Bernoulli}(\hat{y}_i) yi∼Bernoulli(y^i)
P(yi∣y^i)=y^iyi⋅(1−y^i)1−yi P(y_i \mid \hat{y}_i) = \hat{y}_i^{y_i} \cdot (1 - \hat{y}_i)^{1 - y_i} P(yi∣y^i)=y^iyi⋅(1−y^i)1−yi
这意味着:
在二分类任务中,我们通常使用 交叉熵损失(Cross Entropy Loss) 而不是 MAE(Mean Absolute Error),主要原因如下:
MAE 的梯度恒定(要么是 1 要么是 -1),不会提供置信度信息:
如果分类任务的label:类别有序、可数值化的分类问题。例如评分,美学等级。
在这种情况下,每个类别有明确的数值含义,用 softmax 后的加权期望值(soft-argmax)来回归一个“期望标签”,再用 MAE/MSE 来优化,是合理的。
具体方案:
import torch
import torch.nn.functional as F
# 模拟网络输出 logits
logits = torch.tensor([[2.0, 1.0, 0.5, -1.0]], requires_grad=True) # shape: [batch, num_classes]
true_label = torch.tensor([0.0]) # shape: [batch]
# softmax 变成概率
probs = F.softmax(logits, dim=1) # shape: [batch, 4]
# soft-argmax 得到数值输出(概率期望)
label_values = torch.tensor([0.0, 1.0, 2.0, 3.0]) # 类别编号
pred_value = torch.sum(probs * label_values, dim=1) # shape: [batch]
# 计算 MAE loss
loss = F.l1_loss(pred_value, true_label)
ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,由 Quinlan 于1986年提出。
选择 信息增益(Information Gain) 最大的特征来进行划分。
设数据集为 DDD,特征为 AAA,
C4.5 是 ID3 的改进版本,同样由 Quinlan 提出。
将连续特征值转化为二元划分:
“特征 A <= t” 和 “特征 A > t”,
其中 ttt 是一个划分阈值。
选取两个相邻样本值之间的中点作为候选划分点(t):
ti=ai+ai+12 t_i = \frac{a_i + a_{i+1}}{2} ti=2ai+ai+1
在这个例子中,候选划分点为 t :
24, 27, 29.5, 32.5, 37.5
class Solution:
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
n = 0
cur = head
while cur:
n += 1
cur = cur.next
dummy = ListNode()
dummy.next = head
p0 = dummy
while n >= k:
n -= k
pre = None
cur = p0.next
for _ in range(k):
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
nxt = p0.next
p0.next.next = cur
p0.next = pre
p0 = nxt
return dummy.next