在機器學習中,評估模型性能時常用的四個指標包括平均絕對誤差(Mean Absolute Error, MAE)、均方誤差(Mean Squared Error, MSE)、均方根誤差(Root Mean Squared Error, RMSE)和決定系數(R-squared, R2)。
一、MBE(平均偏差誤差)
??平均偏差誤差(MBE)是衡量模型預測值與實際值之間偏差的指標。然而,值得注意的是,在常見的機器學習評估指標中,MBE并不如MAE、RMSE和R2那樣廣泛被提及或使用。在某些特定場景下,MBE可能被用作評估模型預測偏差的一個補充指標,但其具體定義和計算方法可能因應用場景的不同而有所差異。因此,在討論機器學習評估指標時,MBE通常不是核心指標之一。
二、MAE(平均絕對誤差)
??MAE 是預測值與實際值之差的絕對值的平均數。它給出了預測誤差的平均大小,但不考慮誤差的方向(正或負)。相比MSE和RMSE,MAE對異常值不敏感,不會因為少數大誤差的平方而放大結果,適用于具有較多異常值的數據集。然而,MAE的缺點在于缺乏方向性,即它無法反映出誤差是正偏還是負偏,可能不適用于需要區分偏差方向的應用場景。
三、RMSE(均方根誤差)
??均方根誤差(RMSE)是均方誤差(MSE)的平方根。MSE是衡量預測值與實際值之間平方差的平均值,而RMSE則將其量級與原始數據保持一致,便于解釋。由于計算了平方差,RMSE對大誤差的懲罰更大,適合對誤差敏感的場景。RMSE的單位與原數據相同,因此容易理解。然而,RMSE的缺點在于對異常值敏感,可能會因為少數大誤差的平方而放大結果。
四、R2(決定系數)
??決定系數(R2)用于確定數據與擬合回歸線的接近程度。它表示模型解釋數據方差的比例,范圍是0到1。R2的值越接近1,表示模型對數據的擬合程度越好;越接近0,表示模型對數據的擬合程度越差。R2的值被標準化在0到1之間,便于比較不同模型的性能。然而,R2的缺點在于:當數據的范圍很大時,即使模型的預測值與實際值之間存在較大的偏差,R2的值也可能很高。R2無法直接反映模型是否過擬合,需要結合其他指標(如交叉驗證)來評估模型的性能。
五、sklearns庫里自帶計算方法
1.方法一
# 導入
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from math import sqrt#測試集四個指標
predictions = rf.predict(test_datas)# 預測結果
errors = (predictions-test_labels).astype(float) # 計算誤差,確保誤差是浮點數
mbe = np.mean(errors)# 計算MBE(平均偏差誤差)
mae = np.mean(np.abs(errors))# 計算MAE(平均絕對誤差)rmse = np.sqrt(np.mean(errors**2))# 計算RMSE(均方根誤差)
# 計算R2(決定系數)
ss_res = np.sum((predictions - test_labels)**2) # 殘差平方和
ss_tot = np.sum((test_labels - np.mean(test_labels))**2) # 總平方和
r2 = 1 - (ss_res / ss_tot)# 輸出結果
print('MBE:',mbe)
print('MAE:', mae)
print('RMSE:', rmse)
print('R2:', r2)mbe = sum( predictions-test_labels) / len(test_labels)# 計算MBE
mae = mean_absolute_error(test_labels, predictions)# 計算MAE
mse = mean_squared_error(test_labels, predictions)
rmse = mse ** 0.5# 計算RMSE
r2 = r2_score(test_labels, predictions)# 計算R2
print(f"MBE: {mbe}")
print(f"RMSE: {rmse}")
print(f"MAE: {mae}")
print(f"R2: {r2}")
2.方法二
# 導入
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from math import sqrt# 訓練集四個評價指標
train_pred = rf.predict(train_datas)
mbe_tr = sum( train_pred - train_labels) / len(train_labels)# 計算MBE
mae_tr = mean_absolute_error(train_labels, train_pred)# 計算MAE
mse_tr = mean_squared_error(train_labels, train_pred)
rmse_tr = mse_tr ** 0.5# 計算RMSE
r2_tr = r2_score(train_labels, train_pred)# 計算R2
print(f"MBE_tr: {mbe_tr}")
print(f"RMSE_tr: {rmse_tr}")
print(f"MAE_tr: {mae_tr}")
print(f"R2_tr: {r2_tr}")
print('---------------------------------------------------------------------------------')
# 測試集四個評價指標
test_pred = rf.predict(test_datas)
mbe_te = sum( test_pred - test_labels) / len(test_labels)# 計算MBE
mae_te = mean_absolute_error(test_labels, test_pred)# 計算MAE
mse_te = mean_squared_error(test_labels, test_pred)
rmse_te = mse_te ** 0.5# 計算RMSE
r2_te = r2_score(test_labels, test_pred)# 計算R2
print(f"MBE_te: {mbe_te}")
print(f"RMSE_te: {rmse_te}")
print(f"MAE_te: {mae_te}")
print(f"R2_te: {r2_te}")