機器學習:線性回歸法(Linear Regression)


# 注:使用線性回歸算法的前提是,假設數據存在線性關系,如果最后求得的准確度R < 0,則說明很可能數據間不存在任何線性關系(也可能是算法中間出現錯誤),此時就要檢查算法或者考慮使用其它算法;

一、功能與特點

 1)解決回歸問題

 2)思想簡單,實現容易

   # 因為算法運用了很多的數學推到,使計算機實現變得容易

 3)許多非線性模型的基礎

 4)結果具有很好的可解釋性

   # 算法系統通過學習數據,訓練模型,可以學到真實世界中真實的知識

 5)蘊含機器學習中的很多重要思

 

二、定義與思路

  • 目的:根據樣本特征,預測樣本的其它性質、特征或數據;
  • 思路:尋找一條直線,最大程度的“擬合”樣本特征和樣本輸出標記之間的關系,建立數學模型,求解最優的數學模型對應的參數;
  • 怎么才算最大程度的“擬合”:讓數據集中的所有樣本點,距離線性模型的距離的和最小;
  • :根據房子的面積預測房子的價格,面積是房子特征,價格是房子的輸出標記;

 

三、簡單線性回歸

  • 單線性回歸:樣本特征只有一個;
  • 數學模型:y = ax + b

 

四、最優化簡單線性回歸

 

 1)思路

  • 假設的線型關系:y = ax + b
  • (xi, yi):為訓練集中的一個樣本點
  • ý = axi + b,(xi, ý):是根據數學模型得到的點
  • |ý - yi| = |axi + b - yi|:一個預測值與其真實值之間的距離
  • 訓練集中,所有樣本的預測值與其真實值之間的距離和,優化出最小距離和所對應的a、b,即為得出最優的數學模型;
  • 公式:(axi + b - yi2,來表示一個樣本點的距離,而不用絕對值,因為優化過程中使用絕對值計算不方便;

 

 2)公式

  • m:訓練集中的m個樣本
  • x(i) 和 y(i):訓練集中的特征和其對應的標記值

  • x + - 和 y + -:訓練集中特征和標記的均值

 

 3)優化過程

  • 優化求參數b的表達式
  • 優化求參數a的表達式
  1. 一般用J(a, b)表示損失函數 
  2. a、b是要求的參數,x、y是訓練集中已知的數據
  3.  運算思路:將運算式整理成向量之間進行運算的形式(向量化)

 

 4)向量化

  • 向量化:將運算式整理成向量之間進行運算的形式
  • 優點:向量之間運算效率更高;
  • 例:J(a, b) = np.sum(array1.array2) == np.dot(array1, array2) == array1.dot(array2),而不是采用for循環;
  • 注1:array1 * array2,兩向量對應數據相乘,結果還是一個array
  • 注2:np.dot(array1, array2),兩向量相乘所得新向量的數據和

 

