09 線性回歸及矩陣運算
線性回歸
-
定義:通過一個或者多個自變數與因變數之間進行建模的回歸分析,其中可以為一個或者多個自變數之間的線性組合,
-
一元線性回歸:涉及到的變數只有一個
多元線性回歸:變數兩個或以上 -
通用公式:h(w) = w0 + w1x1 + w2x2 + ....= wTx
其中w,x 為矩陣:wT=(w0, w1, w2) x=(1,x1, x2)T
回歸的應用場景 (連續型資料)
- 房價預測
- 銷售額預測 (廣告,研發成本,規模等因素)
- 貸款額度
線性關系模型
- 定義: 通過屬性 (特征) 的線性組合來進行預測的函式:
- f(x) = w1x1 + w2x2 + w3x3 + ...... + wdxd + b
- w : weight (權重) b: bias (偏置項)
- 多個特征: (w1:房子的面積, w2:房子的位置 ..)
損失函式(誤差)
- 《統計學習方法》 - 演算法 ,策略, 優化
- 線性回歸, 最小二乘法,正規方程 & 梯度下降
- 損失函式(誤差大小)
- yi 為第i個訓練樣本的真實值
- hw(xi)為第i個訓練樣本特征值組合預測函式 (預測值)

- 尋找最優化的w
-
最小二乘法之正規方程 (直接求解到最小值,特征復雜時可能沒辦法求解)
- 求解:w= (xTx)-1 xTy
- X 為特征值矩陣,y為目標值矩陣
- 缺點: 特征過于復雜時,求解速度慢

-
最小二乘法之梯度下降

- 使用場景:面對訓練資料規模龐大的任務
- 超引數:a

