1. Import Libraries

In [ ]:
import pandas as pd
import numpy as np

2. Load Database

In [ ]:
with open('database.json') as file:
    data = pd.read_json(file)

3. Data Processing and Cleaning

In [ ]:
data["future_temp"] = data["weather_forecast"].apply(lambda x: x["temp"])
data["future_humidity"] = data["weather_forecast"].apply(lambda x: x["humidity"])
data["future_uv"] = data["weather_forecast"].apply(lambda x: x["uv_index"])
data["future_rainfall"] = data["weather_forecast"].apply(lambda x: x["rainfall"])
data["future_wind_speed"] = data["weather_forecast"].apply(lambda x: x["wind_speed"])
In [ ]:
data.style.set_properties(subset=['weather_forecast'], **{'width': '500px'})
Out[ ]:
  timestamp indoor_temp indoor_humidity ambient_light motion outdoor_temp outdoor_humidity uv_index rainfall wind_speed weather_forecast future_temp future_humidity future_uv future_rainfall future_wind_speed
0 2023-04-01 00:00:00+00:00 22.500000 65.000000 1000 False 18.000000 60 2 5 8 {'timestamp': '2023-04-01T01:00:00Z', 'temp': 25.5, 'humidity': 75.0, 'uv_index': 5, 'rainfall': 1.0, 'wind_speed': 5.0} 25.500000 75.000000 5 1.000000 5.000000
1 2023-04-01 01:00:00+00:00 32.000000 84.500000 4100 True 33.500000 95 8 0 4 {'timestamp': '2023-04-01T02:00:00Z', 'temp': 28.0, 'humidity': 81.0, 'uv_index': 5, 'rainfall': 0.0, 'wind_speed': 7.0} 28.000000 81.000000 5 0.000000 7.000000
2 2023-04-01 02:00:00+00:00 25.500000 84.000000 2320 False 27.000000 80 2 1 9 {'timestamp': '2023-04-01T03:00:00Z', 'temp': 29.5, 'humidity': 95.0, 'uv_index': 3, 'rainfall': 11.0, 'wind_speed': 14.0} 29.500000 95.000000 3 11.000000 14.000000
3 2023-04-01 03:00:00+00:00 21.000000 83.500000 2300 True 16.500000 75 3 0 8 {'timestamp': '2023-04-01T04:00:00Z', 'temp': 16.0, 'humidity': 80.0, 'uv_index': 2, 'rainfall': 0.0, 'wind_speed': 9.0} 16.000000 80.000000 2 0.000000 9.000000
4 2023-04-01 04:00:00+00:00 30.500000 83.000000 4440 False 36.000000 90 9 0 4 {'timestamp': '2023-04-01T05:00:00Z', 'temp': 35.5, 'humidity': 95.0, 'uv_index': 10, 'rainfall': 0.0, 'wind_speed': 1.0} 35.500000 95.000000 10 0.000000 1.000000
5 2023-04-01 05:00:00+00:00 20.000000 72.500000 2050 True 19.500000 75 3 1 7 {'timestamp': '2023-04-01T06:00:00Z', 'temp': 18.0, 'humidity': 70.0, 'uv_index': 0, 'rainfall': 0.0, 'wind_speed': 1.0} 18.000000 70.000000 0 0.000000 1.000000
6 2023-04-01 06:00:00+00:00 39.500000 100.000000 10060 False 40.000000 100 10 0 1 {'timestamp': '2023-04-01T07:00:00Z', 'temp': 35.5, 'humidity': 95.0, 'uv_index': 7, 'rainfall': 0.0, 'wind_speed': 3.0} 35.500000 95.000000 7 0.000000 3.000000
7 2023-04-01 07:00:00+00:00 39.000000 91.500000 8970 True 35.500000 95 8 0 3 {'timestamp': '2023-04-01T08:00:00Z', 'temp': 39.0, 'humidity': 100.0, 'uv_index': 8, 'rainfall': 0.0, 'wind_speed': 3.0} 39.000000 100.000000 8 0.000000 3.000000
8 2023-04-01 08:00:00+00:00 28.500000 81.000000 4080 False 29.000000 89 7 0 9 {'timestamp': '2023-04-01T09:00:00Z', 'temp': 33.5, 'humidity': 95.0, 'uv_index': 7, 'rainfall': 0.0, 'wind_speed': 4.0} 33.500000 95.000000 7 0.000000 4.000000
9 2023-04-01 09:00:00+00:00 18.000000 70.500000 2090 True 15.500000 70 2 0 4 {'timestamp': '2023-04-01T10:00:00Z', 'temp': 13.0, 'humidity': 60.0, 'uv_index': 1, 'rainfall': 0.0, 'wind_speed': 5.0} 13.000000 60.000000 1 0.000000 5.000000
10 2023-04-01 10:00:00+00:00 17.500000 60.000000 1200 False 13.000000 60 2 0 5 {'timestamp': '2023-04-01T11:00:00Z', 'temp': 13.5, 'humidity': 65.0, 'uv_index': 1, 'rainfall': 0.0, 'wind_speed': 6.0} 13.500000 65.000000 1 0.000000 6.000000
11 2023-04-01 11:00:00+00:00 37.000000 99.500000 9010 True 39.500000 95 10 0 1 {'timestamp': '2023-04-01T12:00:00Z', 'temp': 34.0, 'humidity': 90.0, 'uv_index': 7, 'rainfall': 1.0, 'wind_speed': 1.0} 34.000000 90.000000 7 1.000000 1.000000
12 2023-04-01 12:00:00+00:00 36.500000 89.000000 9920 False 38.000000 960 9 0 4 {'timestamp': '2023-04-01T13:00:00Z', 'temp': 31.5, 'humidity': 87.0, 'uv_index': 7, 'rainfall': 3.0, 'wind_speed': 8.0} 31.500000 87.000000 7 3.000000 8.000000
13 2023-04-01 13:00:00+00:00 36.000000 88.500000 7230 True 39.500000 100 10 0 8 {'timestamp': '2023-04-01T14:00:00Z', 'temp': 42.0, 'humidity': 100.0, 'uv_index': 10, 'rainfall': 0.0, 'wind_speed': 0.0} 42.000000 100.000000 10 0.000000 0.000000
14 2023-04-01 14:00:00+00:00 35.500000 88.000000 9040 False 39.000000 90 8 0 1 {'timestamp': '2023-04-01T15:00:00Z', 'temp': 30.5, 'humidity': 95.0, 'uv_index': 7, 'rainfall': 0.0, 'wind_speed': 2.0} 30.500000 95.000000 7 0.000000 2.000000
15 2023-04-01 15:00:00+00:00 15.000000 57.500000 1250 True 19.500000 55 15 10 20 {'timestamp': '2023-04-01T16:00:00Z', 'temp': 13.0, 'humidity': 60.0, 'uv_index': 1, 'rainfall': 15.0, 'wind_speed': 31.0} 13.000000 60.000000 1 15.000000 31.000000
16 2023-04-01 16:00:00+00:00 24.500000 77.000000 5260 False 30.000000 78 8 0 11 {'timestamp': '2023-04-01T17:00:00Z', 'temp': 30.5, 'humidity': 95.0, 'uv_index': 9, 'rainfall': 2.0, 'wind_speed': 2.0} 30.500000 95.000000 9 2.000000 2.000000
17 2023-04-01 17:00:00+00:00 34.000000 96.500000 8970 True 39.500000 95 9 0 2 {'timestamp': '2023-04-01T18:00:00Z', 'temp': 39.0, 'humidity': 100.0, 'uv_index': 10, 'rainfall': 0.0, 'wind_speed': 3.0} 39.000000 100.000000 10 0.000000 3.000000
18 2023-04-01 18:00:00+00:00 37.000000 89.500000 7970 True 39.500000 95 7 1 2 {'timestamp': '2023-04-01T10:00:00Z', 'temp': 30.2, 'humidity': 80.0, 'uv_index': 2, 'rainfall': 6.0, 'wind_speed': 9.0} 30.200000 80.000000 2 6.000000 9.000000
19 2023-04-01 22:00:00+00:00 45.000000 95.000000 14000 True 48.000000 98 10 0 1 {'timestamp': '2023-04-01T23:00:00Z', 'temp': 35.0, 'humidity': 90.0, 'uv_index': 8, 'rainfall': 0.0, 'wind_speed': 2.0} 35.000000 90.000000 8 0.000000 2.000000
20 2023-04-01 23:00:00+00:00 30.000000 85.000000 13000 False 32.000000 80 6 0 3 {'timestamp': '2023-04-02T00:00:00Z', 'temp': 20.0, 'humidity': 70.0, 'uv_index': 4, 'rainfall': 5.0, 'wind_speed': 5.0} 20.000000 70.000000 4 5.000000 5.000000
21 2023-04-02 00:00:00+00:00 15.000000 65.000000 11000 True 18.000000 60 3 10 7 {'timestamp': '2023-04-02T01:00:00Z', 'temp': 10.0, 'humidity': 55.0, 'uv_index': 2, 'rainfall': 15.0, 'wind_speed': 10.0} 10.000000 55.000000 2 15.000000 10.000000
22 2023-04-02 01:00:00+00:00 10.000000 50.000000 9000 False 12.000000 45 1 20 12 {'timestamp': '2023-04-02T02:00:00Z', 'temp': 5.0, 'humidity': 40.0, 'uv_index': 0, 'rainfall': 25.0, 'wind_speed': 15.0} 5.000000 40.000000 0 25.000000 15.000000
23 2023-04-02 02:00:00+00:00 48.000000 99.000000 15000 True 50.000000 100 11 0 0 {'timestamp': '2023-04-02T03:00:00Z', 'temp': 30.0, 'humidity': 85.0, 'uv_index': 6, 'rainfall': 0.0, 'wind_speed': 5.0} 30.000000 85.000000 6 0.000000 5.000000
24 2023-04-02 03:00:00+00:00 32.000000 80.000000 5600 False 35.000000 75 5 0 7 {'timestamp': '2023-04-02T04:00:00Z', 'temp': 25.0, 'humidity': 70.0, 'uv_index': 4, 'rainfall': 5.0, 'wind_speed': 10.0} 25.000000 70.000000 4 5.000000 10.000000
25 2023-04-02 04:00:00+00:00 20.000000 65.000000 4000 True 22.000000 60 3 10 12 {'timestamp': '2023-04-02T05:00:00Z', 'temp': 15.0, 'humidity': 55.0, 'uv_index': 2, 'rainfall': 15.0, 'wind_speed': 15.0} 15.000000 55.000000 2 15.000000 15.000000
26 2023-04-02 05:00:00+00:00 10.000000 50.000000 1900 False 12.000000 45 1 20 18 {'timestamp': '2023-04-02T06:00:00Z', 'temp': 5.0, 'humidity': 40.0, 'uv_index': 0, 'rainfall': 25.0, 'wind_speed': 20.0} 5.000000 40.000000 0 25.000000 20.000000
27 2023-04-02 06:00:00+00:00 49.000000 98.000000 14500 True 50.000000 99 10 0 1 {'timestamp': '2023-04-02T07:00:00Z', 'temp': 35.0, 'humidity': 90.0, 'uv_index': 7, 'rainfall': 0.0, 'wind_speed': 3.0} 35.000000 90.000000 7 0.000000 3.000000
28 2023-04-02 07:00:00+00:00 34.000000 85.000000 9500 False 36.000000 80 6 0 5 {'timestamp': '2023-04-02T08:00:00Z', 'temp': 25.0, 'humidity': 75.0, 'uv_index': 4, 'rainfall': 5.0, 'wind_speed': 7.0} 25.000000 75.000000 4 5.000000 7.000000
29 2023-04-02 08:00:00+00:00 22.000000 70.000000 7500 True 24.000000 65 3 10 9 {'timestamp': '2023-04-02T09:00:00Z', 'temp': 15.0, 'humidity': 60.0, 'uv_index': 2, 'rainfall': 15.0, 'wind_speed': 12.0} 15.000000 60.000000 2 15.000000 12.000000
30 2023-04-02 09:00:00+00:00 12.000000 55.000000 3500 False 14.000000 50 1 20 15 {'timestamp': '2023-04-02T10:00:00Z', 'temp': 5.0, 'humidity': 45.0, 'uv_index': 0, 'rainfall': 25.0, 'wind_speed': 18.0} 5.000000 45.000000 0 25.000000 18.000000
31 2023-04-02 10:00:00+00:00 30.000000 85.000000 11500 False 34.000000 90 8 1 5 {'timestamp': '2023-04-02T11:00:00Z', 'temp': 38.0, 'humidity': 45.0, 'uv_index': 11, 'rainfall': 0.0, 'wind_speed': 3.0} 38.000000 45.000000 11 0.000000 3.000000
32 2023-04-02 11:00:00+00:00 32.000000 85.000000 11500 False 34.000000 90 8 0 5 {'timestamp': '2023-04-02T12:00:00Z', 'temp': 39.0, 'humidity': 95.0, 'uv_index': 10, 'rainfall': 0.0, 'wind_speed': 2.0} 39.000000 95.000000 10 0.000000 2.000000
33 2023-04-02 02:00:00+00:00 48.000000 99.000000 15000 True 50.000000 100 11 0 0 {'timestamp': '2023-04-02T03:00:00Z', 'temp': 30.0, 'humidity': 85.0, 'uv_index': 6, 'rainfall': 0.0, 'wind_speed': 5.0} 30.000000 85.000000 6 0.000000 5.000000
34 2023-04-02 03:00:00+00:00 32.000000 80.000000 14000 False 35.000000 75 5 0 7 {'timestamp': '2023-04-02T04:00:00Z', 'temp': 25.0, 'humidity': 70.0, 'uv_index': 4, 'rainfall': 5.0, 'wind_speed': 10.0} 25.000000 70.000000 4 5.000000 10.000000
35 2023-04-02 04:00:00+00:00 20.000000 65.000000 13000 True 22.000000 60 3 10 12 {'timestamp': '2023-04-02T05:00:00Z', 'temp': 15.0, 'humidity': 55.0, 'uv_index': 2, 'rainfall': 15.0, 'wind_speed': 15.0} 15.000000 55.000000 2 15.000000 15.000000
36 2023-04-02 05:00:00+00:00 10.000000 50.000000 12000 False 12.000000 45 1 20 18 {'timestamp': '2023-04-02T06:00:00Z', 'temp': 5.0, 'humidity': 40.0, 'uv_index': 0, 'rainfall': 25.0, 'wind_speed': 20.0} 5.000000 40.000000 0 25.000000 20.000000
37 2023-04-02 06:00:00+00:00 49.000000 98.000000 14500 True 50.000000 99 10 0 1 {'timestamp': '2023-04-02T07:00:00Z', 'temp': 35.0, 'humidity': 90.0, 'uv_index': 7, 'rainfall': 0.0, 'wind_speed': 3.0} 35.000000 90.000000 7 0.000000 3.000000
38 2023-04-01 00:00:00+00:00 22.500000 65.000000 1000 False 18.000000 60 2 5 8 {'timestamp': '2023-04-01T01:00:00Z', 'temp': 25.5, 'humidity': 75.0, 'uv_index': 5, 'rainfall': 1.0, 'wind_speed': 5.0} 25.500000 75.000000 5 1.000000 5.000000
39 2023-04-01 01:00:00+00:00 32.000000 84.500000 4100 True 33.500000 95 8 0 4 {'timestamp': '2023-04-01T02:00:00Z', 'temp': 28.0, 'humidity': 81.0, 'uv_index': 5, 'rainfall': 0.0, 'wind_speed': 7.0} 28.000000 81.000000 5 0.000000 7.000000
In [ ]:
selected = [1 ,2 ,3 ,7 ,8 ,9 , 11, 12, 13, 14, 15]
In [ ]:
selected_data = data.iloc[:,selected]

