機器學習線性迴歸原理介紹和功能實現
2022-01-29由 積極的陽光i 發表于 農業
隨機模型迴歸線公式怎麼記
線性迴歸(Linear Regression)
模型是最簡單的線性模型之一,很具代表性。本文將詳細介紹一下機器學習中 線性迴歸模型的求解過程和編碼實現。
內容概要:
1。什麼是線性迴歸
在幾何意義上,迴歸就是找到一條具有代表性的直線或曲線(高維空間的超平面)來擬合輸入資料點和輸出資料點。
線性迴歸 可以理解為找到 用來擬合輸入資料點和輸出資料點的 那條具有代表性直線或曲線的過程。
為了理解線性迴歸的概念,我們可以先從一個例項來引入本文的主題。
1。1 問題描述——波士頓房價預測
波士頓房價預測 是一個很經典的線性迴歸案例,這個案例使用的資料集(Boston House Price Dataset)源自 20 世紀 70 年代中期美國人口普查局收集的美國馬薩諸塞州波士頓住房價格有關資訊。該資料集統計了當地城鎮人均犯罪率、城鎮非零售業務比例等。共計 13 個指標(特徵),第 14 個特徵(相當於標籤資訊)給出了住房的中位數報價。先來看看這組資料,
特徵資訊翻譯參考下圖,
1。2 特徵,標籤和樣本
透過上面這個波士頓房價預測的資料集,先引入機器學習中關於資料集的幾個概念,
特徵:
輸入變數,即簡單線性迴歸中的 x變數(如顏色,天氣,水果等),在這個資料集中,每一列表示一項特徵(最後一列是標籤 除外),一共13項特徵
標籤:
我們要預測的事物,即簡單線性迴歸中的 y 變數。標籤可以是連續值(如房價,股市等),可以是離散值(今天周幾,水果好不好吃等),在這個資料集中,最後一列PRICE就是標籤
樣本:
是指資料的特定例項(樣本包括訓練集和測試集)。在這個資料集中,每一行表示一個樣本
備註:該資料集在卡耐基梅隆大學統計與資料科學實驗室或 Kaggle 等網站均可下載。下載後,需要刪除部分額外的資料描述資訊,並將檔案另存為 CSV 格式,然後利用之前介紹的 Pandas 來讀取資料。
另外,在前面介紹的 機器學習框架sklearn(scikit-learn)內建了這個資料集,無需另外下載,只要呼叫專用的 API 函式即可匯入資料,詳細資訊可參考這篇文章的介紹。
現在我們的任務是,找到這些指標(特徵)與房價(目標)之間的關係。由於房價是連續變化的實數,很明顯,這個任務屬於迴歸分析。為了找到這些指標(特徵)與房價(目標)之間的關係,我們需要構建模型。
2。 構建模型
上面這個表中提供了4個樣本,每一個樣本都包含了13個特徵值和一個標籤。現在我們需要將這個房價預測問題進行一般化描述,為構建模型做準備,
X 表示樣本;
Y 表示 標籤;
{x1,x2,x3...xn}表示資料集中的特徵值;
{X(1),X(2),X(3)...X(n)} 表示第幾個樣本
將波士頓房價資料集一般化的描述結果展示如下,
從資料集提供的資訊,影響波士頓房價(標籤)的因素有13項(特徵值),現在我們希望建立一個模型,當我們輸入這13個影響房價因素的量化值後,模型能夠幫助我們預測出房價。這個模型用數學公式可以表示為(n=13),
簡化一下,
xi是我們資料集中樣本的特徵值, y^ 就是我們的模型預測結果,w和b 就是我們模型的引數,現在構建模型的問題就轉化為如何求解引數w和b了。
3.損失函式(Loss Function)
為了求解模型引數w和b,需要引入損失函式的概念。根據第2章節構建的線性模型,資料集中的每一組x(n)樣本 理論上都有對應一個預測值yn^ ,{x1,x2,。。。,xn }是特徵值,表示方式如下,
資料集中的每一組樣本 理論上都有一個標籤y和一個預測值y^
,參考下圖,
一組樣本對應一個標籤值和一個預測值
我們期望構建的模型的預測值y^跟真實值y 差距越小越好,越小說明我們構建的模型越準確,
第一個樣本真實值與預測值的差值
m個樣本的整體誤差表示如下,
m個樣本的整體求和表示式
直接相加有個問題,可能會因為正負值得屬性,誤差可能相消,導致誤差不準確。需要用平方和,參考表示式如下,
這樣整體的預測值和真實值得差距就可以用真實值與預期值差值的平方求和表示出來了。這個差距我們稱為損失。用來表示預測值和真實值得差距的函式就稱為損失函式。
將損失函式簡化一下表達方式,
損失函式表示式
代入y^m (第m個樣本的預測值)計算公式,
損失函式得表示式:
損失函式表示式
損失函式關聯的引數 就是
w1,w2,...,wn 和b
了。
我們的目標是使得損失函式值最小,使用得方法就是梯度下降演算法。
4。梯度下降演算法(Gradient Descent)
到了這一步,現在的問題轉化為
求取min(L(w1,w2,...,wn,b))
。求函式得最小值,我們在高數中一般用的是求導,找到極值點然後代入函式找到最小值。這種通用的方法在特徵值比較少的情況一般也沒有什麼影響,但如果特徵量很多時,這種方法就不適用了。這種情況下就需要用到這裡即將介紹的 另外一種求取函式最小值得方法————
梯度下降演算法
。
如下座標軸,
橫軸w:
縱軸L(w):
我們的目標是找到函式最小值L(W*),要找到L(W*),首先需要找到W*,那麼梯度下降演算法是如何找到W*的呢?
方法如下,
1)首先隨機初始化一個w0的點,求出這個點的導數值,從圖中可以看到w0 這個點的導致值大於0,並且w0>w*,期望下一次要找的w1能往左移,離w*近一點。
這裡還需要引入一個引數----學習率
。下一個點w1可以用如下公式來表示,
學習率ᶇ是正數,w0處的倒數也是正數,找到的下一個點w1比w0要小,在往期望值w* 靠攏。
2)同樣的方法,求取w1的下一個點w2,
3)重複操作,直到直到最小的w*。
示例中隨機初始化的w0在最小值w*的右邊,事實上w0在w*的左邊,效果是一樣的,w0在左邊時,w0處的導數值為負,帶入上面的公式,學習率為正,下一個值w1將增大,最終的結果都是往 w* 靠攏。
4。1。學習率(Learning rate)
正數,決定我們呢每次改變W值 改變多少的值,
學習率的選擇
如上圖所示,需要設定合適的學習率,如果學習率設定過大,w值會在最優解w* 左右兩邊震盪,無法到達最優解w*;如果w* 設定過來小,將增大到達最優解w*的計算次數,造成執行效率低下,需要更長的時間才能收斂。
所以我們需要找到一個合適的學習率,梯度下降演算法才能達到比較好的效果。
這裡順便補充說明一下
超引數
的概念,
模型的引數 稱為引數(如這裡的w和b),決定模型的引數,稱為超引數,比如這裡的學習率。
5。求取損失函式的最小值
回到第3節損失函式的表示式,
w和x 用向量表示,
簡化後的公式表示如下,
對w,和b引數求偏導,
然後
再用梯度下降演算法求取函式的最優解,
上圖展示了一次更新過程,迴圈更新,直到得到最終的最優解w1*,w2*,。。。 wn*,b*。透過梯度下降演算法我們找到了模型中的這一組引數,帶入模型就可以對新樣本的預測了。到了這一步,求解線性迴歸的模型引數已完成,可以得到根據當前資料集擬合的整體誤差最小的模型了。
6。線性迴歸程式碼實現
這裡為了演示上述過程,我們不用框架和庫檔案,透過編碼的方式實現 y = w1 * x + w2 * (x**2) + b 這個線性迴歸模型的引數求解。展示用梯度下降演算法求解模型引數的實現過程。
1)設定資料
###設定資料
X = [12。3,14。3,14。5,14。8,16。1,16。8,16。5,15。3,17。0,17。8,18。7,20。2,22。3,19。3,15。5,16。7,17。2,18。3,19。2,17。3,19。5,19。7,21。2,23。04,23。8,24。6,25。2,25。7,25。9,26。3]y = [11。8,12。7,13。0,11。8,14。3,15。3,13。5,13。8,14。0,14。9,15。7,18。8,20。1,15。0,14。5,14。9,14。8,16。4,17。0,14。8,15。6,16。4,19。0,19。8,20。0,20。3,21。9,22。1,22。4,22。6]
2)顯示資料
plt。scatter(X, y)plt。title(‘Dataset Samples’)plt。xlabel(‘X’)plt。ylabel(‘y’)plt。show()
資料顯示參考下圖,
3)拆分資料集
X_train = X[0:20]y_train = y[0:20]n_train = len(X_train)X_test = X[20:]y_test = y[20:]n_test = len(X_test)
4)擬合模型
####Fit model: y = w1 * x + w2 * (x**2) + bepoches = 10000w1 = -0。1w2 = 0。1b = 0。3lr_w1 = 0。0lr_w2 = 0。0lr = 0。001for epoch in range(epoches):sum_w1 = 0。0sum_w2 = 0。0sum_b = 0。0for i in range(n_train):y_hat = w1 * X_train[i] + w2 * (X_train[i] ** 2) + bsum_w1 += (y_train[i] - y_hat) * (-X_train[i])sum_w2 += (y_train[i] - y_hat) * (-X_train[i] ** 2)sum_b += (y_train[i] - y_hat) * (-1)# Using Gradient Descent to update parameters(w, b)det_w1 = 2。0 * sum_w1det_w2 = 2。0 * sum_w2det_b = 2。0 * sum_blr_w1 = lr_w1 + det_w1 ** 2lr_w2 = lr_w2 + det_w1 ** 2w1 = w1 - (1 / math。sqrt(lr_w1) * det_w1)w2 = w2 - (1 / math。sqrt(lr_w2) * det_w2)b = b - lr * det_b
5)展示模型擬合的結果
fig, ax = plt。subplots()ax。plot([i for i in range(10, 25)], [w1 * i + w2 * (i**2) + b for i in range(10, 25)])ax。scatter(X_train, y_train)plt。title(‘y = w1*x + w2*x^2 + b’)plt。legend((‘Model’, ‘Data Points’), loc=‘upper left’)plt。show()
模型展示的效果圖,
6)求解損失
total_loss_train = 0for i in range(n_train):y_hat = y_hat = w1 * X_train[i] + w2 * (X_train[i] ** 2) + btotal_loss_train += (y_hat - y_train[i]) ** 2print(“訓練集損失值:”+str(total_loss_train))total_loss_test = 0for i in range(n_test):y_hat = y_hat = w1 * X_test[i] + w2 * (X_test[i] ** 2) + btotal_loss_test += (y_hat - y_test[i]) ** 2print(“測試集損失值:”+str(total_loss_train))
求解的損失參考下圖,
總結:
本文透過經典的線性迴歸案例——-波士頓房價預測,介紹了機器學習中線性迴歸的實現原理,
1)構建表示資料集中 特徵值和標籤值之間的關係的模型,將線性迴歸問題轉換為求引數wi和b 的問題
2)定義損失函式——-預測值與真實值之間的差距
3)介紹了機器學習中的 求取函式最小值的演算法——-梯度下降演算法
4)用梯度下降演算法求取損失函式的最小值,確定引數wi和b,從而確定模型
5)最後透過編碼的方式展示了用梯度下降演算法求解模型引數的實現過程
透過本文的講解,機器學習中線性迴歸的實現原理應該有初步的瞭解,如果有疑問,歡迎留言評論,感謝閱讀~