这其实是一个利用LSTM递归网络进行序列分类的问题,根据数据趋势把数据分成6个类正常,循环,阶跃上升,阶跃下降,趋势向上,趋势向下
数据连接:https://archive.ics.uci.edu/ml/machine-learning-databases/synthetic_control-mld/synthetic_control.data
图像连接:https://archive.ics.uci.edu/ml/machine-learning-databases/synthetic_control-mld/data.jpeg
处理步骤如下:
1.下载并准备数据
(a)600个数据450个训练150测试
(b)把数据转成适当的格式并用csv序列读取器读取
格式:每个文件一个代表一个时间序列,还有一个独立的标签文件,例如train/features/0.csv是特征文件,对应标签文件train/labels/0.csv,由于数据是单变量序列,csv 只有一列数据,没列有多个值,每行一个时间步,标签文件只有一个标签值
2.用csv序列读取器装载训练数据,用序列读取数据迭代器转换数据集
3.规范化数据,收集训练数据的统计信息,训练数据和测试数据用同样的方法规范化
4.配置网络,我们使用小型的lstm层和一个rnn输出层
5.训练40步,每步打印测试数据的准确率和f1
代码如下:
public class UCISequenceClassificationExample { private static final Logger log = LoggerFactory.getLogger(UCISequenceClassificationExample.class);//声明了log类,这样用logger.info打印信息 //'baseDir': Base directory for the data. Change this if you want to save the data somewhere else private static File baseDir = new File("src/main/resources/uci/");//文件路径,实战中文件很多时我们很可能这样处理数据 private static File baseTrainDir = new File(baseDir, "train");//file类里两个参数,第一个是上级目录,第二个是下级目录 private static File featuresDirTrain = new File(baseTrainDir, "features");//定位到特征目录 private static File labelsDirTrain = new File(baseTrainDir, "labels");//定位到标签目录 private static File baseTestDir = new File(baseDir, "test");//定位到测试目录 private static File featuresDirTest = new File(baseTestDir, "features");//定位到测试属性目录 private static File labelsDirTest = new File(baseTestDir, "labels");//定位到测试标签目录