机器学习-不均衡数据问题

对于机器学习中不均衡数据的问题是很常见的,之前在三星实习也遇到过,但当时对指标性能要求并不高,差不多也就行了。。但这次参加 kaggle 比赛,0.1% 就有很大差距了,所以还是要好好搞搞 imbalanced data problem.

很多时候,数据不均衡不仅仅数据收集和整理的问题,而是数据本身预期的就是这样,比如表征欺诈性交易(characterize fraudulent transactions),大多数交易都是不具有欺诈性的,只有极少数的 具有欺诈性的(Fraud), 或者 kaggle 比赛中的 insincere-questions, 大多数问题都是正常的,只有极少数的 insincere-questions.

More data

显然,这是最直接的。在实际中,也是最可行的。但打比赛时,数据是给定的,就需要用到 resampling.

Metrics

改变评价指标来选择更优的模型。

  • accurayc 显然这个对不均衡数据是不合适的
  • Precision: (tp/(tp+fp))
  • Recall: (tp/(tp+fn))
  • F1 Score (or F-score): precision 和 recall 的一种权衡
  • Kappa: Cohen’s kappa
  • ROC 曲线:这些在之前的笔记中都有介绍 机器学习-常用指标总结
  • PRAUC 损失函数? ai challenger 比赛中看到的

Resampling

  • 过采样 over-sampling
  • 欠采样 under-sampling

实践中可以两种都尝试,并且能做集成增强。

一些采样策略:
- 数据量很大(上万或者十万?),建议欠采样,数据量较小,建议过采样
- 可以尝试随机采样,也可以尝试分层采样(划分好)
- 尝试不同的比例,并不一定要最后是 1:1

Generate Synthetic Samples

SMOTE(Synthetic Minority Over-sampling Technique): 不是简单的 copy, 而是选取两个或更多的相似的样本(根据距离),然后随机扰动一个样本的属性(某一维特征吧),扰动值在它与相邻样本的差异之间。

paper: SMOTE: Synthetic Minority Over-sampling Technique

python tool: UnbalancedDataset

 Try Penalized Models

在训练过程中,给类别较少的一类增加惩罚项,通常是正则化.这有利于模型能注重 minority class.

对类和权重的惩罚对不同的算法不太一样,所有有专门的版本的算法:penalized-SVM 和 penalized-LDA.

也有通用的惩罚模型,适用于不同的分类器 CostSensitiveClassifier

惩罚模型提供了另外一种方法来 "balance" 模型,但设置惩罚矩阵是很复杂的,需要很多尝试。

Try a Different Perspective

对于之前说过的欺诈性检测和kaggle insincere 问题的发现,从另外一个角度看,也能看做是异常检测(anomaly detection)和 变异检测(change detection).

类似于 open set recognition 或 out-of-distribution 问题,样本数极少的那个类别 minior class 可以看做是 outliers class.

Anomaly detection is the detection of rare events. This might be a machine malfunction indicated through its vibrations or a malicious activity by a program indicated by it’s sequence of system calls. The events are rare and when compared to normal operation.

Change detection is similar to anomaly detection except rather than looking for an anomaly it is looking for a change or difference. This might be a change in behavior of a user as observed by usage patterns or bank transactions.