機器學習:衡量線性回歸法的指標(MSE、RMSE、MAE、R Squared)


一、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的比較

  1. 量綱一樣:都是原始數據中y對應的量綱
  2. RMSE > MAE:

   # 這是一個數學規律,一組正數的平均數的平方,小於每個數的平方和的平均數;

 

四、最好的衡量線性回歸法的指標:R Squared

  • 准確度:[0, 1],即使分類的問題不同,也可以比較模型應用在不同問題上所體現的優劣;
  • RMSE和MAE有局限性:同一個算法模型,解決不同的問題,不能體現此模型針對不同問題所表現的優劣。因為不同實際應用中,數據的量綱不同,無法直接比較預測值,因此無法判斷模型更適合預測哪個問題。
  • 方案:將預測結果轉換為准確度,結果都在[0, 1]之間,針對不同問題的預測准確度,可以比較並來判斷此模型更適合預測哪個問題;

 

 1)計算方法

 

 

 2)對公式的理解

  • :公式樣式與MSE類似,可以理解為一個預測模型,只是該模型與x無關,在機器學習領域稱這種模型為基准模型(Baseline Model),適用於所有的線型回歸算法;
  • 基准模型問題:因為其沒有考慮x的取值,只是很生硬的以為所有的預測樣本,其預測結果都是樣本均值

 

  A)因此對公式可以這樣理解:
  1. 分子是我們的模型預測產生的錯誤,分母是使用y等於y的均值這個模型所產生的錯誤
  2. 自己的模型預測產生的錯誤 / 基礎模型預測生產的錯誤,表示自己的模型沒有擬合住的數據,因此R2可以理解為,自己的模型擬合住的數據

 

  B)公式推理結論:
  1. R2 <= 1
  2. R2越大越好,當自己的預測模型不犯任何錯誤時:R2 = 1
  3. 當我們的模型等於基准模型時:R2 = 0
  4. 如果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:預測到的數據

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM