# 注:使用線性回歸算法的前提是,假設數據存在線性關系,如果最后求得的准確度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 - yi)2,來表示一個樣本點的距離,而不用絕對值,因為優化過程中使用絕對值計算不方便;
2)公式

- m:訓練集中的m個樣本
-
x(i) 和 y(i):訓練集中的特征和其對應的標記值
-
x + - 和 y + -:訓練集中特征和標記的均值
3)優化過程
- 優化求參數b的表達式


- 優化求參數a的表達式



- 一般用J(a, b)表示損失函數
- a、b是要求的參數,x、y是訓練集中已知的數據
- 運算思路:將運算式整理成向量之間進行運算的形式(向量化)
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)算法特點
-
線性回歸算法:典型的參數學習算法;
# kNN算法:非參數學習算法
-
線性回歸算法:只能解決回歸問題,雖然很多分類方法中,線性回歸是基礎(如邏輯回歸);
# kNN算法:即可解決分類問題,又可以解決回歸問題;
-
線性回歸算法對數據有假設性:線性
# 數據和最終的結果具有線性關系,關系越強,預測到的結果越好
# kNN算法對數據沒有假設
- 一般稍微改變線性回歸算法,就可以處理非線性的問題
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)
- 系數的意義(依據實例說明)
- 系數有正有負,正負表示特征與最終預測的目標(也就是房價)是正相關還是負相關;
- 系數為正,特征與目標是正相關,則特征越大房價越高;
- 系數為負,特征與目標是負相關,則特征越大房價越低;
- 系數的絕對值的大小,決定了特征對目標的影響程度;
- 根據系數和特征,分析預測結果(依據實例分析)
- RM(房間數量)特征:系數最大,說明房間越多的房屋,房價越高;
- CHAS(房屋臨河)特征:系數排第二,說明臨河的房屋,房價高,不臨河的房屋房價低;
- NOX(房屋周圍一氧化氮的濃度)特征:系數最小,說明房屋周圍的一氧化碳的濃度越低,房價越高;
- DIS(房屋距離勞務雇佣中心的距離)特征:系數排倒數第二,說明房屋距離勞務雇佣中心的距離約小,房價越高;
- 知道特征與目標之間的關系后,可以采集更多的特征,來更好的描述房屋的房價
七、其它
- 很多學界領域的研究,很多時候都會首先嘗試使用線性回歸算法這種最基礎最簡單的方式
- 回歸問題中,具體預測的是一個數值,這個具體的數值是在一個連續的空間里的
- 所謂的建模的過程,其實就是找到一個數學模型,最大程度的“擬合”數據,如:y = ax + b
- 所謂最大程度“擬合”數據,本質就是找到一個函數(目標函數),度量出模型沒有“擬合”住的那一部分樣本,或者度量出能最大“擬合”的程度
- 在線性回歸算法中,建立的模型就是一個直線方程
- 目標函數:損失函數、效用函數
- 特征空間中,有些點在數學模型上(滿足數學模型的關系),有些不模型上,不在數學模型上的那部分點,稱為損失的數據
- 效用函數:度量的是“擬合”的程度
機器學習算法的思路
- 分析問題,確定問題的目標函數(損失函數或者效用函數)
- 最優化目標函數,獲取機器學習的模型:優化損失函數,使其盡可能的小;優化效用函數,使其盡可能的大;
- 所有的參數學習算法都是這樣的套路:線性回歸、多項式回歸、邏輯回歸、SVM、神經網絡等,區別在於這些算法的模型、目標函數、優化方式不同;
- 有一個學科:最優化原理,凸優化為最優化原理的分支,專門研究優化問題
- 解決了最優化的問題后,就獲得了一個機器學習的模型;
