一、MSE、RMSE、MAE
- 思路:測試數據集中的點,距離模型的平均距離越小,該模型越精確
- # 注:使用平均距離,而不是所有測試樣本的距離和,因為距離和受樣本數量的影響
1)公式:
- MSE:均方誤差

- RMSE:均方根誤差

- MAE:平均絕對誤差

二、具體實現
1)自己的代碼
-
import numpy as np from sklearn.metrics import r2_score class SimpleLinearRegression: def __init__(self): """初始化Simple Linear Regression模型""" self.a_ = None self.b_ = None def fit(self, x_train, y_train): """根據訓練數據集x_train, y_train訓練Simple Linear Regression模型""" assert x_train.ndim == 1, \ "Simple Linear Regressor can only solve single feature training data." assert len(x_train) == len(y_train), \ "the size of x_train must be equal to the size of y_train" x_mean = np.mean(x_train) y_mean = np.mean(y_train) self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean) self.b_ = y_mean - self.a_ * x_mean return self def predict(self, x_predict): """給定待預測數據集x_predict,返回表示x_predict的結果向量""" assert x_predict.ndim == 1, \ "Simple Linear Regressor can only solve single feature training data." assert self.a_ is not None and self.b_ is not None, \ "must fit before predict!" return np.array([self._predict(x) for x in x_predict]) def _predict(self, x_single): """給定單個待預測數據x,返回x的預測結果值""" return self.a_ * x_single + self.b_ def score(self, x_test, y_test): """根據測試數據集 x_test 和 y_test 確定當前模型的准確度:R^2""" y_predict = self.predict(x_test) return r2_score(y_test, y_predict) def __repr__(self): return "SimpleLinearRegression()"
2)調用scikit-learn中的算法
-
from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error # MSE mse_predict = mean_squared_error(y_test, y_predict) # MAE mae_predict = mean_absolute_error(y_test, y_predict) # y_test:測試數據集中的真實值 # y_predict:根據測試集中的x所預測到的數值
3)RMSE和MAE的比較
- 量綱一樣:都是原始數據中y對應的量綱
- RMSE > MAE:
# 這是一個數學規律,一組正數的平均數的平方,小於每個數的平方和的平均數;
四、最好的衡量線性回歸法的指標:R Squared
- 准確度:[0, 1],即使分類的問題不同,也可以比較模型應用在不同問題上所體現的優劣;
- RMSE和MAE有局限性:同一個算法模型,解決不同的問題,不能體現此模型針對不同問題所表現的優劣。因為不同實際應用中,數據的量綱不同,無法直接比較預測值,因此無法判斷模型更適合預測哪個問題。
- 方案:將預測結果轉換為准確度,結果都在[0, 1]之間,針對不同問題的預測准確度,可以比較並來判斷此模型更適合預測哪個問題;
1)計算方法


2)對公式的理解
:公式樣式與MSE類似,可以理解為一個預測模型,只是該模型與x無關,在機器學習領域稱這種模型為基准模型(Baseline Model),適用於所有的線型回歸算法;- 基准模型問題:因為其沒有考慮x的取值,只是很生硬的以為所有的預測樣本,其預測結果都是樣本均值
A)因此對公式可以這樣理解:
- 分子是我們的模型預測產生的錯誤,分母是使用y等於y的均值這個模型所產生的錯誤
- 自己的模型預測產生的錯誤 / 基礎模型預測生產的錯誤,表示自己的模型沒有擬合住的數據,因此R2可以理解為,自己的模型擬合住的數據
B)公式推理結論:
- R2 <= 1
- R2越大越好,當自己的預測模型不犯任何錯誤時:R2 = 1
- 當我們的模型等於基准模型時:R2 = 0
- 如果R2 < 0,說明學習到的模型還不如基准模型。 # 注:很可能數據不存在任何線性關系
3)公式變形

- R2背后具有其它統計意思
4)R2的代碼實現及使用
-
具體代碼:
1 - mean_squared_error(y_true, y_predict) / np.var(y_true) # mean_squared_error()函數就是MSE # np.var(array):求向量的方差
- 調用scikit-learn中的r2_score()函數:
from sklearn.metrics import r2_score r2_score(y_test, y_predict) # y_test :測試數據集中的真實值 # y_predict:預測到的數據