-
線性回歸演算法案例
API
- sklearn.linear_model.LinealRegression()
- 普通最小二乘法線性回歸
- coef_: 回歸系數 (w值)
- sklearn.linear_model.SGDRegressir()
- 通過使用SGD最小化線性模型
- coef_: 回歸系數
- 不能手動指定學習率
波士頓房價預測
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
from sklearn.metrics import mean_squared_error
def mylinear():
"""
線性回歸預測房價
:return: None
"""
# 1. 獲取資料
lb = load_boston()
# 2. 分割資料集到訓練集和測驗集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train, y_test)
# 3. 進行標準化處理(特征值和目標值都必須標準化處理)
# 實體化兩個標準化API,特征值和目標值要用各自fit
# 特征值
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)
y_test = std_y.transform(y_test)
# 4. estimator預測
# 4.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)
print('正規方程的均方誤差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
# 4.1 梯度下降進行梯度預測
sgd = SGDRegressor()
lr.fit(x_train, y_train)
print(sgd.coef_)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print('梯度下降測驗集里面每個房子的預測價格:', y_sgd_predict)
print('梯度下降的均方誤差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
return None
if __name__ == '__main__':
mylinear()
回歸性能評估
均方誤差 (Mean Squared Error MSE) 評價機制
- mean_squared_error(y_true, y_pred)
- 真實值和預測值為標準化話之前的值

兩種預測方式的選擇
- 樣本量選擇
樣本量大于100K --> SGD 梯度下降
樣本量小于100K --> 其他
| **梯度下降 ** | **正規方程 ** |
|---|---|
| 需要選擇學習率 | 不需要 |
| 需要多次迭代 | 一次運算得出 |
| 當特征數量大時也能較好使用 | 需要計算(xTx)-1,運算量大 |
| 適用于各種型別的模型 | 只適用于線性模型 |
- 特點:線性回歸器是最為簡單、易用的回歸模型,在不知道特征之間關系的情況下,
可以使用線性回歸器作為大多數系統的首要選擇,LinearRegression 不能解決擬合問題,
過擬合與欠擬合
- 定義:
-
過擬合(overfitting):一個假設在訓練資料上能夠獲得比其他假設更好的擬合,但是在訓練資料外卻不能很好擬合,(模型過于復雜)
模型復雜的原因: 資料的特征和目標值之間的關系不僅僅是線性關系, -
欠擬合(underfitting):一個假設在訓練資料上不能獲得更好的擬合,但是在訓練資料外也不能很好的擬合, (模型過于簡單)

-
欠擬合原因及解決方法
- 原因: 學習到的資料特征過少
- 解決方法: 增加資料的特征數量
過擬合原因及解決方法
- 原因: 原始特征過多,存在一些嘈雜特征,模型過于復雜是因為模型嘗試去兼顧各個測驗資料點
- 解決方法:
- 進行特征選擇,消除關聯性很大的特征(人為排除,很難做)
- 交叉驗證(讓所有資料都有過訓練)- 檢驗但不能解決
- 正則化 :不斷嘗試,減少權重(高次項特征的影響)
- 特征選擇:
- 過濾式:低方差特征
- 嵌入式:正則化,決策樹,神經網路

(減少高指數項系數,趨近于0,減少權重)
L2正則化
- 作用:可以使得W的每個元素都很小,都接近于0
- 優點:越小的引數說明模型越簡單,越簡單的模型越不容易產生過擬合現象,
- 回歸解決過擬合的方式:
L2正則化, Ridge:嶺回歸:帶有正則化的線性回歸,解決過擬合,
Ridge API
sklearn.linear_model.Ridge(alpha=1.0)
- 具有L2正則化的線性最小二乘法
- alpha: 正則化力度 0~1(小數), 1~10(整數)
- coef_: 回歸系數
正則化力度對權重的影響 (力度越大,越趨向于0)

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
"""
線性回歸預測房價
:return: None
"""
# 1. 獲取資料
lb = load_boston()
# 2. 分割資料集到訓練集和測驗集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train, y_test)
# 3. 進行標準化處理(特征值和目標值都必須標準化處理)
# 實體化兩個標準化API,特征值和目標值要用各自fit
# 特征值
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)
y_test = std_y.transform(y_test)
# 4. estimator預測
# 4.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)
print('正規方程的均方誤差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
# 4.2 梯度下降進行梯度預測
sgd = SGDRegressor()
lr.fit(x_train, y_train)
print(sgd.coef_)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print('梯度下降測驗集里面每個房子的預測價格:', y_sgd_predict)
print('梯度下降的均方誤差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
# 4.3 嶺回歸預測
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
if __name__ == '__main__':
mylinear()
線性回歸LinearRegression 與 Ridge對比
嶺回歸:回歸得到的回歸系數更符合實際,更可靠,另外,能讓估計引數的波動范圍變小,變得更穩定,在存在病態資料偏多的研究中有較大的使用價值,
模型的保存與加載
sklearn API
sklearn.Externals import joblib
- 保存: joblib.dump(rf, 'test.pkl') - 保存的實體和路徑 , rf - 訓練生成的實體,檔案格式為pkl
- 加載: joblib.load( 'test.pkl') - 加載路徑
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.externals import joblib
def mylinear():
"""
線性回歸預測房價
:return: None
"""
# 1. 獲取資料
lb = load_boston()
# 2. 分割資料集到訓練集和測驗集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train, y_test)
# 3. 進行標準化處理(特征值和目標值都必須標準化處理)
# 實體化兩個標準化API,特征值和目標值要用各自fit
# 特征值
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)
y_test = std_y.transform(y_test)
# 4. estimator預測
# 4.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)
# print('正規方程的均方誤差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
# 保存訓練好的模型
joblib.dump(lr, './test.pkl')
# 匯出模型
model = joblib.load('./test.pkl')
y_predict = model.predict(x_test)
print('保存的模型預測的結果:', y_predict)
# # 4.2 梯度下降進行梯度預測
# sgd = SGDRegressor()
# lr.fit(x_train, y_train)
# print(sgd.coef_)
# y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
# print('梯度下降測驗集里面每個房子的預測價格:', y_sgd_predict)
# print('梯度下降的均方誤差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
#
# # 4.3 嶺回歸預測
# 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
if __name__ == '__main__':
mylinear()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/187958.html
標籤:其他
上一篇:MASK-RCNN(1)
