$$ MAE = \cfrac{\sum_{i=1}^{n} |\hat{y_{i}} - y_{i}^{*}|}{n} $$
$$ MSE = \cfrac{\sum_{i=1}^{n}(\hat{y_{i}} - y_{i}^{*})^2}{n} $$
$$ RMSE = \sqrt{\cfrac{\sum_{i=1}^{n}(\hat{y_{i}} - y_{i}^{*})^2}{n}} = \sqrt{MSE} $$
$$ RAE = \cfrac{\cfrac{\sum_{i=1}^{n} |\hat{y_{i}} - y_{i}^{}|}{n}}{\cfrac{\sum_{i=1}^{n}y_{i}^{}}{n}} = \cfrac{MAE}{\bar{Y}} $$
Reference: https://journals.sagepub.com/doi/10.1177/0734242X231219627
import tensorflow as tf
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow.keras.datasets import boston_housing
import math
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()
#print(x_train.shape) # 輸出訓練資料的特徵值大小
#print(y_train.shape) # 輸出訓練資料的標籤大小
classes = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT']
data = pd.DataFrame(x_train, columns=classes)
#print(data.head()) # 輸出前面五筆資料
data['MEDV'] = pd.Series(data=y_train)
print(data.head())
print(data.describe()) #get some basic stats on the dataset
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler() # 資料調整到0~1之間的範圍
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
#print(x_train.shape[1])
#print(len(y_train))
# 建立MLP迴歸模型
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(32, activation='tanh', input_shape=[x_train.shape[1]]))
model.add(tf.keras.layers.Dense(64, activation='tanh'))
model.add(tf.keras.layers.Dense(1)) # 輸出為一個答案(房屋價格)
model.compile(loss='mse',optimizer='sgd', metrics=['mae']) # 迴歸最佳化演算法
history=model.fit(x_train, y_train,
epochs=1000,
batch_size=len(y_train))
# testing
print("start testing")
cost = model.evaluate(x_test, y_test)
print("test cost: {}".format(cost))
Y_pred2 = model.predict(x_test) # Y predict
print(Y_pred2[:10])
print(y_test[:10])
err = []
tem = []
rae_sum = 0
mae_sum = 0
mse_sum = 0
for i in range(len(y_test[:])):
dif = abs(Y_pred2[i:i+1]-[y_test[i:i+1]])
err.append(dif)
tem.append(dif/[y_test[i:i+1]])
mae_sum += err[i]
mse_sum += err[i]**2
rae_sum += tem[i]
#print("max=%.6f\\tmin=%.6f" % (max(err), min(err)))
print("error max = %.6f" % max(err))
print("error min = %.6f" % min(err))
mae = mae_sum/len(y_test[:])
mse = mse_sum/len(y_test[:])
rae = rae_sum/len(y_test[:])
print("MAE = %.6f" % mae)
print("MSE = %.6f" % mse)
print("RMSE = %.6f" % math.sqrt(mse))
print("MAE = %.6f" % rae)
import matplotlib.pyplot as plt
print(history.history.keys())
plt.plot(history.history["mae"]) #mean_absolute_error
plt.title("Boston house price")
plt.ylabel("mae")
plt.xlabel("epoch")
plt.legend(["train mae"], loc = "upper right")
plt.show()
import tensorflow as tf
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow.keras.datasets import boston_housing
import math
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()
#print(x_train.shape) # 輸出訓練資料的特徵值大小
#print(y_train.shape) # 輸出訓練資料的標籤大小
classes = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT']
data = pd.DataFrame(x_train, columns=classes)
#print(data.head()) # 輸出前面五筆資料
data['MEDV'] = pd.Series(data=y_train)
#print(data.head())
#print(data.describe()) #get some basic stats on the dataset
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler() # 資料調整到0~1之間的範圍
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
#print(x_train.shape[1])
#print(len(y_train))
import itertools
# 定義想要嘗試的超參數值
units_options = [16, 32]
epochs_options = [100, 500]
#batch_size_options = [32, 64, 128]
batch_size_options = np.linspace(32, 64, 2,dtype=int)
# 生成所有可能的超參數組合
param_combinations = list(itertools.product(units_options, epochs_options, batch_size_options))
best_rae = float('inf') # 初始化最佳RAE為正無窮大
best_params = None
for units, epochs, batch_size in param_combinations:
print(f"Training with units={units}, epochs={epochs}, batch_size={batch_size}")
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=units, activation='tanh', input_shape=[x_train.shape[1]]))
model.add(tf.keras.layers.Dense(units=units*2, activation='tanh'))
model.add(tf.keras.layers.Dense(1))
model.compile(loss='mse', optimizer='sgd', metrics=['mae'])
history = model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, verbose=0)
# 在測試集上評估模型
Y_pred = model.predict(x_test).flatten()
err = np.abs(Y_pred - y_test)
rae = np.mean(err / np.abs(y_test))
# 儲存最小RAE和對應的超參數組合
if rae < best_rae:
best_rae = rae
best_params = (units, epochs, batch_size)
print(f"RAE: {rae:.6f}")
print(f"Best RAE: {best_rae:.6f} with units={best_params[0]}, epochs={best_params[1]}, batch_size={best_params[2]}")