An unbalanced dataset binary classification task
数据集是若干个设备的时序数据,每个设备都有一定概率出现故障,且出现故障的设备的比例很少(1:10)
任务是根据设备的时序数据预测设备是否出现故障,是一个不平衡数据集的二分类问题(Positive:Negative = 1000:1)
由于存在多个设备,也存在时间序列,所以我为该任务设两种解决方案:
- 训练一个机器学习模型,给定任意一个机器、任意时间的状态,预测机器是否故障 评价:实现简单,但是不符合逻辑定义。
由于机器的损坏可能是逐步发生的,所以时间序列信息可能有用
可能有些机器状态一直良好,不存在损坏的可能性,所以机器型号信息可能有用
- 训练一个RNN模型,用来提取时间序列信息,构造双向LSTM和GRU模型,输入前N天的机器状态,预测第N天机器是否故障
评价:该方案可以充分利用时序信息和设备信息。每个输入的batch可以为同一设备的信息
-
简单机器学习模型:Logistic、随机森林、AdaBoost、SVM(无法收敛) 由于Positive数据量太少,首先利用SMOTE进行过采样,再忽略时间和型号进行训练
-
深度学习模型:
首先针对每个设备绘制折线图,查看每个设备失败的趋势 。可以看出,存在故障的机器的数据,在机器发生故障后基本就结束采样了。
分别查看有损坏情况的设备和没损坏情况的设备的数据量情况,发现平均数集中在100左右。
- 模型构想 首先我设想构建N个cell,每一个cell存储一种设备、在时间序列上的点的9个特征信息 由于失败的数量过少,所以在构造数据时默认认为这N个时间戳下设备都没有损坏。
- 输入数据 经过观察发现有损坏的设备的数据特征如下:大多数数据在损坏后就没什么数据了,所以我想只用损坏那天前的所有数据来训练。 因为是二分类问题,所以输入的数据分为两类: 第一类是在第N天设备损坏的情况,最后的输出为1;;第二类是在第N天设备没有损坏的情况,最后输出为0
- 输入不平衡的问题 由于存在损坏的设备:没有存在损坏的设备的比为1:10 (107:1064) 所以需要一个方法来平衡数据集,我的几个思路
- 数据增强:对于每个损坏设备构造多个样本 对于第一类设备,可以取损坏当天和前后3天的数据都作为最终输出。且为了过采样,可以从前M天中抽取N天作为样本,这样对于每个设备就能构造出很
- SMOTE 对于从来没有损坏的设备,如果强行构造损坏的数据点感觉不符合事实 对于有损坏的设备,在状态正常的时间线上构造损坏的数据点感觉也不符合事实
- 采样函数
构建一个采样函数,给定一个值n,从0到n随机取m个不同的数字,但是要求离n越近的数字概率越高。比如
n=20 m=5
[ 3 10 18 19 20]
[ 1 13 17 19 20]
权重函数利用$w(x)=e^{\text{scale}\times x}$ 不过当x很大时,采样效果仍不理想,故引入强制选择参数,强制选取故障/查看状态前N天的状态
- 抽样方法
先从start_idx到end_idx之间选取一个最后的索引,再从0到最后的索引之间按照时间顺序选取10个样本点(必须包括最后一个索引),append到samples中。 其中进行的抽样逻辑如下: 如果一共样本数量小于10,那么在抽取所有样本后随机抽取,填充到10个(按照时间顺序),并且抽取$min(C^n_{10},5)$次 如果样本数量大于10,那么抽取$min(C^{10}_N /8 , 100)$次
这样发现P和F的比例基本为1
- 归一化:由于是时间序列数据,采用Layer Normalization。
- 利用CUDA进行GPU并行加速
- Optimizer:利用Adam优化器
这几个机器学习模型的效果如下:
Model | Precision | Recall | Specificity | F1-score | Roc_Auc |
---|---|---|---|---|---|
Logistic Regression | 0.003571 | 0.50 | 0.910304 | 0.007092 | 0.742415 |
Random Forest | 0.080000 | 0.25 | 0.998151 | 0.121212 | 0.860282 |
AdaBoost | 0.008547 | 0.75 | 0.944060 | 0.016901 | 0.919728 |
在分别利用LSTM,BiLSTM,GRU,BiGRU,Transformer进行训练后,结果如下
Model | Accuracy | Precision | Recall | Specificity | F1 Score | ROC AUC |
---|---|---|---|---|---|---|
LSTM | 0.990791 | 0.985729 | 0.996907 | 0.984018 | 0.991287 | 0.999734 |
BiLSTM | 0.990249 | 0.987705 | 0.993814 | 0.986301 | 0.990750 | 0.999138 |
GRU | 0.983207 | 0.976650 | 0.991753 | 0.973744 | 0.984143 | 0.998681 |
BiGRU | 0.986999 | 0.989648 | 0.985567 | 0.988584 | 0.987603 | 0.997828 |
Transformer | 0.505417 | 0.516184 | 0.937113 | 0.027397 | 0.665690 | 0.543827 |
对于前几个机器学习模型(Logistic、随机森林、Adaboost),由于没有利用时间序列的信息和设备型号的信息导致模型效果不佳。我在利用SVM训练时,尝试了很多的核函数都没法短时间内收敛。
对于构造的深度学习模型,可以看到最终F1-score很高,在自己构造的数据集下表现很好。目前来看该模型能做到的任务是:
给定任意前N-forced天的数据内容,以及range(N-forced,N)
天的数据内容,可以通过模型较为精准的预测第N天机器是否会有故障。