文章目錄
- 一、線性回歸
- 1、簡介
- 1.1 應用場景
- 1.2 定義
- 1.3 線性回歸的特征與目標的關系分析
- 1.3.1 線性關系
- 1.3.2 非線性關系
- 2、線性回歸API
- 2.1 API
- 2.2 步驟分析
- 2.3 案例
- 3、求導
- 4、損失和優化
- 4.1 損失函式
- 4.2 優化演算法
- 4.2.1 正規方程
- 4.2.2 梯度下降
- 4.2.3 梯度下降對比正規方程
- 4.2.4 API
- 5、梯度下降
- 5.1 全梯度下降(FG)
- 5.2 隨機梯度下降(SG)
- 5.3 小批量梯度下降演算法(mini-bantch)
- 5.4 隨機平均梯度下降演算法(SAG)
- 5.5 演算法比較
- 5.6 梯度下降優化演算法
- 5.6.1 動量法
- 5.6.2 Nesterov加速梯度下降法
- 5.6.3 Adagrad
- 5.6.4 Adadelta
- 5.6.5 RMSProp
- 5.6.6 Adam
- 6、線性回歸API
- 6.1 `sklearn.linear. _model.LinearRegression(fit jintercept=True)`
- 6.1 `sklearn.linear. model.SGDRegressor(loss="squared_ loss", fit_ jintercept=True, learning. _rate='invscaling', eta0=0.01)`
- 7、回歸性能評估
- 7.1 API
- 8、案例
- 9、欠擬合和過擬合
- 9.1 定義
- 9.2 原因及如何解決
- 9.3 正則化(限制高次項)
- 9.3.1 類別
- 9.3.2 正則化線性模型
- 10、維災難
- 10.1 介紹
- 11、嶺回歸
- 11.1 `sklearn.linear_ model.Ridge(alpha=1.0, fit. fit_intercept=True,solver="auto", normalize=False)`
- 11.2 正則化程度影響
- 12、模型保存與加載
- 12.1 API
一、線性回歸
1、簡介
1.1 應用場景
- 房價預測
- 銷售額度預測
- 貨款額度預測
1.2 定義
- 定義:利用回歸方程對一個或多個自變數(特征)和因變數(目標值)之間關系進行建模;
- 特點:一個自變數為變數回歸,多個自變數為多元回歸;

1.3 線性回歸的特征與目標的關系分析
具有線性和非線性關系,
1.3.1 線性關系
單變數線性關系

多變數線性關系

1.3.2 非線性關系

2、線性回歸API
2.1 API
sklearn.linear_model.LinearRegression()
LinearReggression.coef_:回歸系數;
2.2 步驟分析
- 獲取資料集
- 資料基本處理
- 特征工程
- 機器學習
- 模型評估
2.3 案例
# -*- coding: utf-8 -*-
""" @Time : 2021/7/31 16:28
@Author : XXX
@Site :
@File : linearRegressionDemo.py
@Software: PyCharm
"""
from sklearn.linear_model import LinearRegression
x = [
[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80]
]
y = [84.2, 80.6, 80.1, 90, 83.2,87.6,79.4]
estimator = LinearRegression()
estimator.fit(x,y)
_coef = estimator.coef_
print(_coef)
3、求導


4、損失和優化
4.1 損失函式

- yi為第i個訓練樣本的真實值;
- h(xi)為第i個訓練樣本特征值組合預測函式;
- 又稱最小二乘法
- y為真實矩陣,X是特征矩陣,w是權重矩陣
4.2 優化演算法
目的:找到最小損失對應的w值;
4.2.1 正規方程
公式:
w = (X^T * X)^-1 * X^T * y
- X為特征值矩陣,y為目標值矩陣;
- 缺點:當特征過多過復雜時,求解速度太慢且得不到結果,只適合樣本和特征較少的,
推導

4.2.2 梯度下降
原理:尋找最陡峭的位置,向高度向下的地方走,

概念
- 在單變數函式中,梯度就是函式的微分,代表函式在某個給定的切線的斜率;
- 在多變數函式值,梯度是一個向量,梯度的方向是給定點上升最快的方向,后沿著梯度方向走,


公式:

α:學習率或步長,控制每一步的距離,保證不大不小,太大易錯過最低點,太小速度太慢;梯度加個負號:梯度方向是上升最快的地方,我們要向下走,反向的所以要加個負號;

4.2.3 梯度下降對比正規方程
| 梯度下降 | 正規方程 |
|---|---|
| 需要選擇學習率 | 不需要 |
| 需要迭代求解 | 一次運算得出 |
| 特征數量較大可用 | 需計算方程,時間復雜度O(n3) |
4.2.4 API
小規模資料:
LinearRegression:不能解決擬合問題,嶺回歸;
大資料規模:
SGDRegressor
5、梯度下降
5.1 全梯度下降(FG)
計算所有樣本的誤差平均值,作為目標函式,
5.2 隨機梯度下降(SG)
每次只選擇一個樣本進行計算,
5.3 小批量梯度下降演算法(mini-bantch)
選擇一部分資料,
5.4 隨機平均梯度下降演算法(SAG)
會給每一個樣本都維持一個平均值,
5.5 演算法比較

- FG由于它每輪更新都要使用全體資料集,故花費時間成本最多,記憶體存盤最大;
- SAG優化速度較慢
5.6 梯度下降優化演算法
5.6.1 動量法
- 是SAG的姐妹版;
- SAG是對過去K次的梯度求平均值;
- SAG是對過去所有的梯度求加權平均,
5.6.2 Nesterov加速梯度下降法
- 類似于一個
智能球,在重新遇到斜率上升時候,能夠知道減速,
5.6.3 Adagrad
- 讓
學習率使用引數;- 對于出現
次數較少的特征,我們對其采用更大的學習率,對于出現次數較多的特征,我們對其采用較小的學習率,
5.6.4 Adadelta
- Adadelta是Adagrad的一 種擴展演算法,以
處理Adagrad學習速率單調遞減的問題,
5.6.5 RMSProp
- 其結合了梯度
平方的指數移動平均數來調節學習率的變化,- 能夠在不穩定(Non-Stationary) 的目標函式情況下進行很好地收斂,
5.6.6 Adam
- 結合AdaGrad和RMSProp兩種優化演算法的優點,
- 是一種
自適應的學習率演算法
6、線性回歸API
6.1 sklearn.linear. _model.LinearRegression(fit jintercept=True)
- 通過正規方程優化
fit_ _intercept: 是否計算偏置LinearRegression.coef:回歸系數LinearRegression.intercept:偏置
6.1 sklearn.linear. model.SGDRegressor(loss="squared_ loss", fit_ jintercept=True, learning. _rate='invscaling', eta0=0.01)
SGDRegressor類實作了隨機梯度下降學習,它支持不同的loss函式和正則化懲罰項來擬合線性回
歸模型,loss:損失型別
loss="squared_ loss": 普通最小二乘法fit _intercept:是否計算偏置learning_ rate: string, optional
- 學習率填充
constant: eta = eta0optimal: eta = 1.0/ (alpha * (t + to)) [default]invscaling: eta = eta0 / pow(t, power, _t)power_ _t=0.25:存在父類當中- 對于一個常數值的學習率來說,可以使用learning. _rate=‘constant’,并使用eta0來指定學
習率,SGDRegressor.coef_:回歸系數SGDRegressor.intercept:偏置
7、回歸性能評估

- yi:為預測值;
- y-:為真實值,
7.1 API
sklearn.metrics.mean_squared_error(y_true, y_pred):
- 均方誤差回歸損失;
y_true:真實值;y_pred:預測值;return:浮點數結果,
8、案例
# -*- coding: utf-8 -*-
""" @Time : 2021/08/02 16:24
@Author : XXX
@Site :
@File : 2.波士頓房價.py
@Software: PyCharm
"""
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
from sklearn.metrics import mean_squared_error
def model1():
"""線性回歸模型"""
# 獲取資料
data = load_boston()
# 資料基本處理
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)
# 特征工程
stand = StandardScaler()
x_train = stand.fit_transform(x_train)
x_test = stand.fit_transform(x_test)
# 建立模型
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 模型評估
pre = estimator.predict(x_test)
print("預測值:", pre)
score = estimator.score(x_test, y_test)
print("準確率:", score)
# 均方誤差
ret = mean_squared_error(y_test, pre)
print("均方誤差是", ret)
def model2():
"""梯度下降模型"""
# 獲取資料
data = load_boston()
# 資料基本處理
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)
# 特征工程
stand = StandardScaler()
x_train = stand.fit_transform(x_train)
x_test = stand.fit_transform(x_test)
# 建立模型
"""
squared_loss:指的是普通的最小二乘擬合,
huber:修改了squared_loss,減少了對例外值的關注經過一段距離后,由平方轉換為線性損耗進行校正ε,
epsilon_insensitive:忽略小于epsilon的錯誤線性的過去; 這是SVR中用到的損失函式,
squared_epsilon_insensitive:是相同的,但成為平方損失過去的容差,
"""
estimator = SGDRegressor(learning_rate='constant', random_state=20)
estimator.fit(x_train, y_train)
# 模型評估
pre = estimator.predict(x_test)
print("預測值:", pre)
score = estimator.score(x_test, y_test)
print("準確率:", score)
# 均方誤差
ret = mean_squared_error(y_test, pre)
print("均方誤差是", ret)
if __name__ == '__main__':
model1()
model2()
9、欠擬合和過擬合
9.1 定義
過擬合:一個假設在訓練資料上能夠獲得
比其他假設更好的擬合,但是在測驗資料集上卻不能很好地 擬合資料,此時認為這個假設出現了過擬合的現象,(模型過于復雜),
欠擬合:一個假設在訓練資料上
不能獲得更好的擬合,并且在測驗資料集上也不能很好地擬合資料,
此時認為這個假設出現了欠擬合的現象,(模型過于簡單),

