<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法13:Lasso回歸

          共 6246字,需瀏覽 13分鐘

           ·

          2022-05-20 14:01

          點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          ? ? ?第13講和第14講我們來(lái)關(guān)注一下回歸模型的兩個(gè)變種模型。本節(jié)我們要介紹的是基于L1正則化的Lasso模型,下一節(jié)介紹基于L2正則化的Ridge模型。在正式介紹這兩種模型之前,筆者還是想帶大家復(fù)習(xí)一下過(guò)擬合和正則化等機(jī)器學(xué)習(xí)關(guān)鍵問(wèn)題。


          正則化與L1范數(shù)


          ?????正則化是防止模型過(guò)擬合的核心技術(shù)之一,關(guān)于欠擬合和過(guò)擬合的問(wèn)題,這里筆者就不再展開(kāi)來(lái)說(shuō),不了解的朋友可以看看筆者很早之前寫(xiě)的一篇文章:談?wù)勥^(guò)擬合。

          ???? 總的來(lái)說(shuō),監(jiān)督機(jī)器學(xué)習(xí)的核心原理莫過(guò)于如下公式:

          ????? 該公式可謂是機(jī)器學(xué)習(xí)中最核心最關(guān)鍵最能概述監(jiān)督學(xué)習(xí)的核心思想的公式了:所有的有監(jiān)督機(jī)器學(xué)習(xí),無(wú)非就是正則化參數(shù)的同時(shí)最小化經(jīng)驗(yàn)誤差函數(shù)。最小化經(jīng)驗(yàn)誤差是為了極大程度的擬合訓(xùn)練數(shù)據(jù),正則化參數(shù)是為了防止過(guò)分的擬合訓(xùn)練數(shù)據(jù)。你看,多么簡(jiǎn)約數(shù)學(xué)哲學(xué)。正如之前所說(shuō),監(jiān)督機(jī)器學(xué)習(xí)是為了讓我們建立的模型能夠發(fā)現(xiàn)數(shù)據(jù)中普遍的一般的規(guī)律,這個(gè)普遍的一般的規(guī)律無(wú)論對(duì)于訓(xùn)練集還是未知的測(cè)試集,都具有較好的擬合性能。

          ????? 繼續(xù)回到公式。第一項(xiàng)經(jīng)驗(yàn)誤差函數(shù)在機(jī)器學(xué)習(xí)中無(wú)疑地位重要,但它不是筆者今天要講的,今天要講的是公式的第二項(xiàng):正則化項(xiàng)。第二項(xiàng)中 λ 為正則化系數(shù),通常是大于 0 的,是一種調(diào)整經(jīng)驗(yàn)誤差項(xiàng)和正則化項(xiàng)之間關(guān)系的系數(shù)。λ = 0 時(shí)相當(dāng)于該公式?jīng)]有正則化項(xiàng),模型全力討好第一項(xiàng),將經(jīng)驗(yàn)誤差進(jìn)行最小化,往往這也是最容易發(fā)生過(guò)擬合的時(shí)候。隨著 λ 逐漸增大,正則化項(xiàng)在模型選擇中的話語(yǔ)權(quán)越來(lái)越高,對(duì)模型的復(fù)雜性的懲罰也越來(lái)越厲害。所以,在實(shí)際的訓(xùn)練過(guò)程中,λ 作為一種超參數(shù)很大程度上決定了模型生死。

          ???? 系數(shù) λ 說(shuō)完了,然后就是正則化項(xiàng),正則化項(xiàng)形式有很多,但常見(jiàn)的也就是 L1 和 L2 正則化。本節(jié)我們先來(lái)看L1。

          ????? 在說(shuō)常見(jiàn)的 L1 和 L2 之前,先來(lái)看一下 L0 正則化。L0 正則化也就是 L0 范數(shù),即矩陣中所有非 0 元素的個(gè)數(shù)。如何我們?cè)谡齽t化過(guò)程中選擇了 L0 范數(shù),那該如何理解這個(gè) L0 呢?其實(shí)非常簡(jiǎn)單,L0 范數(shù)就是希望要正則化的參數(shù)矩陣 W 大多數(shù)元素都為 0。如此簡(jiǎn)單粗暴,讓參數(shù)矩陣 W 大多數(shù)元素為 0 就是實(shí)現(xiàn)稀疏而已。說(shuō)到這里,權(quán)且打住,想必同樣在機(jī)器學(xué)習(xí)領(lǐng)域摸爬滾打的你一定想問(wèn),據(jù)我所知稀疏性不通常都是用 L1 來(lái)實(shí)現(xiàn)的嗎?這里個(gè)中緣由筆者不去細(xì)講了,簡(jiǎn)單說(shuō)結(jié)論:在機(jī)器學(xué)習(xí)領(lǐng)域,L0 和 L1 都可以實(shí)現(xiàn)矩陣的稀疏性,但在實(shí)踐中,L1 要比 L0 具備更好的泛化求解特性而廣受青睞。先說(shuō)了 L1,但還沒(méi)解釋 L1 范數(shù)是什么,L1 范數(shù)就是矩陣中各元素絕對(duì)值之和,正如前述所言,L1 范數(shù)通常用于實(shí)現(xiàn)參數(shù)矩陣的稀疏性。至于為啥要稀疏,稀疏有什么用,通常是為了特征選擇和易于解釋方面的考慮。

          Lasso

          ?? ? ?Lasso的全稱叫做Least absolute shrinkage and selection operator,直譯過(guò)來(lái)為最小收縮與選擇算子。其本質(zhì)就是在常規(guī)的線性回歸的基礎(chǔ)上對(duì)參數(shù)加了一個(gè)L1正則化約束。其形式如下所示:

          ???? 規(guī)約到線性回歸模型上,上式的第一項(xiàng)就是MSE損失,第二項(xiàng)則是L1正則化項(xiàng)。我們同樣按照之前線性回歸的打法來(lái)對(duì)其進(jìn)行實(shí)現(xiàn),只是需要注意一下L1正則化項(xiàng)的求導(dǎo)處理。我們來(lái)看具體的實(shí)現(xiàn)代碼。


          導(dǎo)入相關(guān)package并讀入示例數(shù)據(jù):

          import numpy as npimport pandas as pd
          data?=?np.genfromtxt('mystery.dat',?delimiter?=?',')# 選擇特征與標(biāo)簽x = data[:,0:100] y = data[:,100].reshape(-1,1)# 加一列X = np.column_stack((np.ones((x.shape[0],1)),x))
          # 劃分訓(xùn)練集與測(cè)試集X_train, y_train = X[:70], y[:70]X_test, y_test = X[70:], y[70:]print(X_train.shape,?y_train.shape,?X_test.shape,?y_test.shape)


          定義參數(shù)初始化函數(shù):

          # 定義參數(shù)初始化函數(shù)def initialize(dims):    w = np.zeros((dims, 1))    b = 0    return w, b


          定義符號(hào)函數(shù)并進(jìn)行向量化,用于對(duì)L1正則化項(xiàng)的梯度計(jì)算:

          # 定義符號(hào)函數(shù)def sign(x):    if x > 0:        return 1    elif x < 0:        return -1    else:        return 0?# 利用numpy對(duì)符號(hào)函數(shù)進(jìn)行向量化vec_sign = np.vectorize(sign)vec_sign(np.zeros((3,1)))?


          在MSE損失函數(shù)的基礎(chǔ)上定義Lasso損失:

          # 定義lasso損失函數(shù)def l1_loss(X, y, w, b, alpha):    num_train = X.shape[0]    num_feature = X.shape[1]    y_hat = np.dot(X, w) + b    loss = np.sum((y_hat-y)**2)/num_train + np.sum(alpha*abs(w))    dw = np.dot(X.T, (y_hat-y)) /num_train + alpha * vec_sign(w)    db = np.sum((y_hat-y)) /num_train    return y_hat, loss, dw, db


          定義Lasso訓(xùn)練過(guò)程函數(shù):

          # 定義訓(xùn)練過(guò)程def lasso_train(X, y, learning_rate=0.01, epochs=300):    loss_list = []    w, b = initialize(X.shape[1])    for i in range(1, epochs):        y_hat, loss, dw, db = l1_loss(X, y, w, b, 0.1)        w += -learning_rate * dw        b += -learning_rate * db        loss_list.append(loss)                if i % 50 == 0:            print('epoch %d loss %f' % (i, loss))        params = {            'w': w,            'b': b        }        grads = {            'dw': dw,            'db': db        }    return loss, loss_list, params, grads?

          執(zhí)行訓(xùn)練:

          # 執(zhí)行訓(xùn)練示例loss, loss_list, params, grads = lasso_train(X_train, y_train, 0.01, 500)

          ?



          可以看到,在L1的約束下,在訓(xùn)練過(guò)程中有不少對(duì)標(biāo)簽貢獻(xiàn)率低的特征的系數(shù)都變成了0。這就是L1的作用,一定程度上可以進(jìn)行特征選擇和實(shí)現(xiàn)稀疏化。


          最后可以簡(jiǎn)單寫(xiě)一個(gè)Lasso回歸的class來(lái)對(duì)上述過(guò)程進(jìn)行封裝:

          import numpy as npfrom sklearn.metrics import r2_score

          class Lasso(): def __init__(self): pass def prepare_data(self): data = np.genfromtxt('./example.dat', delimiter = ',') x = data[:, 0:100] y = data[:, 100].reshape(-1, 1) X = np.column_stack((np.ones((x.shape[0], 1)), x)) X_train, y_train = X[:70], y[:70] X_test, y_test = X[70:], y[70:] return X_train, y_train, X_test, y_test def initialize_params(self, dims): w = np.zeros((dims, 1)) b = 0 return w, b
          def sign(self, x): if x > 0: return 1 elif x < 0: return -1 else: return 0???????? def l1_loss(self, X, y, w, b, alpha): num_train = X.shape[0] num_feature = X.shape[1] y_hat = np.dot(X, w) + b loss = np.sum((y_hat - y) ** 2) / num_train + np.sum(alpha*abs(w)) dw = np.dot(X.T, (y_hat - y)) / num_train + alpha*np.vectorize(self.sign)(w) db = np.sum((y_hat - y)) / num_train return y_hat, loss, dw, db def lasso_train(self, X, y, learning_rate, epochs): loss_list = [] w, b = self.initialize_params(X.shape[1]) for i in range(1, epochs): y_hat, loss, dw, db = self.l1_loss(X, y, w, b, 0.1) w += -learning_rate * dw b += -learning_rate * db loss_list.append(loss) if i % 300 == 0: print('epoch %d loss %f' % (i, loss)) params = { 'w': w, 'b': b } grads = { 'dw': dw, 'db': db } return loss, loss_list, params, grads def predict(self, X, params): w = params['w'] b = params['b'] y_pred = np.dot(X, w) + b return y_pred????if __name__ == '__main__': lasso = Lasso() X_train, y_train, X_test, y_test = lasso.prepare_data() loss, loss_list, params, grads = lasso.lasso_train(X_train, y_train, 0.01, 3000) print(params) y_pred = lasso.predict(X_test, params) print(r2_score(y_test, y_pred))


          以上是基于numpy的手動(dòng)實(shí)現(xiàn)Lasso的過(guò)程,下面再來(lái)看Lasso在sklearn中的實(shí)現(xiàn)。

          # 導(dǎo)入線性模型模塊from sklearn import linear_model# 創(chuàng)建lasso模型實(shí)例sk_lasso = linear_model.Lasso(alpha=0.1)# 對(duì)訓(xùn)練集進(jìn)行擬合sk_lasso.fit(X_train, y_train)# 打印模型相關(guān)系數(shù)print("sklearn Lasso intercept :", sk_lasso.intercept_)print("\nsklearn Lasso coefficients :\n", sk_lasso.coef_)print("\nsklearn Lasso number of iterations :", sk_lasso.n_iter_)



          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 66
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美淫秽视频免费看 | 免费大片www | 成人免费做爱视频 | 99视频精品在线 | 日本日p视频 |