import pandas as pd
import numpy as np
with open('database.json') as file:
data = pd.read_json(file)
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"])
data.style.set_properties(subset=['weather_forecast'], **{'width': '500px'})
| 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 |
selected = [1 ,2 ,3 ,7 ,8 ,9 , 11, 12, 13, 14, 15]
selected_data = data.iloc[:,selected]
data_mean = np.mean(selected_data, axis=0)
data_sd = np.std(selected_data, axis=0)
adjusted_data = (selected_data - data_mean) / data_sd
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
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]])
truth_mean = np.mean(truth, axis=0)
truth_sd = np.std(truth, axis=0)
adjusted_truth = (truth - truth_mean )/ truth_sd
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)
# 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
# Keep them as the default setting for the model you submitted to ZINC!
input_dim = len(selected)
dropout_ratio = 0.1
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)
_________________________________________________________________
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
array([[24.356205]], dtype=float32)
model.save('./smartHome.keras')
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(
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(
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()
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