$$ 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}} $$

images_large_10.1177_0734242x231219627-fig2.jpg

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()

Claude

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]}")