最近在处理一个类不平均的数据集,这里记录一些注意事项,方便以后查阅。
对于类别不平衡的数据集,模型训练与测试的效果可能受到数据分布的影响,因此需要采取一些方法来缓解类别不平衡问题,从而提高模型的性能和泛化能力。以下是常见的解决策略:
(1) 过采样(Oversampling)
(2) 欠采样(Undersampling)
(3) 数据增强
(1) 使用加权损失函数
(2) 平衡采样器(Balanced Sampler)
DataLoader
或批量生成策略。(3) 使用特殊模型架构
(1) 选择合适的评估指标
(2) 分层采样(Stratified Sampling)
(3) 混淆矩阵分析
(1) 混合采样
(2) 使用非对称阈值
predict_proba
的概率阈值。(3) 分阶段训练
(1) 使用加权损失函数(以PyTorch为例)
import torch
import torch.nn as nn
# 假设类别0的样本数为1000,类别1的样本数为100
weights = torch.tensor([1/1000, 1/100], dtype=torch.float32)
criterion = nn.CrossEntropyLoss(weight=weights)
(2) 使用SMOTE进行过采样
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
# 使用SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
定义
混淆矩阵是一种评估分类模型性能的工具,显示模型在测试数据上的分类结果与实际结果的对比情况。它将分类结果划分为四种类型:TP(真正例)、TN(真负例)、FP(假正例)和 FN(假负例)。混淆矩阵通常用于二分类问题,但也可扩展到多分类问题。
二分类混淆矩阵
实际类别 / 预测类别 | 预测为正例 | 预测为负例 |
---|---|---|
实际为正例 | TP | FN |
实际为负例 | FP | TN |
元素解释
扩展到多分类问题
对于多分类问题,混淆矩阵是一个 n × n 的方阵,n 是类别数。矩阵中的第 i i i 行表示实际类别为 i i i 的样本,第 j j j 列表示模型预测类别为 j j j 的样本数量。对角线上的值表示正确分类的样本数,非对角线表示错误分类的情况。
定义
公式
Accuracy = TP + TN TP + TN + FP + FN \text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}} Accuracy=TP+TN+FP+FNTP+TN
应用场景
适用性
优缺点
物理意义
实现代码
from sklearn.metrics import accuracy_score
# y_true: 实际标签, y_pred: 预测标签
accuracy = accuracy_score(y_true, y_pred)
定义
公式
Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} Precision=TP+FPTP
应用场景
适用性
优缺点
物理意义
实现代码
from sklearn.metrics import precision_score
precision = precision_score(y_true, y_pred)
定义
公式
Recall = TP TP + FN \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} Recall=TP+FNTP
应用场景
适用性
优缺点
物理意义
实现代码
from sklearn.metrics import recall_score
recall = recall_score(y_true, y_pred)
定义
公式
F1-Score = 2 × Precision × Recall Precision + Recall \text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1-Score=2×Precision+RecallPrecision×Recall
应用场景
适用性
优缺点
物理意义
实现代码
from sklearn.metrics import f1_score
f1 = f1_score(y_true, y_pred)
定义
公式
κ = p o − p e 1 − p e \kappa = \frac{p_o - p_e}{1 - p_e} κ=1−pepo−pe
应用场景
适用性
优缺点
物理意义
实现代码
from sklearn.metrics import cohen_kappa_score
kappa = cohen_kappa_score(y_true, y_pred)
定义
公式
Specificity = TN TN + FP \text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} Specificity=TN+FPTN
应用场景
适用性
优缺点
物理意义
实现代码
from sklearn.metrics import confusion_matrix
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
specificity = tn / (tn + fp)
定义
公式
FPR = FP FP + TN \text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}} FPR=FP+TNFP
应用场景
适用性
优缺点
定义
应用场景
适用性
优缺点
实现代码
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_true, y_pred_proba)
定义
应用场景
优缺点
实现代码
from sklearn.metrics import precision_recall_curve, auc
precision, recall, _ = precision_recall_curve(y_true, y_pred_proba)
pr_auc = auc(recall, precision)