Time Series Classification with LSTM in Keras
本文总结一下最近在项目中学到的一些东西。
其实在抽象问题上花了很多时间,抽象出来问题其实也很简单:
已知一个时序序列,序列中的每个元素本身就是一个label。
- 预测序列下一个元素;
- 取概率最高的元素,如果预测的label与真实的label一致,认为序列正常;否则序列出现异常。
这样问题的描述也就很清楚了。1是一个序列预测多分类问题,2是一个序列异常判断二分类问题。
1. 序列预测多分类问题
模型选择
因为LSTM在处理序列问题上有很好效果,所以使用两层LSTM,最后加一个全连接层作为输出层,激活函数选择softmax。
1 | model = Sequential() |
训练阶段
需要对原始数据进行编码处理,首先使用LabelEncoder将label转换为integer,然后使用np_utils.to_categorical()转换为one-hot编码。
1 | # 进行one-hot编码 |
1 | # 使用训练数据训练模型 |
评估阶段
多分类问题使用macro-P/macro-R/macro-F1评估。
本来打算使用KFold进行交叉验证的,但是报错:ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass targets
。
确实,对于sample进行了one-hot编码后Classifier认为是multilabel问题,但真正的label只有一个。但是封装的API里面并不能one-hot编码decode回来,所以只好手动划分训练集和验证集。
1 | # 预测label |
1 | # 模型效果评估 |
2. 序列异常判断二分类问题(未完善)
因为缺乏标注数据,验证阶段没法进行。当然,如果认为原来的序列是完全正常的,这样可以用recall=TP/(TP+FN)计算recall。
在1中可以得到预测label的概率分布,直接进行评估即可。
评估阶段
如前所述,只能计算recall。
1 | # 在预测时记录TP的情况 |
1 | # 计算recall |