摘要:多變量線性回歸應(yīng)用場(chǎng)景目前為止,我們探討了單變量特征的回歸模型,現(xiàn)在我們對(duì)房?jī)r(jià)模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個(gè)含有多個(gè)變量的模型。
1 多變量線性回歸應(yīng)用場(chǎng)景
目前為止,我們探討了單變量/特征的回歸模型,現(xiàn)在我們對(duì)房?jī)r(jià)模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個(gè)含有多個(gè)變量的模型.。
1.1 單變量線性回歸案例模型: hθ(x) = θ0 + θ1x
1.2 多變量線性回歸案例模型:
新的概念
例如:
x(1) = [40, 1, 1, 10] x(2) = [96, 2, 1, 5] x(3) = [135, 3, 2, 20]
例如:
x(1)1 = 40 x(1)2 = 1 .......2 多元梯度下降法
模型:
參數(shù):
損失函數(shù):
梯度下降公式(重復(fù)執(zhí)行):
2.1 一元梯度下降n=1, 重復(fù)執(zhí)行,直到收斂import numpy as np # 1). 模擬數(shù)據(jù) X1 = 2 * np.random.randn(100, 1) X2 = 4 * np.random.rand(100, 1) X3 = 6 * np.random.rand(100, 1) y = 4 + 3 * X1 + 4 * X2 + 5 * X3 + np.random.randn(100, 1) # 2). 實(shí)現(xiàn)梯度下降算法 # np.c_是將數(shù)據(jù)組合成向量格式: (n, 1) (n,1) = (n, 2) X_b = np.c_[np.ones((100, 1)), X1, X2, X3] # 初始化theta的值, 需要計(jì)算四個(gè)theta的值; theta = np.random.randn(4, 1) # 設(shè)置學(xué)習(xí)率和收斂次數(shù) learning_rate = 0.1 n_iterations = 1000 # 根據(jù)公式計(jì)算 for iteration in range(n_iterations): # 梯度下降公式 = 1/樣本數(shù) * (預(yù)測(cè)值 - 真實(shí)值) *Xi gradients = 1 / 100 * X_b.T.dot(X_b.dot(theta) - y) # theta = theta - 學(xué)習(xí)率 * 梯度值 theta = theta - learning_rate * gradients print(theta)
代碼執(zhí)行結(jié)果:
3 梯度下降法實(shí)踐一:特征縮放 3.1 梯度下降法遇到的問(wèn)題在我們面對(duì)多維特征問(wèn)題的時(shí)候,我們要保證這些特征都具有相近的尺度,這將幫助梯度下降算法更快地收斂。而特征縮放是為了確保特征在一個(gè)數(shù)量級(jí)上。
以房?jī)r(jià)問(wèn)題為例,假設(shè)我們使用兩個(gè)特征,房屋的尺寸和房間的數(shù)量,其中x1 = 房屋面積(0-400 m2), x2 = 臥室數(shù)量(1-5), 以兩個(gè)參數(shù)分別為橫縱坐標(biāo),繪制代價(jià)函數(shù)的等高線圖能,看出圖像會(huì)顯得很扁,梯度下降算法需要非常多次的迭代才能收斂。
3.2 解決方法
解決方法一:
嘗試將所有特征的尺度都盡量縮放到-1到1之間。比如:
x1 = 房屋面積 / 400
x2 = 臥室數(shù)量 / 5
解決方法二: 平方均值法
在原來(lái)的基礎(chǔ)上把特征 xi 替換成 xi – μ;
也可以把最大值換成標(biāo)準(zhǔn)差,或者最大值 – 最小值。
4 梯度下降法實(shí)踐二: 學(xué)習(xí)率 4.1 梯度下降法遇到的問(wèn)題梯度下降算法收斂所需要的迭代次數(shù)根據(jù)模型的不同而不同,我們不能提前預(yù)知,我們可以繪制迭代次數(shù)和代價(jià)函數(shù)的圖表來(lái)觀測(cè)算法在何時(shí)趨于收斂。
梯度下降算法的每次迭代受到學(xué)習(xí)率的影響,
如果學(xué)習(xí)率過(guò)小,則達(dá)到收斂所需的迭代次數(shù)會(huì)非常高;
如果學(xué)習(xí)率過(guò)大,每次迭代可能不會(huì)減小代價(jià)函數(shù),可能會(huì)越過(guò)局部最小值導(dǎo)致無(wú)法收斂。
4.2 解決方法自動(dòng)測(cè)試是否收斂的方法,例如將代價(jià)函數(shù)的變化值與某個(gè)閥值(例如0.001)進(jìn)行比較,但通??瓷厦孢@樣的圖表更好。
嘗試在如下的數(shù)值中選擇α : …, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1,…
5 梯度下降算法補(bǔ)充 5.1 三種梯度下降總結(jié)如何選擇?
訓(xùn)練集比較?。?使用批梯度下降(小于2000個(gè))
訓(xùn)練集比較大:使用Mini-bitch梯度下降 一般的Mini-batch size 是64,128,256, 512,1024, Mini-batch size要適用CPU/GPU的內(nèi)存
5.2 隨機(jī)梯度下降隨機(jī)梯度下降思想:把m個(gè)樣本分成m份,每次用1份做梯度下降;也就是說(shuō),當(dāng)有m個(gè)樣本時(shí),批梯度下降只能做一次梯度下降,但是隨機(jī)梯度下降可以做m次。
實(shí)現(xiàn)代碼
import numpy as np import random X = 2 * np.random.rand(100, 1) Y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] # 每輪epochs處理m個(gè)樣本; n_epochs = 1000 # 學(xué)習(xí)率 a0 = 0.1 # 定義衰減率 decay_rate = 1 def learning_schedule(epoch_num): """ 定義一個(gè)學(xué)習(xí)率衰減的函數(shù) """ return (1.0 / (decay_rate * epoch_num + 1)) * a0 # 初始化theta值 theta = np.random.randn(2, 1) # 初始化隨機(jī)值 num = [i for i in range(100)] m = 100 for epoch in range(n_epochs): rand = random.sample(num, 100) for i in range(m): random_index = rand[i] xi = X_b[random_index:random_index + 1] yi = Y[random_index:random_index + 1] # 隨機(jī)梯度下降值 gradients = xi.T.dot(xi.dot(theta) - yi) # 學(xué)習(xí)率 learning_rate = learning_schedule(epoch+1) theta = theta - learning_rate * gradients print(theta)
執(zhí)行結(jié)果展示:
5.3 Mini-batch梯度算法隨機(jī)梯度下降會(huì)喪失向量帶來(lái)的加速,所以我們不會(huì)太用隨機(jī)梯度下降。
實(shí)現(xiàn)代碼
import numpy as np import random X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] # print(X_b) n_epochs = 500 a = 0.03 m = 100 num = [i for i in range(100)] theta = np.random.randn(2, 1) batch_num = 5 batch_size = m // 5 # epoch 是輪次的意思,意思是用m個(gè)樣本做一輪迭代 for epoch in range(n_epochs): # 生成100個(gè)不重復(fù)的隨機(jī)數(shù) for i in range(batch_num): start = i*batch_size end = (i+1)*batch_size xi = X_b[start:end] yi = y[start:end] gradients = 1/batch_size * xi.T.dot(xi.dot(theta)-yi) print(a) learning_rate = a theta = theta - learning_rate * gradients print(theta)
執(zhí)行結(jié)果展示:
5.4 Mini-batch梯度算法優(yōu)化: 學(xué)習(xí)率衰減在做Mini-batch的時(shí)候,因?yàn)樵肼暤脑?,可能?xùn)練結(jié)果不是收斂的,而是在最低點(diǎn)周圍晃動(dòng),如果我們要解決這個(gè)問(wèn)題,那我們就需要減少學(xué)習(xí)率,讓他在盡量小的范圍內(nèi)晃動(dòng)
1 epoch = 1 次遍歷所有的數(shù)據(jù)
學(xué)習(xí)率衰減公式:
實(shí)現(xiàn)代碼
import numpy as np import random X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] # print(X_b) n_epochs = 500 t0, t1 = 5, 50 m = 100 num = [i for i in range(100)] def learning_schedule(t): return float(t0) / (t + t1) theta = np.random.randn(2, 1) batch_num = 5 batch_size = m // 5 # epoch 是輪次的意思,意思是用m個(gè)樣本做一輪迭代 for epoch in range(n_epochs): # 生成100個(gè)不重復(fù)的隨機(jī)數(shù) for i in range(batch_num): start = i*batch_size end = (i+1)*batch_size xi = X_b[start:end] yi = y[start:end] gradients = 1/batch_size * xi.T.dot(xi.dot(theta)-yi) learning_rate = learning_schedule(epoch*m + i) theta = theta - learning_rate * gradients print(theta)
執(zhí)行結(jié)果展示:
6 特征和多項(xiàng)式回歸 6.1 過(guò)擬合的問(wèn)題過(guò)擬合的問(wèn)題出現(xiàn)在變量(θ)過(guò)多的時(shí)候,這時(shí)候我們沒(méi)有更多的數(shù)據(jù)去擬合模型,雖然損失函數(shù)的值基本接近于0。
6.2 過(guò)擬合的解決方法:減少特征的數(shù)量(一般不用)
1)手動(dòng)選擇特征數(shù)
2)模型選擇
正則化(特征縮放)
保留所有特征,但是減少量級(jí)或者參數(shù)θ_j的大小
房?jī)r(jià)預(yù)測(cè)時(shí), 假設(shè)我們不知道房屋面積,但是知道房屋的長(zhǎng)寬。
模型設(shè)計(jì):
hθ(x) = θ0 + θ1 x 房屋的長(zhǎng)度 + θ2 x 房屋的寬度
特征未縮放圖形展示
特征縮放圖形展示
注:如果我們采用多項(xiàng)式回歸模型,在運(yùn)行梯度下降算法前,特征縮放非常有必要。
如何不想要theta3和theta4?
首先, 我們可以在損失函數(shù)中,加入關(guān)于theta3和theta4的項(xiàng), 迫使若損失函數(shù)想要最小化, 必須讓theta3和theta4盡可能的小。
然后正則化, 公式如下圖:
6.4 L1 正則和 L2 正則的區(qū)別L1 會(huì)趨向于減少特征值
L2 會(huì)趨向于保留特征值
7 正則化算法與代碼實(shí)現(xiàn) 7.1 Ridge(嶺)回歸 7.1.1 算法理解 7.1.2 實(shí)現(xiàn)公式 7.1.3 代碼實(shí)現(xiàn)兩種實(shí)現(xiàn)嶺回歸的方法:
""" 嶺回歸 方法一: 嶺回歸運(yùn)用了L2正則化 """ import numpy as np from sklearn.linear_model import Ridge from sklearn.linear_model import SGDRegressor X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # alpha是懲罰項(xiàng)里的alpha, solver處理數(shù)據(jù)的方法,auto是根據(jù)數(shù)據(jù)自動(dòng)選擇,svd是解析解,sag就是隨機(jī)梯度下降 ridge_reg = Ridge(alpha=1, solver="auto") # 學(xué)習(xí)過(guò)程 ridge_reg.fit(X, y) # 預(yù)測(cè) print(ridge_reg.predict([[1.5], [2], [2.5]])) # 打印截距 print(ridge_reg.intercept_) # 打印系數(shù) print(ridge_reg.coef_) """ 方法二: 嶺回歸和sgd & penalty=2是等價(jià)的 """ sgd_reg = SGDRegressor(penalty="l2") sgd_reg.fit(X, y.ravel()) print(sgd_reg.predict([[1.5], [2], [2.5]])) # 打印截距 print("W0=", sgd_reg.intercept_) # 打印系數(shù) print("W1=", sgd_reg.coef_)7.2 Lasso(拉索)回歸 7.2.1 算法理解 7.2.2 實(shí)現(xiàn)公式 7.2.3 代碼實(shí)現(xiàn)
""" Lasso 回歸 Lasso用的是l1的正則化 """ import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegressor X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) lasso_reg = Lasso(alpha=0.15) lasso_reg.fit(X, y) print(lasso_reg.predict([[1.5]])) print(lasso_reg.coef_) sgd_reg = SGDRegressor(penalty="l1", n_iter=1000) sgd_reg.fit(X, y.ravel()) print(sgd_reg.predict([[1.5]])) print(sgd_reg.coef_)7.3 Elastic Net回歸 7.3.1 算法理解 7.3.2 實(shí)現(xiàn)公式 7.3.3 代碼實(shí)現(xiàn)
import numpy as np from sklearn.linear_model import ElasticNet X = 2 * np.random.rand(100, 1) Y = 4 + 3 * X + np.random.randn(100, 1) elastic_reg = ElasticNet(alpha=0.15, l1_ratio=0.5) elastic_reg.fit(X, Y) print(elastic_reg.predict([[1.5]])) print(elastic_reg.coef_) print(elastic_reg.intercept_) from sklearn.linear_model import SGDRegressor elastic_reg = SGDRegressor(penalty="elasticnet") elastic_reg.fit(X, Y) print(elastic_reg.predict([[1.5]])) print(elastic_reg.coef_)8 正規(guī)方程和梯度下降比較
梯度下降:
需要選擇合適的α
需要多次迭代
當(dāng)n很大時(shí),效果很好
正規(guī)方程:
不需要選擇學(xué)習(xí)率a
不需要迭代
需要計(jì)算X的轉(zhuǎn)置乘X整體的逆
當(dāng)n很大時(shí),計(jì)算很慢
總結(jié):根據(jù)經(jīng)驗(yàn),當(dāng)特征數(shù)量到10000的時(shí)候,是會(huì)換成梯度下降比較好
8.1 多項(xiàng)式回歸的梯度下降代碼import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression # 1). 數(shù)據(jù)準(zhǔn)備; # 樣本數(shù) m = 100 X = 6 * np.random.randn(m, 1) - 3 Y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1) # 2). 處理 # 2-1). 將一個(gè)高階方程轉(zhuǎn)化為一個(gè)一階方程;(多元線性回歸) # degree:用幾維處理數(shù)據(jù); poly_features = PolynomialFeatures(degree=2, include_bias=False) # fit_transform === fit() + transform(), 其中transform就是用來(lái)做歸一化的; X_poly = poly_features.fit_transform(X, Y) # 2-2). 處理一階方程 line_reg = LinearRegression() line_reg.fit(X_poly, Y) print(line_reg.coef_) print(line_reg.intercept_)8.2 不同維度繪制的圖形
import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression # 1). 數(shù)據(jù)準(zhǔn)備; # 樣本數(shù) m = 100 X = 6 * np.random.randn(m, 1) - 3 Y = 7 * X ** 2 + 5 *X + 2 + np.random.randn(m, 1) # plt.plot(X, Y, "b.") # plt.show() # 設(shè)置圖像維度及線條的字體顯示 d = {1: "g-", 2: "r.", 10: "y*"} # d = {2: "g-"} for i in d: # 2). 處理 # 2-1). 將一個(gè)高階方程轉(zhuǎn)化為一個(gè)一階方程;(多元線性回歸) # degree:用幾維處理數(shù)據(jù); poly_features = PolynomialFeatures(degree=i, include_bias=False) # fit_transform === fit() + transform(), 其中transform就是用來(lái)做歸一化的; X_poly = poly_features.fit_transform(X) print(X_poly) # 2-2). 處理一階方程 line_reg = LinearRegression() line_reg.fit(X_poly, Y) print(line_reg.coef_) print(line_reg.intercept_) y_predict = line_reg.predict(X_poly) plt.plot(X_poly[:, 0], y_predict, d[i]) plt.show()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19984.html
摘要:多變量線性回歸應(yīng)用場(chǎng)景目前為止,我們探討了單變量特征的回歸模型,現(xiàn)在我們對(duì)房?jī)r(jià)模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個(gè)含有多個(gè)變量的模型。 1 多變量線性回歸應(yīng)用場(chǎng)景 目前為止,我們探討了單變量/特征的回歸模型,現(xiàn)在我們對(duì)房?jī)r(jià)模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個(gè)含有多個(gè)變量的模型.。 1.1 單變量線性回歸案例 模型: hθ(x) = θ0 + θ1x showIm...
摘要:貢獻(xiàn)者飛龍版本最近總是有人問(wèn)我,把這些資料看完一遍要用多長(zhǎng)時(shí)間,如果你一本書(shū)一本書(shū)看的話,的確要用很長(zhǎng)時(shí)間。為了方便大家,我就把每本書(shū)的章節(jié)拆開(kāi),再按照知識(shí)點(diǎn)合并,手動(dòng)整理了這個(gè)知識(shí)樹(shù)。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...
摘要:機(jī)器學(xué)習(xí)線性回歸原理介紹機(jī)器學(xué)習(xí)線性回歸實(shí)現(xiàn)機(jī)器學(xué)習(xí)線性回歸實(shí)現(xiàn)這里使用實(shí)現(xiàn)線性回歸,沒(méi)有使用等機(jī)器學(xué)習(xí)框架,目的是幫助理解算法的原理。單變量和雙變量的使用的自己模擬的一個(gè)簡(jiǎn)單的房?jī)r(jià)數(shù)據(jù)集,多變量的使用的房?jī)r(jià)數(shù)據(jù)集。 【機(jī)器學(xué)習(xí)】線性回歸原理介紹 【機(jī)器學(xué)習(xí)】線性回歸python實(shí)現(xiàn) 【機(jī)器學(xué)習(xí)】線性回歸sklearn實(shí)現(xiàn) 這里使用python實(shí)現(xiàn)線性回歸,沒(méi)有使用sklearn等...
閱讀 1423·2021-11-22 09:34
閱讀 1386·2021-09-22 14:57
閱讀 3418·2021-09-10 10:50
閱讀 1407·2019-08-30 15:54
閱讀 3698·2019-08-29 17:02
閱讀 3483·2019-08-29 12:54
閱讀 2622·2019-08-27 10:57
閱讀 3328·2019-08-26 12:24