4. Normalization

In [ ]:
data_mean = np.mean(selected_data, axis=0)
data_sd = np.std(selected_data, axis=0)
adjusted_data = (selected_data - data_mean) / data_sd

5. Data Splitting (Training Set + Testing Set)

In [ ]:
def shuffle_data_numpy(X, y, numpy_seed):
    # fix the random seed
    np.random.seed(numpy_seed)

    # TODO Task 1.1
    # shuffle the given data pair (X, y)
    # please use numpy functions so that the results are controled by np.random.seed(numpy_seed)
    shuffled_array = np.random.permutation(X.shape[0])
    X_shuffle = X[shuffled_array]
    y_shuffle = y[shuffled_array]
    

    return X_shuffle, y_shuffle

def train_val_split(X_trainval, y_trainval, train_size, numpy_seed):
    # TODO TASK 1.2 
    # apply shuffle on the data with given random seed, then split the data into training and validation sets
    
    X_shuffle , y_shuffle = shuffle_data_numpy(X_trainval, y_trainval, numpy_seed)
    X_train = X_shuffle[:train_size]
    y_train = y_shuffle[:train_size]
    X_val = X_shuffle[train_size:]
    y_val = y_shuffle[train_size:]

    return X_train, X_val, y_train, y_val

6. Labelling

