1. 程式人生 > >機器學習-線性回歸

機器學習-線性回歸

效果 img mas orm feature 現象 state 編寫 tps

一、概述

1.簡單線性回歸

一種基於自變量(x)來預測因變量(Y)的方法.假設這兩個變量是線性相關的,則尋找出根據特征或者自變量的線性函數來精準預測響應值.線性回歸意味著可以將輸入項分別乘以一些常量,再將結果加起來得到輸出。需要說明的是,存在另一種成為非線性回歸的回歸模型,該模型不認同上面的做法,比如認為輸出可能是輸入的乘積。

應該怎麽從一大堆數據裏求出回歸方程呢?假定輸入數據存放在矩陣X中,結果存放在向量y中:

技術分享圖片

而回歸系數存放在向量w中:

技術分享圖片

那麽對於給定的數據x1,即矩陣X的第一列數據,預測結果u1將會通過如下公式給出:

技術分享圖片

現在的問題是,手裏有數據矩陣X和對應的標簽向量y,怎麽才能找到w呢?一個常用的方法就是找出使誤差最小的w。這裏的誤差是指預測u值和真實y值之間的差值,使用該誤差的簡單累加將使得正差值和負差值相互抵消,所以我們采用平方誤差。

平方誤差和可以寫做:

技術分享圖片

用矩陣表示還可以寫做:

技術分享圖片

為啥能這麽變化,記住一個前提:若x為向量,則默認x為列向量,x^T為行向量。將上述提到的數據矩陣X和標簽向量y帶進去,就知道為何這麽變化了。

在繼續推導之前,我們要先明確一個目的:找到w,使平方誤差和最小。因為我們認為平方誤差和越小,說明線性回歸擬合效果越好。

現在,我們用矩陣表示的平方誤差和對w進行求導:

技術分享圖片

如果對於矩陣求不熟悉的,https://blog.csdn.net/nomadlx53/article/details/50849941

令上述公式等於0,得到:

技術分享圖片

w上方的小標記表示,這是當前可以估計出的w的最優解。從現有數據上估計出的w可能並不是數據中的真實w值,所以這裏使用了一個"帽"符號來表示它僅是w的一個最佳估計。

值得註意的是,上述公式中包含逆矩陣,也就是說,這個方程只在逆矩陣存在的時候使用,也即是這個矩陣是一個方陣,並且其行列式不為0。最佳w求解是統計學中的常見問題,除了矩陣方法外還有很多其他方法可以解決。通過調用NumPy庫裏的矩陣方法,我們可以僅使用幾行代碼就完成所需功能。該方法也稱作OLS, 意思是“普通小二乘法”(ordinary least squares)。數據下載:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Regression/ex0.txt

2、局部加權線性回歸

線性回歸的一個問題是有可能出現欠擬合現象,因為它求的是具有小均方誤差的無偏估計。如果模型欠擬合將不能取得好的預測效果。所以有些方法允許在估計中引入一 些偏差,從而降低預測的均方誤差。

其中的一個方法是局部加權線性回歸(Locally Weighted Linear Regression,LWLR)。在該方法中,我們給待預測點附近的每個點賦予一定的權重。與kNN一樣,這種算法每次預測均需要事先選取出對應的數據子集。該算法解除回歸系數W的形式如下:

技術分享圖片

其中W是一個矩陣,這個公式跟我們上面推導的公式的區別就在於W,它用來給每個點賦予權重。

LWLR使用"核"(與支持向量機中的核類似)來對附近的點賦予更高的權重。核的類型可以自由選擇,最常用的核就是高斯核,高斯核對應的權重如下:

技術分享圖片

這樣我們就可以根據上述公式,編寫局部加權線性回歸,我們通過改變k的值,可以調節回歸效果,當k越小,擬合效果越好。但是當k過小,會出現過擬合的情況。

3、嶺回歸

如果數據的特征比樣本點還多應該怎麽辦?很顯然,此時我們不能再使用上文的方法進行計算了,因為矩陣X不是滿秩矩陣,非滿秩矩陣在求逆時會出現問題。統計學家引入嶺回歸(ridge regression)的概念。

嶺回歸即我們所說的L2正則線性回歸(正則有兩個,其中L1正則是LASSO,L2是ridge,可用於過擬合),在一般的線性回歸最小化均方誤差的基礎上增加了一個參數w的L2範數的罰項,從而最小化罰項殘差平方和:

技術分享圖片

簡單說來,嶺回歸就是在普通線性回歸的基礎上引入單位矩陣。回歸系數的計算公式變形如下:

技術分享圖片

式中,矩陣I是一個mxm的單位矩陣,加上一個λI從而使得矩陣非奇異,進而能對矩陣求逆。

嶺回歸最先用來處理特征數多於樣本數的情況,現在也用於在估計中加入偏差,從而得到更好的估計。這裏通過引入λ來限制了所有w之和,通過引入該懲罰項,能夠減少不重要的參數,這個技術在統計學中也可以叫做縮減(shrinkage)。

