導(dǎo)入所需的庫
import numpy as np
np.set_printoptions(precision=2)
import matplotlib.pyplot as plt
dlblue = '#0096ff'; dlorange = '#FF9300'; dldarkred='#C00000'; dlmagenta='#FF40FF'; dlpurple='#7030A0';
plt.style.use('./deeplearning.mplstyle')
from lab_utils_multi import load_house_data, compute_cost, run_gradient_descent
from lab_utils_multi import norm_plot, plt_contour_multi, plt_equal_scale, plot_cost_i_w
1、數(shù)據(jù)集
Size (sqft) | Number of Bedrooms | Number of floors | Age of Home | Price (1000s dollars) |
---|---|---|---|---|
952 | 2 | 1 | 65 | 271.5 |
1244 | 3 | 2 | 64 | 232 |
1947 | 3 | 2 | 17 | 509.8 |
… | … | … | … | … |
利用以上表格中的數(shù)據(jù)構(gòu)建一個線性模型,這樣我們可以預(yù)測房屋的價格(1200 sqft, 3 bedrooms, 1 floor, 40 years old)
# load the dataset
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']
繪制每個房子特征與房屋價格之間的關(guān)系圖
fig,ax=plt.subplots(1, 4, figsize=(12, 3), sharey=True)
for i in range(len(ax)):
ax[i].scatter(X_train[:,i],y_train)
ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("Price (1000's)")
plt.show()
對每個特征與目標變量(價格)進行繪圖可以提供一些關(guān)于哪些特征對價格有最強影響的線索。如上所述,增加房屋面積也會增加價格。而臥室數(shù)和樓層數(shù)似乎對價格影響不大。新房比舊房價格更高。
2、學(xué)習(xí)率
設(shè)置不同的學(xué)習(xí)率進行梯度下降,觀察一下的結(jié)果
2.1 α \alpha α = 9.9e-7
#set alpha to 9.9e-7
_, _, hist = run_gradient_descent(X_train, y_train, 10, alpha = 9.9e-7)
運行過程:
看起來學(xué)習(xí)率太高了。解決方案沒有收斂。損失在增加而不是減少,繪制結(jié)果可視化:
plot_cost_i_w(X_train, y_train, hist)
右側(cè)的圖顯示了參數(shù)
w
0
w_0
w0? 的值。在每次迭代中,它超過了最優(yōu)值,結(jié)果導(dǎo)致成本增加而不是接近最小值。需要注意的是,這不是一個完全準確的圖,因為每次迭代時有4個參數(shù)被修改,而不僅僅是一個。該圖僅顯示了
w
0
w_0
w0? 的值,其他參數(shù)被設(shè)定為一些良好的值。在這個圖和后面的圖中,可能會注意到藍線和橙線略有偏差。
2.2 α \alpha α = 9e-7
#set alpha to 9e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 9e-7)
損失在整個運行過程中都在減少,這表明學(xué)習(xí)率 α \alpha α 不是太大。
plot_cost_i_w(X_train, y_train, hist)
在左圖中,可以看到損失在逐漸減少,這是預(yù)期的結(jié)果。在右圖中,可以看到
w
0
w_0
w0? 仍然在最小值周圍振蕩,但每次迭代它都在減小,而不是增加。dj_dw[0]
在每次迭代中改變符號,因為 w[0]
跳過了最優(yōu)值。
2.3 α \alpha α = 1e-7
#set alpha to 1e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 1e-7)
plot_cost_i_w(X_train,y_train,hist)
在左圖中,可以看到損失在逐漸減少,這是預(yù)期的結(jié)果。在右圖中,可以看到
w
0
w_0
w0? 在沒有越過最小值的情況下逐漸減小。dj_w0
在整個運行過程中都是負數(shù)。盡管可能不如前面的例子那么快,但是這個解也會收斂。
3、特征縮放
3.1 特征縮放的原因
讓我們再看看
α
\alpha
α = 9e-7的情況。這非常接近可以設(shè)置
α
\alpha
α到不發(fā)散的最大值。這是前幾次迭代的簡短運行:
如上所示,雖然損失正在降低,但很明顯由于
w
0
w_0
w0?的梯度更大,因此比其他參數(shù)取得更快的進展。
下圖顯示了
α
\alpha
α = 9e-7非常長時間的運行結(jié)果。這花費幾個小時。
從上圖中可以看到,損失在最初降低后緩慢下降。注意w0
和 w0
,w1
,w2
以及 dj_dw0
和dj_dw1-3
之間的區(qū)別。w0
很快達到了接近最終值的狀態(tài), dj_dw0
快速減小到一個很小的值來顯示w0
接近最終值,而其他參數(shù)更緩慢地減小。
為什么會是這樣? 有什么辦法可以改進它?
上圖說明了
w
w
w更新不均勻的原因。
- α \alpha α 由所有的參數(shù)更新共享.
- 公共誤差項被乘以特征值來更新 w w w,而不是偏置項 b b b.
- 特征值的大小變化幅度差異很大,導(dǎo)致一些特征的更新速度比其他特征快得多。在這個例子中, w 0 w_0 w0? 乘以 ‘size(sqft)’,該特征通常大于 1000,而 w 1 w_1 w1? 乘以 ‘number of bedrooms’,該特征通常在 2-4 范圍內(nèi)。
所以,解決方案就是特征縮放。
在課程中介紹了三種不同的技術(shù):
- 特征縮放,本質(zhì)上是將每個特征除以用戶選擇的值,使得特征值的范圍在 -1 到 1 之間。
- 均值歸一化: x i : = x i ? μ i m a x ? m i n x_i := \dfrac{x_i - \mu_i}{max - min} xi?:=max?minxi??μi??
- Z-score 歸一化.
3.2 Z-score 歸一化
Z-score 歸一化后,所有特征的均值為 0,標準差為 1.
為實現(xiàn) Z-score 歸一化, 根據(jù)以下公式調(diào)整輸入值:
x
j
(
i
)
=
x
j
(
i
)
?
μ
j
σ
j
(4)
x^{(i)}_j = \dfrac{x^{(i)}_j - \mu_j}{\sigma_j} \tag{4}
xj(i)?=σj?xj(i)??μj??(4)
其中,
j
j
j 選擇一個特征或矩陣 X 中的一列。
μ
j
μ_j
μj? 是特征(j)所有值的平均值,
σ
j
\sigma_j
σj? 是特征(j)的標準差。
μ
j
=
1
m
∑
i
=
0
m
?
1
x
j
(
i
)
σ
j
2
=
1
m
∑
i
=
0
m
?
1
(
x
j
(
i
)
?
μ
j
)
2
\begin{align} \mu_j &= \frac{1}{m} \sum_{i=0}^{m-1} x^{(i)}_j \tag{5}\\ \sigma^2_j &= \frac{1}{m} \sum_{i=0}^{m-1} (x^{(i)}_j - \mu_j)^2 \tag{6} \end{align}
μj?σj2??=m1?i=0∑m?1?xj(i)?=m1?i=0∑m?1?(xj(i)??μj?)2?(5)(6)?
這里需要注意:對特征進行歸一化時,存儲用于歸一化的值(用于計算的平均值和標準差)非常重要。從模型中學(xué)習(xí)參數(shù)后,我們經(jīng)常想要預(yù)測我們以前沒有見過的房屋的價格。給定一個新的 x 值(客廳面積和臥室數(shù)量),我們必須首先使用我們之前根據(jù)訓(xùn)練集計算的平均值和標準差對 x 進行標準化。
以下是實現(xiàn)過程:
def zscore_normalize_features(X):
"""
computes X, zcore normalized by column
Args:
X (ndarray): Shape (m,n) input data, m examples, n features
Returns:
X_norm (ndarray): Shape (m,n) input normalized by column
mu (ndarray): Shape (n,) mean of each feature
sigma (ndarray): Shape (n,) standard deviation of each feature
"""
# find the mean of each column/feature
mu = np.mean(X, axis=0) # mu will have shape (n,)
# find the standard deviation of each column/feature
sigma = np.std(X, axis=0) # sigma will have shape (n,)
# element-wise, subtract mu for that column from each example, divide by std for that column
X_norm = (X - mu) / sigma
return (X_norm, mu, sigma)
#check our work
#from sklearn.preprocessing import scale
#scale(X_orig, axis=0, with_mean=True, with_std=True, copy=True)
可以看一下 Z-score 歸一化逐步的轉(zhuǎn)變過程:
mu = np.mean(X_train,axis=0)
sigma = np.std(X_train,axis=0)
X_mean = (X_train - mu)
X_norm = (X_train - mu)/sigma
fig,ax=plt.subplots(1, 3, figsize=(12, 3))
ax[0].scatter(X_train[:,0], X_train[:,3])
ax[0].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[0].set_title("unnormalized")
ax[0].axis('equal')
ax[1].scatter(X_mean[:,0], X_mean[:,3])
ax[1].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[1].set_title(r"X - $\mu$")
ax[1].axis('equal')
ax[2].scatter(X_norm[:,0], X_norm[:,3])
ax[2].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[2].set_title(r"Z-score normalized")
ax[2].axis('equal')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
fig.suptitle("distribution of features before, during, after normalization")
plt.show()
上圖顯示了兩個訓(xùn)練集參數(shù)“年齡”和“平方英尺”之間的關(guān)系。這些都是以相同比例繪制的。
左:未標準化:“尺寸(平方英尺)”特征的值范圍或方差遠大于年齡的范圍。
中:第一步查找從每個特征中減去平均值。這留下了以零為中心的特征。很難看出“年齡”特征的差異,但“尺寸(平方英尺)”顯然在零左右。
右:第二步除以方差。這使得兩個特征都以零為中心,具有相似的尺度。
接下來,對數(shù)據(jù)進行標準化并將其與原始數(shù)據(jù)進行比較。
# normalize the original features
X_norm, X_mu, X_sigma = zscore_normalize_features(X_train)
print(f"X_mu = {X_mu}, \nX_sigma = {X_sigma}")
print(f"Peak to Peak range by column in Raw X:{np.ptp(X_train,axis=0)}")
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}")
通過歸一化,每列的峰值范圍從數(shù)千倍減少到 2-3 倍。
fig,ax=plt.subplots(1, 4, figsize=(12, 3))
for i in range(len(ax)):
norm_plot(ax[i],X_train[:,i],)
ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("count");
fig.suptitle("distribution of features before normalization")
plt.show()
fig,ax=plt.subplots(1,4,figsize=(12,3))
for i in range(len(ax)):
norm_plot(ax[i],X_norm[:,i],)
ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("count");
fig.suptitle(f"distribution of features after normalization")
plt.show()
接下來,使用歸一化的數(shù)據(jù)重新運行梯度下降算法。
w_norm, b_norm, hist = run_gradient_descent(X_norm, y_train, 1000, 1.0e-1, )
縮放后的特征可以更快地獲得非常準確的結(jié)果!請注意,在這個相當短的運行結(jié)束時,每個參數(shù)的梯度都很小。0.1 的學(xué)習(xí)率是使用歸一化特征進行回歸的良好開端。接下來繪制預(yù)測值與目標值的關(guān)系圖。請注意,預(yù)測是使用歸一化特征進行的,而繪圖是使用原始特征值顯示的。
#predict target using normalized features
m = X_norm.shape[0]
yp = np.zeros(m)
for i in range(m):
yp[i] = np.dot(X_norm[i], w_norm) + b_norm
# plot predictions and targets versus original features
fig,ax=plt.subplots(1,4,figsize=(12, 3),sharey=True)
for i in range(len(ax)):
ax[i].scatter(X_train[:,i],y_train, label = 'target')
ax[i].set_xlabel(X_features[i])
ax[i].scatter(X_train[:,i],yp,color=dlorange, label = 'predict')
ax[0].set_ylabel("Price"); ax[0].legend();
fig.suptitle("target versus prediction using z-score normalized model")
plt.show()
3.3 預(yù)測
生成模型的目的是用它來預(yù)測數(shù)據(jù)集中沒有的房價。我們來預(yù)測一套 1200 平方英尺、3 間臥室、1 層、40 年樓齡的房子的價格。必須使用訓(xùn)練數(shù)據(jù)標準化時得出的平均值和標準差來標準化數(shù)據(jù)。
# First, normalize out example.
x_house = np.array([1200, 3, 1, 40])
x_house_norm = (x_house - X_mu) / X_sigma
print(x_house_norm)
x_house_predict = np.dot(x_house_norm, w_norm) + b_norm
print(f" predicted price of a house with 1200 sqft, 3 bedrooms, 1 floor, 40 years old = ${x_house_predict*1000:0.0f}")
3.4 損失等值線
查看特征縮放的另一種方法是根據(jù)損失等值線。當特征尺度不匹配時,等值線圖中損失與參數(shù)的關(guān)系圖是不對稱的。在下圖中,參數(shù)的比例是匹配的。左圖是 w[0](平方英尺)與 w[1](標準化特征之前的臥室數(shù)量)的損失等值線圖。該圖非常不對稱,以至于看不到完整輪廓的曲線。相反,當特征標準化時,損失輪廓更加對稱。結(jié)果是,在梯度下降期間更新參數(shù)可以使每個參數(shù)取得相同的進展。文章來源:http://www.zghlxwxcb.cn/news/detail-624550.html
plt_equal_scale(X_train, X_norm, y_train)
文章來源地址http://www.zghlxwxcb.cn/news/detail-624550.html
到了這里,關(guān)于【機器學(xué)習(xí)】Feature scaling and Learning Rate (Multi-variable)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!