In [ ]:
truth = np.array([[26,10],[22, 6], [24, 7], [26, 8], [22, 6], [27, 8], [19, 0], [18, 2], [26, 5], [32, 8], [31, 9], [21, 2], [22, 8], [15, 2], [21, 2], [34, 10], [27, 7], [21, 2], [21, 4], [15, 1], [24, 3], [31, 3], [34, 4], [11, 0], [24, 5], [30, 7], [33,8], [13, 1], [23, 7], [29, 6], [30, 8], [25, 3], [25, 3], [13, 0], [23, 1], [32, 2], [34, 1], [11, 0], [33, 10], [26, 4]])
In [ ]:
truth_mean = np.mean(truth, axis=0)
truth_sd = np.std(truth, axis=0)
adjusted_truth = (truth - truth_mean )/ truth_sd
In [ ]:
X_train, X_val, y_train, y_val = train_val_split(np.array(adjusted_data), np.array(adjusted_truth), int(adjusted_data.shape[0]*0.7), 1)

7. Building Neural Networking

  • Number of layers : 5 layer
  • Total params: 3449 (13.47 KB)
  • Trainable params: 3449 (13.47 KB)
  • Non-trainable params: 0 (0.00 Byte)

In [ ]:
# No additional import allowed
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from keras.layers import Dense

def MyModel(input_dim, dropout_ratio):
    # Create a sequential model
    model = Sequential()


    model.build((None,input_dim))
    
    
    
    model.add(Dense(units = 64, activation = 'relu', kernel_initializer = "uniform"))
    model.add(Dropout(rate = dropout_ratio))
    
    model.add(Dense(units = 32, activation = 'relu', kernel_initializer = "uniform"))
    model.add(Dropout(rate = dropout_ratio))
    
    model.add(Dense(units = 16, activation = 'relu', kernel_initializer = "uniform"))
    model.add(Dropout(rate = dropout_ratio))
    
    model.add(Dense(units = 4, activation = 'relu', kernel_initializer = "uniform"))
    model.add(Dropout(rate = dropout_ratio))
    
    
    model.add(Dense(units = 1, activation = 'sigmoid', kernel_initializer = "uniform"))
    
    
    
    return model
In [ ]:
# Keep them as the default setting for the model you submitted to ZINC!
input_dim = len(selected)
dropout_ratio = 0.1

8. Compilation and Training

In [ ]:
from tensorflow.keras.optimizers import Adam

def MyModel_Training(model, X_train, y_train, X_val, y_val, batchsize, train_epoch):

    # TODO Task 2.2
    # Compile and train the given model
    # Hint: history can be returned by model.fit() function, please see https://keras.io/api/models/model_training_apis/
    adam_optimizer = Adam(learning_rate = 1e-3)
    
    model.compile(
        optimizer= adam_optimizer, 
        loss = 'mse',
        metrics =['mae'])
    
    history = model.fit(x = X_train, y = y_train, batch_size = batchsize, epochs = train_epoch, validation_data = (X_val, y_val))
    
    
    return history, model

