文章目錄
1.迴歸問題
1.1 線性模型
試圖學得一個通過屬性的線性組合來進行預測的函數:
- w爲權重,b稱爲偏置項,可以理解爲
1.2 線性迴歸
定義:線性迴歸通過一個或者多個自變量與因變量之問之間進行建模的迴歸分析。其中特點爲一個或多個稱爲迴歸係數的模型參數的線性組合
- 一元線性迴歸:涉及到的變量只有一個
- 多元線性迴歸:涉及到的變量兩個或兩個以上
通用公式:
其中,w,x爲矩陣:
預測結果與真實值是有一定的誤差
1.3 損失函數(誤差大小)
- 爲第i個訓練樣本的真實值
- 爲第i個訓練樣本特徵值組合預測函數
總損失定義:
如何去求模型當中的W,使得損失最小?
(目的是找到最小損失對應的W值)
-
最小二乘法之正規方程(不做要求)
X爲特徵值矩陣,y爲目標值矩陣
缺點:當特徵過於複雜,求解速度太慢;對於複雜的算法,不能使用正規方程求解(邏輯迴歸等) -
最小二乘法之梯度下降
以單變量中的爲例:
爲學習率,需要手動指定,
表示方向
理解:沿着這個函數下降的方向找,最後就能找到山谷的最低點,然後更新
Gamma公式展示 是通過 Euler integral
1.4 sklearn線性迴歸正規方程、梯度下降API
sklearn.linear_model.LinearRegression
正規方程
sklearn.linear_model.SGDRegressor
梯度下降
-
sklearn.linear_model.LinearRegression()
- 普通最小二乘線性迴歸
- coef_:迴歸係數
-
sklearn.linear_model.SGDRegressor( )
- 通過使用SGD最小化線性模型
- coef_:迴歸係數
1.5 波士頓房價數據案例分析
流程
1、波士頓地區房價數據獲取
2、波士頓地區房價數據分割
3、訓練與測試數據標準化處理
4、使用最簡單的線性迴歸模型LinearRegression和梯度下降估計SGDRegressor對房價進行預測
代碼
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def mylinear():
# 獲取數據
lb=load_boston()
#分割
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train,y_test)
#標準化(目標值需要標準化嗎?需要,否則x計算後與y差距很大,後續可通過inverse_transform轉換回來)
#實例化兩個標準化API
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_predict=std_y.inverse_transform(lr.predict(x_test))
print("測試集中房子預測價格:",y_predict)
return None
mylinear()
結果:
[[-0.07467382 0.07732555 0.02364533 0.0663568 -0.20713084 0.3195057
-0.00632141 -0.30715911 0.23733141 -0.19967829 -0.23709455 0.10231363
-0.37638967]]
測試集中房子預測價格: [[23.51063754]
[13.35629776]
[23.64063601]
...
[33.68088207]
[27.02842901]
[26.20574798]]
- 梯度下降預測
# SGD預測
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 預測測試集房子價格
y_predict = std_y.inverse_transform(sgd.predict(x_test))
print("測試集中房子預測價格:", y_predict)
結果:
[-0.05730963 0.01562689 -0.03388252 0.07846016 -0.07653516 0.36513421
-0.01739758 -0.1860541 0.06181751 -0.04777769 -0.20958852 0.09646331
-0.32850719]
測試集中房子預測價格: [23.28695233 12.3593322 22.85129124
...
31.26093941 25.81228545
26.37901119]
1.6 迴歸性能評估
(均方誤差(Mean Squared Error)MSE) 評價機制:
sklearn迴歸評估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true,y_pred)
- 均方誤差迴歸損失
- y_true:真實值
- y_pred:預測值
- return:浮點數結果
注:真實值,預測值爲標準化之前的值
實例
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正規方程均方誤差:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("梯度下降均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
結果:
正規方程均方誤差: 32.10789269504813
梯度下降均方誤差: 33.79175991934641
1.7 LinearRegression與SGDRegressor評估
線性迴歸器是最爲簡單、易用的迴歸模型。
從某種程度上限制了使用,儘管如此,在不知道特徵之
間關係的前提下,我們仍然使用線性迴歸器作爲大多數
系統的首要選擇。
- 小規模數據:LinearRegression(不能解決擬合問題)以及其它
- 大規模數據:SGDRegressor
2.過擬合與欠擬合
2.1 概念
過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合
, 但是在訓練數據外的數據集上卻不能很好地擬合數據
,此時認爲這個假設出現了過擬合的現象。(模型過於複雜)
欠擬合:一個假設在訓練數據上不能獲得更好的擬合
, 但是在訓練數據外的數據集上也不能很好地擬合數據
,此時認爲這個假設出現了欠擬合的現象。(模型過於簡單)
2.2 欠擬合原因以及解決辦法
-
原因:
學習到數據的特徵過少 -
解決辦法:
增加數據的特徵數量
2.3 過擬合原因以及解決辦法
-
原因:
原始特徵過多,存在一些嘈雜特徵,模型過於複雜是因爲模型嘗試去兼顧各個測試數據點 -
解決辦法:
- 進行特徵選擇,消除關聯性大的特徵(很難做)
- 交叉驗證(讓所有數據都有過訓練)
- 正則化(瞭解)
特徵選擇:過濾式:低⽅差特徵
嵌⼊式:正則化,決策樹,神經⽹絡
2.4 L2正則化
-
作用:可以使得W的每個元素都很小,都接近於0;儘量減小高次項特徵的影響
-
優點:越小的參數說明模型越簡單,越簡單的模型則越不
容易產生過擬合現象
2.5 帶有正則化的線性迴歸-Ridge
sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)
- 具有l2正則化的線性最小二乘法
- alpha:正則化力度
- coef_:迴歸係數
正則化程度越高,權重越趨近於零
** 案例**
from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
# 獲取數據
lb=load_boston()
#分割
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train,y_test)
#標準化(目標值需要標準化嗎?需要,否則x計算後與y差距很大,後續可通過inverse_transform轉換回來)
#實例化兩個標準化API
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))
# 預測
#嶺迴歸預測
rd=Ridge(alpha=1.0)
rd.fit(x_train,y_train)
print(rd.coef_)
y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
print("測試集中房子預測價格:", y_rd_predict)
print("嶺迴歸均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
return None
mylinear()
測試集中房子預測價格: [[29.79041118]
[17.95605696]
[21.78228781]
...
[14.1836944 ]
[17.7654579 ]
[14.96521967]]
嶺迴歸均方誤差: 27.738423019827078
2.6 LinearRegression與Ridge對比
-
嶺迴歸:迴歸得到的迴歸係數更符合實際,更可靠。另外,能讓估計參數的波動範圍變小,變的更穩定。在存在病態數據偏多的研究中有較大的實用價值。
-
線性迴歸:LInearRegression 容易出現過擬合