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