【机器学习基础】(二):理解线性回归与梯度下降并做简单预测
預測從瞎猜開始
按上一篇文章所說,機器學習是應用數學方法在數據中發現規律的過程。既然數學是對現實世界的解釋,那么我們回歸現實世界,做一些對照的想象。
想象我們面前有一塊塑料泡沫做的白板,白板上分布排列著數枚藍色的圖釘,隱約地它們似乎存在著某種規律,我們試著找出規律。
白板上的圖釘(數據)如上圖所示,我們有沒有一種方法(數學算法)來尋找規律(模型解釋)呢??既然不知道怎么做,那我們瞎猜吧!
我拿起兩根木棒在白板前比劃,試著用木棒表示數據的規律。我隨便放了放,如下圖所示:
它們似乎都在一定程度上能表示藍色圖釘的規律,那么問題來了,綠色(虛線)和紅色(實線)哪一個表示更好呢?
損失函數(成本函數)
好與壞是很主觀的表達,主觀的感受是不可靠的,我們必須找到一種客觀的度量方式。我們想當然的認為誤差最小的表示,是最好的。那么,我們引出一種量化誤差的方法---最小二乘法。
最小二乘法:使誤差的平方和最小的辦法,是一種誤差統計方法,二乘就是平方的意思。
最小二乘法的解釋是這樣的,我們用預測值-實際值表示單點的誤差,再把它們的平方和加到一起來表示整體誤差。(平方的好處可以處理掉負數值,用絕對值的和也不是不可以。)我們用這個最終值來表示損失(成本),而可以表示損失(成本)的函數就叫做損失函數(成本函數)。
如上圖我們可以看到,藍色點到實線的距離就是我們要帶入公式的誤差。雖然它們看上去相近,但經過計算的結果是紅色實線(y=3x+2)的損失為27.03,而綠色實線(y=4x+4)的損失為29.54,顯然紅色模型優于綠色模型。
那么,還有沒有比紅色實線更好的模型來表示數據呢?有沒有一種方式來找到它呢?
梯度下降
我們把木棒(實線、模型)的表示數學化,我們既然可以用3、4做為x的系數,那我們當然可以嘗試別的數字。我們用如下公式表示這種關系:
其中,x和y是已知的,我們不斷調整w(權重)和b(偏差),然后再帶入損失函數以求得最小值的過程,就是梯度下降。
我們從-50開始到50結束設置w的值,我們通過隨機數來設置偏置b,然后再帶入損失函數計算我們的預測和實際值的誤差損失,得到如下曲線:
需要注意的是,我們繪制的圖像是根據權重和損失繪制的曲線。而我們的模型表示是一條直線。
我們可以看到,在上圖中我們是可以找到極小值的,大概在5左右,此處是我們損失最小的位置,這時我們的模型最能表示數據的規律。
梯度可以完全理解為導數,梯度下降的過程就是我們不斷求導的過程。
學習率(步長)
不斷調整權重和偏差來來尋找損失函數最小值的過程就是我們使用梯度下降方法擬合數據尋找最佳模型的過程。那么既然我們有了解決方案,是不是該考慮如何提升效率了,我們如何快速地找到最低點?
想象一下,當你迷失在山上的濃霧之中,你能感覺到的只有你腳下路面的坡度。快速到達山腳的一個策略就是沿著最陡的方向下坡。梯度下降中的一個重要的參數就是每一步的步長(學習率),如果步長太小,算法需要經過大量迭代才會收斂,如果步長太大,你可能會直接越過山谷,導致算法發散,值越來越大。
設置步長為過小:
設置步長過大:
設置步長適當:
步長是算法自己學習不出來的,它必須由外界指定。
這種算法不能學習,需要人為設定的參數,就叫做超參數。
線性回歸
最終我們找到了線性模型來解釋自變量x與因變量y之間的關系,這就是線性回歸。回歸的解釋是,事物總是傾向于朝著某種“平均”發展,這種趨勢叫做回歸,所以回歸多用于預測。
上圖,紅線是我們擬合出的最佳模型,在此模型上我們可以尋找到2.2,2.6,2.8的預測值,分別對應圖中的三個紅點。
這也是線性回歸的基本意義。
代碼實踐
準備數據:
import?numpy?as?np import?matplotlib.pyplot?as?pltnp.random.seed(42) X?=?2?*?np.random.rand(10) y?=?4?+?3?*?X?+?np.random.randn(10)plt.plot(X,?y,?"bo") plt.xlabel("$X$",?fontsize=18) plt.ylabel("$y$",?rotation=0,?fontsize=18) plt.axis([0,?2,?0,?15]) plt.show()繪制y=3x+2和y=4x+4兩條直線:
plt.plot(X,?y,?"bo") plt.plot(X,?3*X+2,?"r-",?lw="5",?label?=?"y=3x+2") plt.plot(X,?4*X+4,?"g:",?lw="5",?label?=?"y=4x+4") plt.xlabel("$X$",?fontsize=18) plt.ylabel("$y$",?rotation=0,?fontsize=18) plt.axis([0,?2,?0,?15]) plt.legend(loc="upper?left") plt.show()計算損失,并比較y=3x+2和y=4x+4兩條直線:
fig,?ax_list?=?plt.subplots(nrows=1,?ncols=2,figsize=(20,10)) ax_list[0].plot(X,?y,?"bo") ax_list[0].plot(X,?3*X+2,?"r-",?lw="5",?label?=?"y=3x+2") loss?=?0 for?i?in?range(10):ax_list[0].plot([X[i],X[i]],?[y[i],3*X[i]+2],?color='grey')loss=?loss?+?np.square(3*X[i]+2-y[i])pass ax_list[0].axis([0,?2,?0,?15]) ax_list[0].legend(loc="upper?left") ax_list[0].title.set_text('loss=%s'%loss)ax_list[1].plot(X,?y,?"bo") ax_list[1].plot(X,?4*X+4,?"g:",?lw="5",?label?=?"y=4x+4") loss?=?0 for?i?in?range(10):ax_list[1].plot([X[i],X[i]],?[y[i],4*X[i]+4],?color='grey')loss=?loss?+?np.square(4*X[i]+4-y[i])pass ax_list[1].axis([0,?2,?0,?15]) ax_list[1].legend(loc="upper?left") ax_list[1].title.set_text('loss=%s'%loss) fig.subplots_adjust(wspace=0.1,hspace=0.5) fig.suptitle("Calculate?loss",fontsize=16)訓練模型,并預測:
from?sklearn.linear_model?import?LinearRegression lr?=?LinearRegression() lr.fit(X.reshape(-1,1),y.reshape(-1,1))X_test?=?[[2.2],[2.6],[2.8]] y_test?=?lr.predict(X_test) X_pred?=?3?*?np.random.rand(100,?1) y_pred?=?lr.predict(X_pred) plt.scatter(X,y,?c='b',?label='real') plt.plot(X_test,y_test,?'r',?label='predicted?point'?,marker=".",?ms=20) plt.plot(X_pred,y_pred,?'r-',?label='predicted') plt.xlabel("$X$",?fontsize=18) plt.ylabel("$y$",?rotation=0,?fontsize=18) plt.axis([0,?3,?0,?15]) plt.legend(loc="upper?left") loss?=?0 for?i?in?range(10):loss?=?loss?+?np.square(y[i]-lr.predict([[X[i]]])) plt.title("loss=%s"%loss) plt.show()其他回歸
要怎么真正理解回歸(regression)呢?通過大量的數據統計,個體小的豆子往往傾向于產生比其更大的后代,而個體大的豆子往往傾向于產生比其更小的后代,新產生的個體有向著豆子的平均值的一種趨勢,這種趨勢就是回歸。我們本篇文章講的線性回歸就是應用于預測的一種技術。這時,回歸往往與分類相對。
線性回歸、邏輯回歸、多項式回歸、逐步回歸、嶺回歸、套索(Lasso)回歸、彈性網絡(ElasticNet)回歸是最常用的回歸技術。我先對這些技術做一個簡單整理,讓大家把脈絡理清,等大家實際需要再深入探索。試圖去窮盡知識只會把自己拖向疲累。
| 線性回歸(Linear Regression) | 一種以線性模型來建模自變量與因變量關系的方法 | 線性回歸:? |
| 邏輯回歸(Logistic Regression) | 對特定類別進行建模,用于二分類 | 邏輯回歸: |
| 多項式回歸(Polynomial Regression) | 自變量?x 和因變量?y 之間的關系被建模為關于 x 的 n 次多項式 | ? |
| 逐步回歸(Stepwise Regression) | 將多個變量一個一個地引入到模型,找到其對模型影響大的變量 | |
| 套索回歸(Lasso Regression) | 稀疏矩陣,消除不重要的特征,MSE+L1范數 | ,其中,α越大模型權重越小 |
| 嶺回歸(Ridge Regression) | 正則化線性回歸,增加模型自由度,防止過擬合,MSE+L2范數 | ?,其中,α越大模型權重越小 |
| 彈性網絡(ElasticNet) | 介于嶺回歸和Lasso回歸之間 | ,其中,γ介于0和1之間,接近0則更傾向于嶺回歸,接近1則更傾向于Lasso回歸 |
總結
以上是生活随笔為你收集整理的【机器学习基础】(二):理解线性回归与梯度下降并做简单预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑公司win11 32位官方版镜像v2
- 下一篇: 【NLP】不讲武德,只用标签名就能做文本