model = MyModel(input_dim, dropout_ratio)

batchsize = 4
train_epoch = 50

history, model = MyModel_Training(model, X_train, y_train[:,0], X_val, y_val[:,0], batchsize, train_epoch)
test_loss, test_mae = model.evaluate(X_val, y_val, verbose=1)
print(f'Test Mean Average Error (MAE): {test_mae}')
model.summary()
WARNING:absl:At this time, the v2.11+ optimizer `tf.keras.optimizers.Adam` runs slowly on M1/M2 Macs, please use the legacy Keras optimizer instead, located at `tf.keras.optimizers.legacy.Adam`.
Epoch 1/50
7/7 [==============================] - 2s 88ms/step - loss: 1.2987 - mae: 0.9330 - val_loss: 1.1329 - val_mae: 0.8309
Epoch 2/50
7/7 [==============================] - 0s 9ms/step - loss: 1.2968 - mae: 0.9323 - val_loss: 1.1314 - val_mae: 0.8300
Epoch 3/50
7/7 [==============================] - 0s 8ms/step - loss: 1.2949 - mae: 0.9317 - val_loss: 1.1298 - val_mae: 0.8291
Epoch 4/50
7/7 [==============================] - 0s 7ms/step - loss: 1.2917 - mae: 0.9305 - val_loss: 1.1275 - val_mae: 0.8280
Epoch 5/50
7/7 [==============================] - 0s 7ms/step - loss: 1.2870 - mae: 0.9285 - val_loss: 1.1232 - val_mae: 0.8260
Epoch 6/50
7/7 [==============================] - 0s 6ms/step - loss: 1.2777 - mae: 0.9244 - val_loss: 1.1126 - val_mae: 0.8215
Epoch 7/50
7/7 [==============================] - 0s 8ms/step - loss: 1.2556 - mae: 0.9131 - val_loss: 1.0873 - val_mae: 0.8111
Epoch 8/50
7/7 [==============================] - 0s 7ms/step - loss: 1.1933 - mae: 0.8865 - val_loss: 1.0309 - val_mae: 0.7878
Epoch 9/50
7/7 [==============================] - 0s 11ms/step - loss: 1.0796 - mae: 0.8299 - val_loss: 0.9195 - val_mae: 0.7387
Epoch 10/50
7/7 [==============================] - 0s 7ms/step - loss: 0.9067 - mae: 0.7306 - val_loss: 0.7719 - val_mae: 0.6752
Epoch 11/50
7/7 [==============================] - 0s 7ms/step - loss: 0.7662 - mae: 0.6469 - val_loss: 0.6614 - val_mae: 0.6218
Epoch 12/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6958 - mae: 0.6141 - val_loss: 0.6164 - val_mae: 0.6061
Epoch 13/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6712 - mae: 0.5975 - val_loss: 0.6021 - val_mae: 0.6015
Epoch 14/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6656 - mae: 0.5937 - val_loss: 0.5960 - val_mae: 0.5996
Epoch 15/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6574 - mae: 0.5870 - val_loss: 0.5930 - val_mae: 0.5987
Epoch 16/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6527 - mae: 0.5802 - val_loss: 0.5917 - val_mae: 0.5981
Epoch 17/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6507 - mae: 0.5787 - val_loss: 0.5912 - val_mae: 0.5977
Epoch 18/50
7/7 [==============================] - 0s 7ms/step - loss: 0.6465 - mae: 0.5743 - val_loss: 0.5907 - val_mae: 0.5973
Epoch 19/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6433 - mae: 0.5711 - val_loss: 0.5901 - val_mae: 0.5970
Epoch 20/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6415 - mae: 0.5693 - val_loss: 0.5897 - val_mae: 0.5967
Epoch 21/50
7/7 [==============================] - 0s 7ms/step - loss: 0.6410 - mae: 0.5675 - val_loss: 0.5889 - val_mae: 0.5964
Epoch 22/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6376 - mae: 0.5643 - val_loss: 0.5883 - val_mae: 0.5961
Epoch 23/50
7/7 [==============================] - 0s 7ms/step - loss: 0.6378 - mae: 0.5644 - val_loss: 0.5877 - val_mae: 0.5960
Epoch 24/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6357 - mae: 0.5621 - val_loss: 0.5871 - val_mae: 0.5959
Epoch 25/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6339 - mae: 0.5600 - val_loss: 0.5867 - val_mae: 0.5957
Epoch 26/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6317 - mae: 0.5570 - val_loss: 0.5863 - val_mae: 0.5957
Epoch 27/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6299 - mae: 0.5527 - val_loss: 0.5861 - val_mae: 0.5956
Epoch 28/50
7/7 [==============================] - 0s 7ms/step - loss: 0.6298 - mae: 0.5533 - val_loss: 0.5859 - val_mae: 0.5955
Epoch 29/50
7/7 [==============================] - 0s 22ms/step - loss: 0.6272 - mae: 0.5497 - val_loss: 0.5857 - val_mae: 0.5955
Epoch 30/50
7/7 [==============================] - 0s 9ms/step - loss: 0.6252 - mae: 0.5468 - val_loss: 0.5855 - val_mae: 0.5954
Epoch 31/50
7/7 [==============================] - 0s 9ms/step - loss: 0.6239 - mae: 0.5436 - val_loss: 0.5853 - val_mae: 0.5954
Epoch 32/50
7/7 [==============================] - 0s 6ms/step - loss: 0.6235 - mae: 0.5432 - val_loss: 0.5852 - val_mae: 0.5954
Epoch 33/50
7/7 [==============================] - 0s 8ms/step - loss: 0.6214 - mae: 0.5387 - val_loss: 0.5851 - val_mae: 0.5953
Epoch 34/50
7/7 [==============================] - 0s 12ms/step - loss: 0.6208 - mae: 0.5374 - val_loss: 0.5849 - val_mae: 0.5951
Epoch 35/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6202 - mae: 0.5358 - val_loss: 0.5848 - val_mae: 0.5949
Epoch 36/50
7/7 [==============================] - 0s 13ms/step - loss: 0.6193 - mae: 0.5342 - val_loss: 0.5847 - val_mae: 0.5947
Epoch 37/50
7/7 [==============================] - 0s 14ms/step - loss: 0.6190 - mae: 0.5328 - val_loss: 0.5846 - val_mae: 0.5945
Epoch 38/50
7/7 [==============================] - 0s 17ms/step - loss: 0.6180 - mae: 0.5308 - val_loss: 0.5845 - val_mae: 0.5943
Epoch 39/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6166 - mae: 0.5265 - val_loss: 0.5845 - val_mae: 0.5941
Epoch 40/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6174 - mae: 0.5278 - val_loss: 0.5844 - val_mae: 0.5940
Epoch 41/50
7/7 [==============================] - 0s 12ms/step - loss: 0.6165 - mae: 0.5242 - val_loss: 0.5843 - val_mae: 0.5938
Epoch 42/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6166 - mae: 0.5250 - val_loss: 0.5843 - val_mae: 0.5937
Epoch 43/50
7/7 [==============================] - 0s 9ms/step - loss: 0.6158 - mae: 0.5217 - val_loss: 0.5842 - val_mae: 0.5936
Epoch 44/50
7/7 [==============================] - 0s 9ms/step - loss: 0.6159 - mae: 0.5233 - val_loss: 0.5841 - val_mae: 0.5935
Epoch 45/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6159 - mae: 0.5233 - val_loss: 0.5841 - val_mae: 0.5935
Epoch 46/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6160 - mae: 0.5237 - val_loss: 0.5841 - val_mae: 0.5935
Epoch 47/50
7/7 [==============================] - 0s 9ms/step - loss: 0.6156 - mae: 0.5213 - val_loss: 0.5841 - val_mae: 0.5935
Epoch 48/50
7/7 [==============================] - 0s 8ms/step - loss: 0.6157 - mae: 0.5228 - val_loss: 0.5841 - val_mae: 0.5935
Epoch 49/50
7/7 [==============================] - 0s 10ms/step - loss: 0.6156 - mae: 0.5212 - val_loss: 0.5841 - val_mae: 0.5936
Epoch 50/50
7/7 [==============================] - 0s 14ms/step - loss: 0.6152 - mae: 0.5200 - val_loss: 0.5841 - val_mae: 0.5937
1/1 [==============================] - 0s 233ms/step - loss: 0.6177 - mae: 0.6593
Test Mean Average Error (MAE): 0.6593391299247742
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 64)                768       
                                                                 
 dropout (Dropout)           (None, 64)                0         
                                                                 
 dense_1 (Dense)             (None, 32)                2080      
                                                                 
 dropout_1 (Dropout)         (None, 32)                0         
                                                                 
 dense_2 (Dense)             (None, 16)                528       
                                                                 
 dropout_2 (Dropout)         (None, 16)                0         
                                                                 
 dense_3 (Dense)             (None, 4)                 68        
                                                                 
 dropout_3 (Dropout)         (None, 4)                 0         
                                                                 
 dense_4 (Dense)             (None, 1)                 5         
                                                                 