縮減方法可以去掉不重要的參數,因此能更好地裂解數據。此外,與簡單的線性回歸相比,縮減法能夠取得更好的預測效果。(為了使用嶺回歸和縮減技術,首先需要對特征做標準化處理。因為,我們需要使每個維度特征具有相同的重要性。本文使用的標準化處理比較簡單,就是將所有特征都減去各自的均值並除以方差。

二、算法

簡單線性回歸、局部加權線性回歸

三、使用

3.1數據預處理

導入相關庫

導入數據集

檢查缺失數據

劃分數據集

特征縮放將使用簡單線性模型的相關庫來進行

3.2通過訓練集來訓練簡單線性回歸模型

使用來自sklearn.linear_model庫的LinearnRegression類,然後創建一個LinearnRegression的regressor對象,最後使用LinearnRegression類的fit()方法將regressor對象對數據集進行訓練.

3.3預測結果

預測來自測試集的結果,把輸出保存在向量Y_pred中.使用前一不中的訓練回歸模型regressor的LinearnRegression類的預測方法來對結果進行預測.

# 簡單線性回歸
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

dataset = pd.read_csv(studentscores.csv)
X = dataset.iloc[: , :1].values
#print(X)
Y = dataset.iloc[:,1].values
#print(Y)
seed = 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=seed)
# print(X_test)
# print(‘*********‘)
# print(Y_test)
# print(‘*********‘)
# print(X_train)
# print(‘*********‘)
# print(Y_train)
regressor = LinearRegression()
regressor = regressor.fit(X_train, Y_train)
Y_pred = regressor.predict(X_test)
print(Y_pred)
[52.33357604 16.89577953 60.20864193 34.61467779 33.63029455]

四、參數

用sklearn實現下嶺回歸吧。

官方英文文檔地址:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html

sklearn.linear_model提供了很多線性模型,包括嶺回歸、貝葉斯回歸、Lasso等。本文主要講解嶺回歸Ridge。

技術分享圖片

1、Ridge

讓我們先看下Ridge這個函數,一共有8個參數:

技術分享圖片

參數說明如下:

  • alpha:正則化系數,float類型,默認為1.0。正則化改善了問題的條件並減少了估計的方差。較大的值指定較強的正則化。
  • fit_intercept:是否需要截距,bool類型,默認為True。也就是是否求解b。
  • normalize:是否先進行歸一化,bool類型,默認為False。如果為真,則回歸X將在回歸之前被歸一化。 當fit_intercept設置為False時,將忽略此參數。 當回歸量歸一化時,註意到這使得超參數學習更加魯棒,並且幾乎不依賴於樣本的數量。 相同的屬性對標準化數據無效。然而,如果你想標準化,請在調用normalize = False訓練估計器之前,使用preprocessing.StandardScaler處理數據。
  • copy_X:是否復制X數組,bool類型,默認為True,如果為True,將復制X數組; 否則,它覆蓋原數組X。
  • max_iter:最大的叠代次數,int類型,默認為None,最大的叠代次數,對於sparse_cg和lsqr而言,默認次數取決於scipy.sparse.linalg,對於sag而言,則默認為1000次。
  • tol:精度,float類型,默認為0.001。就是解的精度。
  • solver:求解方法,str類型,默認為auto。可選參數為:auto、svd、cholesky、lsqr、sparse_cg、sag。
    • auto根據數據類型自動選擇求解器。
    • svd使用X的奇異值分解來計算Ridge系數。對於奇異矩陣比cholesky更穩定。
    • cholesky使用標準的scipy.linalg.solve函數來獲得閉合形式的解。
    • sparse_cg使用在scipy.sparse.linalg.cg中找到的共軛梯度求解器。作為叠代算法,這個求解器比大規模數據(設置tol和max_iter的可能性)的cholesky更合適。
    • lsqr使用專用的正則化最小二乘常數scipy.sparse.linalg.lsqr。它是最快的,但可能在舊的scipy版本不可用。它是使用叠代過程。
    • sag使用隨機平均梯度下降。它也使用叠代過程,並且當n_samples和n_feature都很大時,通常比其他求解器更快。註意,sag快速收斂僅在具有近似相同尺度的特征上被保證。您可以使用sklearn.preprocessing的縮放器預處理數據。
  • random_state:sag的偽隨機種子。

以上就是所有的初始化參數,當然,初始化後還可以通過set_params方法重新進行設定。

五、特別之處

  • 與分類一樣,回歸也是預測目標值的過程。回歸與分類的不同點在於,前者預測連續類型變量,而後者預測離散類型變量。
  • 嶺回歸是縮減法的一種,相當於對回歸系數的大小施加了限制。另一種很好的縮減法是lasso。lasso難以求解,但可以使用計算簡便的逐步線性回歸方法求的近似解。
  • 縮減法還可以看做是對一個模型增加偏差的同時減少方法

感謝:機器學習實戰教程:線性回歸基礎篇 | Jack Cui

機器學習-線性回歸