五、簡單線性回歸算法的代碼實現和使用

 

 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 確定當前模型的准確度"""

        y_predict = self.predict(x_test)
        return r2_score(y_test, y_predict)

    def __repr__(self):
        return "SimpleLinearRegression()"

 

 2)在Jupyter Notebook中使用所寫的算法

# 導入封裝算法的類
import numpy as np
import matplotlib.pyplot as plt
from LR.S_L_R_2 import SimpleLinearRegression

x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 3., 5.])

# 初始化
regl = Simple_linear_Regression1()

# fit
regl.fit(x, y)

 

 3)其它

  • 參數學習算法與kNN算法內部實現的區別:參數學習算法不需要存儲用戶傳進來的訓練數據集
  • 訓練數據集的意義就是訓練模型的參數,一旦模型得到參數的值,訓練數據集就沒用了
  • 在預測時,只需要使用訓練到的參數對待預測的數據進行計算即可
  • np.dot(array1, array2) == array1.dot(array2):計算兩個向量(返回一個數值),或者兩矩陣的乘積(返回一個矩陣/向量)

 

六、對線性回歸算法的其它思考

 1)算法特點

  1. 線性回歸算法:典型的參數學習算法;

      # kNN算法:非參數學習算法

  2. 線性回歸算法:只能解決回歸問題,雖然很多分類方法中,線性回歸是基礎(如邏輯回歸);

      # kNN算法:即可解決分類問題,又可以解決回歸問題;

  3. 線性回歸算法對數據有假設性:線性

      # 數據和最終的結果具有線性關系,關系越強,預測到的結果越好

      # kNN算法對數據沒有假設

  4. 一般稍微改變線性回歸算法,就可以處理非線性的問題

 

 2)優缺點

  • 優點:對數據具有強解釋性
  • 缺點:時間復雜度高:O(n3)(即使優化后O(2.4)

 

 3)線性回歸算法具有可解釋性

  • 實例(sklearn.datasets中波士頓的房價數據)
     1 import numpy as np
     2 from sklearn import datasets
     3 
     4 boston = datasets.load_boston()
     5 X = boston.data
     6 y = boston.target
     7 
     8 X = X[y < 50.0]
     9 y = y[y < 50.0]
    10 
    11 from sklearn.linear_model import LinearRegression
    12 
    13 lin_reg = LinearRegression()
    14 lin_reg.fit(X, y)
    15 
    16 lin_reg.coef_
    17 # 輸出:array([-1.05574295e-01,  3.52748549e-02, -4.35179251e-02,  4.55405227e-01,
    18        -1.24268073e+01,  3.75411229e+00, -2.36116881e-02, -1.21088069e+00,
    19         2.50740082e-01, -1.37702943e-02, -8.38888137e-01,  7.93577159e-03,
    20        -3.50952134e-01])
    21 
    22 # 對系數排序:默認從小到大,返回系數的index
    23 np.argsort(lin_reg.coef_)
    24 # 輸出:array([ 4,  7, 10, 12,  0,  2,  6,  9, 11,  1,  8,  3,  5], dtype=int64)
    25 
    26 # 根據系數排序后的index,對特征從新排序
    27 boston.feature_names[np.argsort(lin_reg.coef_)]
    28 
    29 # 查看每個特征相對樣本的意義
    30 print(boston.DESCR)

     

  • 系數的意義(依據實例說明)
  1. 系數有正有負,正負表示特征與最終預測的目標(也就是房價)是正相關還是負相關;
  2. 系數為正,特征與目標是正相關,則特征越大房價越高;
  3. 系數為負,特征與目標是負相關,則特征越大房價越低;
  4. 系數的絕對值的大小,決定了特征對目標的影響程度;

 

  • 根據系數和特征,分析預測結果(依據實例分析)
  1. RM(房間數量)特征:系數最大,說明房間越多的房屋,房價越高;
  2. CHAS(房屋臨河)特征:系數排第二,說明臨河的房屋,房價高,不臨河的房屋房價低;
  3. NOX(房屋周圍一氧化氮的濃度)特征:系數最小,說明房屋周圍的一氧化碳的濃度越低,房價越高;
  4. DIS(房屋距離勞務雇佣中心的距離)特征:系數排倒數第二,說明房屋距離勞務雇佣中心的距離約小,房價越高;

 

  • 知道特征與目標之間的關系后,可以采集更多的特征,來更好的描述房屋的房價

 

七、其它

  • 很多學界領域的研究,很多時候都會首先嘗試使用線性回歸算法這種最基礎最簡單的方式
  • 回歸問題中,具體預測的是一個數值,這個具體的數值是在一個連續的空間里的
  • 所謂的建模的過程,其實就是找到一個數學模型,最大程度的“擬合”數據,如:y = ax + b
  • 所謂最大程度“擬合”數據,本質就是找到一個函數(目標函數),度量出模型沒有“擬合”住的那一部分樣本,或者度量出能最大“擬合”的程度
  • 在線性回歸算法中,建立的模型就是一個直線方程
  • 目標函數:損失函數、效用函數
  • 特征空間中,有些點在數學模型上(滿足數學模型的關系),有些不模型上,不在數學模型上的那部分點,稱為損失的數據
  • 效用函數:度量的是“擬合”的程度

 

 機器學習算法的思路

  1. 分析問題,確定問題的目標函數(損失函數或者效用函數)
  2. 最優化目標函數,獲取機器學習的模型:優化損失函數,使其盡可能的小;優化效用函數,使其盡可能的大;
  • 所有的參數學習算法都是這樣的套路:線性回歸、多項式回歸、邏輯回歸、SVM、神經網絡等,區別在於這些算法的模型、目標函數、優化方式不同;
  • 有一個學科:最優化原理,凸優化為最優化原理的分支,專門研究優化問題
  • 解決了最優化的問題后,就獲得了一個機器學習的模型;

 


免責聲明!

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



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