9.2 原因及如何解決
欠擬合原因以及解決辦法
- 原因:學習到資料的特征過少,
- 解決辦法:
添加其他特征項,有時候我們模型出現欠擬合的時候是因為特征項不夠導致的,可以添加其他特征項來很好地解決,例如,“組合"、 “泛化"、“相關性”三類特征是特征添加的重要手段,無論在什么場景,都可以照葫蘆畫瓢,總會得到意想不到的效果,除上面的特征之外,“背景關系特征”、“平臺特征"等等,都可以作為特征添加的首選項,添加多項式特征,這個在機器學習演算法里面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強,
過擬合原因以及解決辦法
- 原因:原始
特征過多,存在一些嘈雜特征, 模型過于復雜是因為模型嘗試去兼顧各個測驗資料點,- 解決辦法:
重新清洗資料,導致過擬合的一一個原因也有可能是資料不純導致的,如果出現了過擬合就需要我們重新清洗資料,增大資料的訓練量,還有一個原因就是我們用于訓練的資料量太小導致的,訓練資料占總資料的比例過小,正則化,- 減少特征維度,防止
維災難,
9.3 正則化(限制高次項)
- 在學習的時候,資料提供的特征有些
影響模型復雜度或者這個特征的資料點例外較多,所以演算法在學習的
時候盡量減少這個特征的影響(甚至洗掉某個特征的影響),這就是正則化,- 調整時候,演算法并不知道某個特征影響,而是去調整引數得出優化的結果,

9.3.1 類別
L2正則化
- 作用:可以使得其中一些W的都很小,都接近于0,
削弱某個特征的影響;- 優點:
越小的引數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象;Ridge回歸,
L1正則化
- 作用:可以使得其中一些
W的值直接為0,洗掉這個特征的影響;LASSO回歸,
9.3.2 正則化線性模型
- Ridge Regression嶺回歸
- Lasso回歸
- Elastic Net彈性網路
- Early stopping
Ridge Regression嶺回歸
- 嶺回歸是線性回歸的正則化版本,在原來的線性回歸的cost function中添加正則項,
也就是系數前面加上平方項,在限制系數的大小,α值越小,系數越大,

在達到擬合資料的同時,使模型權重盡可能小的目的,嶺回歸代價函式:

α=0:嶺回歸退化為線性回歸,
Lasso回歸

- 該代價函式中
θi=0處是不可導的;- 可在該處使用一個
次梯度向量,

Elastic Net彈性網路
在嶺回歸和Lasso回歸進行折中,通過混合比r進行控制,
r = 0:彈性網路變為嶺回歸;r = 1:彈性網路變為Lasso回歸,

Early stopping
10、維災難
10.1 介紹
隨著維度增加,分類器性能逐步上升,達到某點后,其性能逐漸下降,

11、嶺回歸
11.1 sklearn.linear_ model.Ridge(alpha=1.0, fit. fit_intercept=True,solver="auto", normalize=False)
- 具有L2正則化的線性回歸;
alpha:正則化力度, 也叫λ;
- λ取值:0~1 1~10;
solver:會 根據資料自動選擇優化方法;
sag:如果資料集、特征都比較大,選擇該隨機梯度下降優化;normalize:資料是否進行標準化;
normalize=False:可以在fit之 前呼叫preprocessing.StandardScaler標準化資料;Ridge.coef_:回歸權重;Ridge.intercept:回歸偏置;
Ridge方法相當于SGDRegressor(penalty='l2', loss="squared_ loss"),只不過SGDRegressor實作 了一
個普通的隨機梯度下降學習,推薦使用Ridge(實作了SAG):
sklearn.inear. _model.RidgeCV( BaseRidgeCV, RegressorMixin)- 具有
L2正則化的線性回歸,可以進行交叉驗證- coef_ :回歸系數
11.2 正則化程度影響

- 正則化力度越大,權重系數越小;
- 正則化力度越小,權重系數越大;
12、模型保存與加載
12.1 API
sklearn.eaternals.joblib
- 保存:joblib.dump(estimator, ‘test.pkl’)
- 加載:joblib.load(‘test.pkl’)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291777.html
標籤:AI
上一篇:QLabelCV——專門給OpenCV做的PyQt QLabel控制元件
下一篇:網路安全學習路線是怎樣的?
