Time Series Regression

Importing things we would need.


			
			
			
			using
			
			 

	
			FastAI
			,
			
			 
			FastTimeSeries
			,
			
			 

	
			Flux

Loading The Data

We are going to select a dataset from the recently released Monash, UEA & UCR

Time Series Extrinsic Regression Repository (2020) ( web , paper ).


			
			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			load
			(
			
			

	
			datarecipes
			(
			)
			[
			
			"
			appliances_energy
			"
			]
			)
			;

getobs gets us a sample from the TimeSeriesDataset. It returns a tuple with the input time series and the correspodning label.


			
			
			
			
			input
			,
			 
			label
			 
			=
			
			 
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			25
			)

			(Float32[23.7 23.7 … 24.0 24.1; 30.856667 30.663334 … 31.066668 31.23; … ; 40.0 40.0 … 40.0 40.0; 0.6 0.55 … 1.3666667 1.3333334], 11.49f0)

Now we create a learning task for time-series regression. This means using the time-series to predict labels. We will use the TimeSeriesRow block as input and Continuous block as the target.


			
			
			
			
			task
			 
			=
			 
			
			TSRegression
			(
			blocks
			,
			 
			data
			)
			;

The encodings passed in transform samples into formats suitable as inputs and outputs for a model

Let's check that samples from the created data container conform to the blocks of the learning task:


			
			
			

	
			checkblock
			(
			
			
			task
			.
			
			blocks
			.
			
			sample
			,
			 
			sample
			)

			true

To get an overview of the learning task created, and as a sanity test, we can use describetask. This shows us what encodings will be applied to which blocks, and how the predicted ŷ values are decoded.


			
			
			

	
			describetask
			(
			task
			)

			
			
			
			encoded_sample
			 
			=
			 
			

	
			encodesample
			(
			task
			,
			 
			

	
			Training
			(
			)
			,
			 
			sample
			)

			(Float32[1.25567 1.25567 … 1.4426183 1.5049348; -2.3630838 -2.4116828 … -2.3102949 -2.269237; … ; 0.14111246 0.14111246 … 0.14111246 0.14111246; -0.7532581 -0.7651869 … -0.57035017 -0.5783027], Float32[11.49])

Training

We will use an InceptionTime model for this task.


			
			
			
			
			model
			 
			=
			 
			
			
			
			FastTimeSeries
			.
			
			Models
			.
			
			InceptionTime
			(
			24
			,
			 
			1
			)
			;

We can tasklossfn to get a loss function suitable for our task.


			
			
			
			lossfn
			 
			=
			 
			

	
			tasklossfn
			(
			task
			)

			mse (generic function with 1 method)

Next we create a pair of training and validation data loaders. They take care of batching and loading the data in parallel in the background.


			
			
			
			
			
			traindl
			,
			 
			validdl
			 
			=
			 
			

	
			taskdataloaders
			(
			data
			,
			 
			task
			,
			 
			8
			)
			;

We will use an ADAM optimzer for this task.


			
			
			
			optimizer
			 
			=
			 
			
			ADAM
			(
			)

			ADAM(0.001, (0.9, 0.999), 1.0e-8, IdDict{Any, Any}())

With the addition of an optimizer and a loss function, we can now create a Learner and start training.


			
			
			
			
			learner
			 
			=
			 
			

	
			Learner
			(
			model
			,
			 
			lossfn
			
			;
			 
			
			data
			=
			
			(
			traindl
			,
			 
			validdl
			)
			,
			 
			
			optimizer
			=
			optimizer
			,
			 
			
			callbacks
			 
			=
			 
			
			[
			

	
			ToGPU
			(
			)
			]
			)
			;

			
			
			

	
			fitonecycle!
			(
			learner
			,
			 
			20
			,
			 
			0.03
			)

			┌ Info: The GPU function is being called but the GPU is not accessible. 
