通过简单的线性回归理解机器学习的基本原理
在本文中,我將使用一個簡單的線性回歸模型來解釋一些機(jī)器學(xué)習(xí)(ML)的基本原理。線性回歸雖然不是機(jī)器學(xué)習(xí)中最強(qiáng)大的模型,但由于容易熟悉并且可解釋性好,所以仍然被廣泛使用。簡單地說,線性回歸用于估計(jì)連續(xù)或分類數(shù)據(jù)之間的線性關(guān)系。
我將使用X和y來表示變量。如果你喜歡更具體的東西,可以想象y是銷售額,X是廣告支出,我們想估計(jì)廣告花費(fèi)如何影響銷售額。我將展示一個線性回歸如何學(xué)習(xí)繪制最適合通過這些數(shù)據(jù)的線:
機(jī)器學(xué)到了什么?
機(jī)器學(xué)習(xí)最基礎(chǔ)的問題是:“機(jī)器(即統(tǒng)計(jì)模型)實(shí)際上學(xué)到了什么?”
這取決于不同的模型,但簡單來說,模型學(xué)習(xí)函數(shù)f,使f(X)映射到y(tǒng)。換句話說,模型學(xué)習(xí)如何采取X(即特征,或者說自變量(S)),預(yù)測y(目標(biāo),或者說因變量)。
在簡單的線性回歸的情況下(y ~ b0 + b1 * X,其中X是列)的模型“學(xué)習(xí)”兩個參數(shù):
- B0:偏置(或者說,截距)
- b1:斜率
當(dāng)X為0時的y水平坐標(biāo)等于偏置(即廣告支出為零時的銷售額的值),斜率是X中每單位增長或減少對y預(yù)測增長或減少的比率(即,每英鎊花在廣告上會帶來多少銷售額的增長)。兩個參數(shù)都是標(biāo)量。
一旦模型學(xué)習(xí)到這些參數(shù),你就可以用給定X值來計(jì)算y的估計(jì)值。換句話說,當(dāng)你不知道y是什么時候,你可以用這些它們來預(yù)測y的值,這是一個預(yù)測模型!
學(xué)習(xí)參數(shù):成本函數(shù)
學(xué)習(xí)LR模型的參數(shù)有幾種方法,我將著重于最好說明統(tǒng)計(jì)學(xué)習(xí)的方法: 最小化成本函數(shù)。
請記住,機(jī)器學(xué)習(xí)的重點(diǎn)是從數(shù)據(jù)中學(xué)習(xí)。我們用一個簡單的比喻來說明。對于孩子,我們通常會通過告知他禁止做什么事情,或者因?yàn)樽隽瞬辉撟龅氖虑槎屗艿綉土P的方式,教會他理解正確的行為。例如,你可以想象一個四歲的孩子坐在火旁保暖,但因?yàn)樗恢阑鸬奈kU(xiǎn),她把手指放了進(jìn)去燒傷了。下一次他坐在火旁,他就不會因?yàn)橥婊饘?dǎo)致燒傷,但是也許他會因?yàn)樽秒x火太近,太熱,不得不離開。第三次他坐在火旁邊,發(fā)現(xiàn)有一個距離讓她既可以保持溫暖,也不會讓她受到任何危險(xiǎn)。換句話說,通過經(jīng)驗(yàn)和反饋,孩子掌握了與火的最佳距離。這個例子中的火的熱量是一個成本函數(shù)。
在機(jī)器學(xué)習(xí)中,使用成本函數(shù)來估計(jì)模型的表現(xiàn)。簡而言之,成本函數(shù)是衡量模型在估計(jì)X和Y之間關(guān)系方面的錯誤程度的度量。成本函數(shù)(你也可以參考損失函數(shù)或誤差函數(shù))可以通過迭代地運(yùn)行模型來估計(jì)的對“地面真值”(即y的已知值)的預(yù)測。
因此,ML模型的目標(biāo)是找到使成本函數(shù)最小化的參數(shù),權(quán)重或結(jié)構(gòu)。
最小化成本函數(shù):梯度下降
既然我們知道模型是通過最小化成本函數(shù)來學(xué)習(xí)的,那么你可能想知道成本函數(shù)是如何最小化的,那么讓我們開始介紹梯度下降。梯度下降是一種有效的優(yōu)化算法,試圖找到函數(shù)的局部或全局最小值。
梯度下降使模型能夠?qū)W習(xí)模型應(yīng)該采取的梯度或方向,以減少誤差(實(shí)際y與預(yù)測y之間的差異)。簡單線性回歸示例中的方向是指如何調(diào)整或修正模型參數(shù)b0和b1以進(jìn)一步降低成本函數(shù)。隨著模型迭代,它逐漸收斂到最小值,繼續(xù)對參數(shù)做更進(jìn)一步的調(diào)整只能產(chǎn)生很小(甚至沒有)的損失變化。
這個過程是整個ML過程不可或缺的一部分,它極大地加快了學(xué)習(xí)過程。梯度下降過程的替代方案可能是粗暴地窮舉所有可能的參數(shù)組合,直到確定使成本最小化的組為止。顯而易見,這是不可行的。因此,梯度下降使得學(xué)習(xí)過程能夠?qū)λ鶎W(xué)習(xí)的估計(jì)進(jìn)行糾正更新,將模型導(dǎo)向最佳參數(shù)組合。
在線性回歸模型中觀察學(xué)習(xí)
為了在線性回歸中觀察學(xué)習(xí),我手動設(shè)置參數(shù)b0和b1并使用模型從數(shù)據(jù)中學(xué)習(xí)這些參數(shù)。換句話說,我們知道X與y之間關(guān)系的地面真值,并且可以通過參數(shù)迭代校正對成本的回應(yīng)來觀察學(xué)習(xí)這種關(guān)系的模型。
01 library(dplyr) 02 library(ggplot2) 0304 n <- 200 # number of observations 05 bias <- 4 06 slope <- 3.5 07 dot <- `%*%` # defined for personal preference 0809 x <- rnorm(n) * 2 10 x_b <- cbind(x, rep(1, n)) 11 y <- bias + slope * x + rnorm(n) 12 df <- data_frame(x = x, y = y) 1314 learning_rate <- 0.05 15 n_iterations <- 100 16 theta <- matrix(c(20, 20)) 1718 b0 <- vector("numeric", length = n_iterations) 19 b1 <- vector("numeric", length = n_iterations) 20 sse_i <- vector("numeric", length = n_iterations)這里我定義了偏置和斜率(分別等于4和3.5)。我也為X添加了一個列(用于支持矩陣乘法)。我也給y添加了一些高斯噪聲來掩蓋真正的參數(shù),即創(chuàng)建完全隨機(jī)的誤差。現(xiàn)在我們有一個包含兩個變量X和y的dataframe,這個變量似乎有一個正的線性趨勢(即y隨著增加X值而增加)。
接下來我定義了學(xué)習(xí)率,它控制每個梯度的步驟大小。如果這太大,模型可能會錯過函數(shù)的局部最小值。如果太小,模型會需要很長時間才能收斂。Theta存儲參數(shù)b0和b1,它們用隨機(jī)值初始化。n_iterations控制模型迭代和更新值的次數(shù)。最后,在模型的每次迭代中,我創(chuàng)建了一些占位符來捕獲b0,b1的值和誤差平方和(SSE)。
這里的SSE是成本函數(shù),它僅僅是預(yù)測y和實(shí)際y之間的平方差的和(即殘差)。
現(xiàn)在,我們運(yùn)行循環(huán)。在每次迭代中,模型將根據(jù)Theta值預(yù)測y,計(jì)算殘差,然后應(yīng)用梯度下降估計(jì)校正梯度,然后使用這些梯度更新theta的值,重復(fù)此過程100次。當(dāng)循環(huán)結(jié)束時,我創(chuàng)建一個dataframe來存儲學(xué)習(xí)的參數(shù)和每次迭代的損失。
01 for (iteration in seq_len(n_iterations)) { 0203residuals_b <- dot(x_b, theta) - y 04gradients <- 2/n * dot(t(x_b), residuals_b) 05theta <- theta - learning_rate * gradients 0607sse_i[[iteration]] <- sum((y - dot(x_b, theta))**2) 08b0[[iteration]] <- theta[2] 09b1[[iteration]] <- theta[1] 1011 } 1213 model_i <- data.frame(model_iter = 1:n_iterations, 14sse = sse_i, 15b0 = b0, 16b1 = b1)當(dāng)?shù)瓿珊?#xff0c;我們可以繪制超過模型估計(jì)的線。
01 p1 <- df %>% 02ggplot(aes(x=x, y=y)) + 03geom_abline(aes(intercept = b0, 04slope = b1, 05colour = -sse, 06frame = model_iter), 07data = model_i, 08alpha = .50 09) + 10geom_point(alpha = 0.4) + 11geom_abline(aes(intercept = b0, 12slope = b1), 13data = model_i[100, ], 14alpha = 0.5, 15size = 2, 16colour = "dodger blue") + 17geom_abline(aes(intercept = b0, 18slope = b1), 19data = model_i[1, ], 20colour = "red", 21alpha = 0.5, 22size = 2) + 23scale_color_continuous(low = "red", high = "grey") + 24guides(colour = FALSE) + 25theme_minimal() 2627 p2 <- model_i[1:30,] %>% 28ggplot(aes(model_iter, sse, colour = -sse)) + 29geom_point(alpha = 0.4) + 30theme_minimal() + 31labs(x = "Model iteration", 32y = "Sum of Sqaured errors") + 33scale_color_continuous(low = "red", high = "dodger blue") + 34guides(colour = FALSE)首先要注意的是粗的紅線。這是從b0和b1的初始值估計(jì)的線。你可以看到,這并不適合數(shù)據(jù)點(diǎn),正因?yàn)槿绱?#xff0c;它有最高的SSE。但是,你會看到逐漸向數(shù)據(jù)點(diǎn)移動的線,直到找到最適合的線(粗藍(lán)線)。換句話說,在每次迭代時,模型為b0和b1學(xué)習(xí)了更好的值,直到找到最小化成本函數(shù)的值為止。模型學(xué)習(xí)b0和b1的最終值分別是3.96和3.51,因此非常接近我們設(shè)置的參數(shù)4和3.5。
我們還可以在模型的迭代中看到SSE的減少。在收斂和穩(wěn)定之前,它在早期迭代中急劇下降。
我們現(xiàn)在可以使用的B0和B1存儲在theta的學(xué)習(xí)值為新的X值預(yù)測y值。
01 predict_from_theta < - function(x){ 0203x < - cbind(x,rep(1,length(x))) 04點(diǎn)(x,theta) 0506 } 0708 predict_from_theta(rnorm(10)) 09[,1 ] 10 [ 1,] - 1.530065 11 [ 2,] 8.036859 12 [ 3,] 6.895680 13 [ 4,] 3.170026 14 [ 5,] 4.905467 15 [ 6,] 2.644702 16 [ 7,] 12.555390 17 [ 8,] 1.172425 18 [ 9,] 3.776509 19 [ 10,] 4.849211總結(jié)
本文介紹了一種簡要理解機(jī)器學(xué)習(xí)的方法。毫無疑問,機(jī)器學(xué)習(xí)還有很多知識本文中沒有被提到,但是了解“底層”的基本原理獲得初步的直覺可以大大提高你對更復(fù)雜模型的理解。
本文由AiTechYun編譯,轉(zhuǎn)載請注明出處。更多內(nèi)容關(guān)注微信公眾號atyun_com 或訪問www.atyun.com
總結(jié)
以上是生活随笔為你收集整理的通过简单的线性回归理解机器学习的基本原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【系列5】使用Dockerfile创建带
- 下一篇: 14.ZooKeeper Java AP