=================================================================
Total params: 3449 (13.47 KB)
Trainable params: 3449 (13.47 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
In [ ]:
test = [38.5, 80, 10000, 9, 5, 2, 40.5, 90, 6, 0, 0]
adjusted_test = (test - data_mean) / data_sd
prediction = model.predict(np.array(adjusted_test).reshape(1, -1))
prediction*truth_sd[0] + truth_mean[0]
1/1 [==============================] - 0s 66ms/step
Out[ ]:
array([[24.356205]], dtype=float32)

9. Save the Model

In [ ]:
model.save('./smartHome.keras')
In [ ]:
model.save('./smartHome.h5')
/opt/miniconda3/envs/colab/lib/python3.10/site-packages/keras/src/engine/training.py:3103: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.
  saving_api.save_model(
In [ ]:
import tensorflowjs as tfjs

tfjs.converters.save_keras_model(model, "smart")
/opt/miniconda3/envs/colab/lib/python3.10/site-packages/keras/src/engine/training.py:3103: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.
  saving_api.save_model(

10. Data Visualization

In [ ]:
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['mae'], label='Training mae')
plt.plot(history.history['val_mae'], label='Validation mae')
plt.xlabel('Epochs')
plt.ylabel('MAE')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.tight_layout()
plt.show()
In [ ]:
test_predictions = model.predict(X_val).flatten()

plt.figure(figsize=(6, 6))
plt.scatter(y_val[:,0], test_predictions)
plt.xlabel('Ground True Values for optimal Air conditioning temperature')
plt.ylabel('Predictions for Air conditioning temperature)')
# plt.axis('equal')
# plt.axis('square')
plt.xlim([0,plt.xlim()[1]])
plt.ylim([0,plt.ylim()[1]])
_ = plt.plot([-100, 3000], [-100, 3000])
1/1 [==============================] - 0s 18ms/step