│ Defaulting back to the CPU. (No action is required if you want to run on the CPU).
└ @ Flux /Users/saksham/.julia/packages/Flux/js6mP/src/functor.jl:192
Epoch 1 TrainingPhase(): 100%|██████████████████████████| Time: 0:01:40
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   1.0 │ 142.689 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   1.0 │ 9526.84 │
└─────────────────┴───────┴─────────┘
Epoch 2 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   2.0 │ 36.1776 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   2.0 │ 2761.77 │
└─────────────────┴───────┴─────────┘
Epoch 3 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   3.0 │ 21.8786 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   3.0 │ 2405.18 │
└─────────────────┴───────┴─────────┘
Epoch 4 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   4.0 │ 24.9655 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   4.0 │ 581.368 │
└─────────────────┴───────┴─────────┘
Epoch 5 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   5.0 │ 22.4986 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   5.0 │ 78.5748 │
└─────────────────┴───────┴─────────┘
Epoch 6 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   6.0 │ 17.6525 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   6.0 │ 31.8414 │
└─────────────────┴───────┴─────────┘
Epoch 7 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   7.0 │ 16.7812 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   7.0 │ 43.8513 │
└─────────────────┴───────┴─────────┘
Epoch 8 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   8.0 │ 18.4489 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   8.0 │ 19.5717 │
└─────────────────┴───────┴─────────┘
Epoch 9 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │   9.0 │ 17.3489 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │   9.0 │ 20.2309 │
└─────────────────┴───────┴─────────┘
Epoch 10 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  10.0 │ 13.0602 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  10.0 │ 27.7731 │
└─────────────────┴───────┴─────────┘
Epoch 11 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:04
┌───────────────┬───────┬────────┐
│         Phase  Epoch    Loss │
├───────────────┼───────┼────────┤
│ TrainingPhase │  11.0 │ 17.051 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  11.0 │ 16.8113 │
└─────────────────┴───────┴─────────┘
Epoch 12 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:04
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  12.0 │ 12.0818 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  12.0 │ 23.0781 │
└─────────────────┴───────┴─────────┘
Epoch 13 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  13.0 │ 14.9439 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  13.0 │ 15.9388 │
└─────────────────┴───────┴─────────┘
Epoch 14 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬────────┐
│         Phase  Epoch    Loss │
├───────────────┼───────┼────────┤
│ TrainingPhase │  14.0 │ 13.336 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  14.0 │ 15.2863 │
└─────────────────┴───────┴─────────┘
Epoch 15 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  15.0 │ 11.6416 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  15.0 │ 17.4399 │
└─────────────────┴───────┴─────────┘
Epoch 16 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬────────┐
│         Phase  Epoch    Loss │
├───────────────┼───────┼────────┤
│ TrainingPhase │  16.0 │ 9.8485 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  16.0 │ 15.5438 │
└─────────────────┴───────┴─────────┘
Epoch 17 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  17.0 │ 9.37123 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  17.0 │ 15.5285 │
└─────────────────┴───────┴─────────┘
Epoch 18 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  18.0 │ 10.1838 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  18.0 │ 14.4063 │
└─────────────────┴───────┴─────────┘
Epoch 19 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  19.0 │ 9.74364 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬────────┐
│           Phase  Epoch    Loss │
├─────────────────┼───────┼────────┤
│ ValidationPhase │  19.0 │ 14.059 │
└─────────────────┴───────┴────────┘
Epoch 20 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│         Phase  Epoch     Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │  20.0 │ 8.15523 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│           Phase  Epoch     Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │  20.0 │ 15.6445 │
└─────────────────┴───────┴─────────┘

We can save the model for later inference using savetaskmodel


			
			
			

	
			savetaskmodel
			(
			
			"
			tsregression.jld2
			"
			,
			 
			task
			,
			 
			
			learner
			.
			
			model
			
			;
			 
			
			force
			 
			=
			 
			true
			)