線性回歸的定義是:目標值預期是輸入變量的線性組合。線性模型形式簡單、易於建模,但卻蘊含着機器學習中一些重要的基本思想。線性回歸,是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法,運用十分廣泛。
單變量線性回歸:涉及到的變量只有一個。例如:預測房價例子中房子的大小預測房子的價格。f(x) = w1*x+w0,這樣通過主要參數w1就可以得出預測的值。通用公式為:
多變量線性回歸:涉及到的變量兩個或者兩個以上。例如:瓜的好壞程度 f(x) = w0+0.2色澤+0.5根蒂+0.3*敲聲
,得出的值來判斷一個瓜的好與不好的程度。通用公式為:
線性回歸的通用公式如下:
線性模型中的向量W值,客觀的表達了各屬性在預測中的重要性,因此線性模型有很好的解釋性。對於這種“多特征預測”也就是(多元線性回歸),那么線性回歸就是在這個基礎上得到這些W的值,然后以這些值來建立模型,預測測試數據。簡單的來說就是學得一個線性模型以盡可能准確的預測實值輸出標記。
那么如果對於多變量線性回歸來說我們可以通過向量的方式來表示W值與特征X值之間的關系:
兩向量相乘,結果為一個整數是估計值,其中所有特征集合的第一個特征值x_0x0=1,那么我們可以通過通用的向量公式來表示線性模型:
一個列向量的轉置與特征的乘積,得出我們預測的結果,但是顯然我們這個模型得到的結果可定會有誤差,如下圖所示:
單變量:
多變量:
損失函數
損失函數是一個貫穿整個機器學習重要的一個概念,大部分機器學習算法都會有誤差,我們得通過顯性的公式來描述這個誤差,並且將這個誤差優化到最小值。
對於線性回歸模型,將模型與數據點之間的距離差之和做為衡量匹配好壞的標准,誤差越小,匹配程度越大。我們要找的模型就是需要將f(x)和我們的真實值之間最相似的狀態。於是我們就有了誤差公式,模型與數據差的平方和最小(最小二乘法):
上面公式定義了所有的誤差和,那么現在需要使這個值最小?那么有兩種方法,一種使用梯度下降算法,另一種使正規方程解法(只適用於簡單的線性回歸)。
單變量損失函數直觀圖:
正規方程
缺點:當特征過於復雜時,求解速度太慢。
對於復雜的算法,不能使用正規方程求解。
梯度下降
我們以單變量中的w0,w1為例子:
理解:沿着這個函數下降的方向找,最后就能找到山谷的最低點,然后更新W值
sklearn線性回歸正規方程、梯度下降API
sklearn.linear_model.LinearRegression()
- 普通最小二乘線性回歸
- coef_:回歸系數
sklearn.linear_model.SGDRegressor( )
- 通過使用SGD最小化線性模型
- coef_:回歸系數
波士頓房價預測:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
lb = load_boston()
# 分隔數據集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 特征工程-標准化
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目標值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# 正則方程求解預測結果
lr = LinearRegression()
lr.fit(x_train, y_train)
print(lr.coef_)
# 預測的價格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("使用正規方程每個房子的預測價格:", y_lr_predict)
# 使用梯度下降進行預測
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(lr.coef_)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("使用梯度下降預測的房子價格:", y_sgd_predict)
回歸性能評估
對於不同的類別預測,我們不能苛刻的要求回歸預測的數值結果要嚴格的與真實值相同。一般情況下,我們希望衡量預測值與真實值之間的差距。因此,可以測評函數進行評價。其中最為直觀的評價指標均方誤差(Mean Squared Error)MSE,因為這也是線性回歸模型所要優化的目標。
MSE的計算方法如下:
sklearn回歸性能評估
mean_squared_error(y_true, y_pred)
- 均方誤差回歸損失
- y_true:真實值
- y_pred:預測值
- return:浮點數結果
對於前面預測波士頓房價的例子,對其回歸性能進行評估:
from sklearn.metrics import mean_squared_error
...
print("正規方程的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
...
print("梯度下降的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
結果:
正規方程的均方誤差: 25.14886868419582
梯度下降的均方誤差: 25.962570579781715
欠擬合與過擬合
機器學習中的泛化,泛化即是,模型學習到的概念在它處於學習的過程中時模型沒有遇見過的樣本時候的表現。在機器學習領域中,當我們討論一個機器學習模型學習和泛化的好壞時,我們通常使用術語:過擬合和欠擬合。我們知道模型訓練和測試的時候有兩套數據,訓練集和測試集。在對訓練數據進行擬合時,需要照顧到每個點,而其中有一些噪點,當某個模型過度的學習訓練數據中的細節和噪音,以至於模型在新的數據上表現很差,這樣的話模型容易復雜,擬合程度較高,造成過擬合。而相反如果值描繪了一部分數據那么模型復雜度過於簡單,欠擬合指的是模型在訓練和預測時表現都不好的情況,稱為欠擬合。
欠擬合例子:
經過訓練后,知道了天鵝是有翅膀的,天鵝的嘴巴是長長的。簡單的認為有這些特征的都是天鵝。因為機器學習到的天鵝特征太少了,導致區分標准太粗糙,不能准確識別出天鵝。
過擬合例子:
機器通過這些圖片來學習天鵝的特征,經過訓練后,知道了天鵝是有翅膀的,天鵝的嘴巴是長長的彎曲的,天鵝的脖子是長長的有點曲度,天鵝的整個體型像一個"2"且略大於鴨子。這時候機器已經基本能區別天鵝和其他動物了。然后,很不巧已有的天鵝圖片全是白天鵝的,於是機器經過學習后,會認為天鵝的羽毛都是白的,以后看到羽毛是黑的天鵝就會認為那不是天鵝。
過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合, 但是在訓練數據外的數據集上卻不能很好地擬合數據,此時認為這個假設出現了過擬合的現象。(模型過於復雜)
欠擬合:一個假設在訓練數據上不能獲得更好的擬合, 但是在訓練數據外的數據集上也不能很好地擬合數據,此時認為這個假設出現了欠擬合的現象。(模型過於簡單)
對線性模型進行訓練學習會變成復雜模型:
解決過擬合的方法
在線性回歸中,對於特征集過小的情況,容易造成欠擬合(underfitting),對於特征集過大的情況,容易造成過擬合(overfitting)。針對這兩種情況有了更好的解決辦法
欠擬合
原因:學習到數據的特征過少
解決辦法:增加數據的特征數量
過擬合
原因:原始特征過多,存在一些嘈雜特征, 模型過於復雜是因為模型嘗試去兼顧各個測試數據點
解決辦法:
- 進行特征選擇,消除關聯性大的特征(很難做)
- 交叉驗證(讓所有數據都有過訓練)
- 正則化
L2正則化
作用:可以使得W的每個元素都很小,都接近於0
優點:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象