丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給恒亮
發(fā)送

0

通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些

本文作者: 恒亮 2017-03-13 17:02
導(dǎo)語:看到樣例中的代碼,你是直接復(fù)制粘貼?還是手動輸入?

雷鋒網(wǎng)按:本文源自作者 Jean-Nicholas Hould 的個人博客,他是一位來自加拿大蒙特利爾的數(shù)據(jù)科學(xué)家,具有豐富的研發(fā)和實踐經(jīng)驗。本文節(jié)選自作者個人的學(xué)習(xí)筆記,原文見文末鏈接,雷鋒網(wǎng)編譯。

對許多剛?cè)腴T機(jī)器學(xué)習(xí)的開發(fā)者而言,許多參數(shù)和定義都顯得抽象、難以理解,可能許多人直到開始進(jìn)入實際的項目研發(fā),都還沒能真正搞清楚這些參數(shù)和定義的確切含義。為此,我在這里故意避開 scikit-learn 等現(xiàn)成的算法工具,從零開始自己用 Python 實現(xiàn)了一個感知機(jī)二元分類器,一方面通過實際代碼深入認(rèn)識了感知機(jī)的內(nèi)部原理和相關(guān)參數(shù)的具體含義,另一方面也總結(jié)了一些自己的研發(fā)心得,希望對各位初學(xué)者有所幫助。

  什么是二元分類器(Binary Classifier)?

通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些

分類器是基于一組特征來確定輸入元素所在類別的機(jī)器學(xué)習(xí)算法。例如,分類器可以根據(jù)一些既定特征,預(yù)測一個啤酒的類別。這些特征可以是酒精含量、香氣和外觀等。更詳細(xì)一點,例如一個基于機(jī)器學(xué)習(xí)的分類器,根據(jù) 8% 的酒精含量、100 IBU (International Bitterness Unit,國際苦味指數(shù))和強(qiáng)烈橙子香味,就能判斷一種啤酒是不是 Indian Pale Ale 。

一般來說,機(jī)器學(xué)習(xí)可以分為三個主要的類型:無監(jiān)督學(xué)習(xí),監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)。分類器屬于監(jiān)督學(xué)習(xí)的范疇。所謂監(jiān)督學(xué)習(xí)就是我們提前知道待解問題的答案,即期望的輸出是已知的那些場景。例如在上述關(guān)于啤酒分類的例子中,我們完全可以想辦法得到一組描述啤酒各種特征和類別的數(shù)據(jù)集,然后基于這組數(shù)據(jù)對分類器展開訓(xùn)練。

這里我將實現(xiàn)的是一個二元分類器,是所有分類器中最簡單的一種,其輸出結(jié)果只有兩種:0 或 1 ,對或錯。

  怎么搭建機(jī)器學(xué)習(xí)模型?

概括地說,要搭建和使用一個機(jī)器學(xué)習(xí)模型,一般分為如下四個步驟:

1. 預(yù)處理

2. 訓(xùn)練

3. 評估

4. 預(yù)測

通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些

預(yù)處理

預(yù)處理是構(gòu)建機(jī)器學(xué)習(xí)模型的第一步,該步驟的主要工作是獲取數(shù)據(jù),并對數(shù)據(jù)進(jìn)行必要的預(yù)處理,以備后續(xù)使用。包括去掉數(shù)據(jù)中的冗余、格式整理以及選定與數(shù)據(jù)相關(guān)的特征等。預(yù)處理中的常見工作包括:

從原始數(shù)據(jù)中提取特征

清理并格式化數(shù)據(jù)

刪除多余的特征(或高度相關(guān)的特征)

優(yōu)化特征數(shù)

標(biāo)準(zhǔn)化特征數(shù)據(jù)的范圍(也稱為特征縮放 Feature Scaling )

隨機(jī)拆分?jǐn)?shù)據(jù)集:訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集

訓(xùn)練

準(zhǔn)備好數(shù)據(jù)之后,下一步是為目標(biāo)任務(wù)選擇一個合適的算法。在下面的二元分類器中,我們選擇的算法名為感知機(jī)(perceptron)。通常各種算法都有各自的優(yōu)缺點,要根據(jù)目標(biāo)任務(wù)靈活選擇。

在這個步驟中,你可以先針對幾個不同算法展開測試,然后根據(jù)測試結(jié)果選擇性能最佳的算法。評估一個算法性能表現(xiàn)的方法有很多,在分類器場景中,一個最常用的方法是看分類精度(classification accuracy),即在所有輸入樣例中,正確分類的比例越高,算法就越優(yōu)秀。在這個步驟中,開發(fā)者需要調(diào)整選定算法的參數(shù),即所謂的超參數(shù)(Hyperparameters)過程。

本文將主要關(guān)注二元分類器的訓(xùn)練過程,深入探討算法的內(nèi)在工作原理。如果你對機(jī)器學(xué)習(xí)流程中的其他步驟感興趣,可以通過文末鏈接閱讀更多其他內(nèi)容。

評估

當(dāng)模型訓(xùn)練完成之后,就可以通過訓(xùn)練數(shù)據(jù)集之外的未知數(shù)據(jù)對模型展開評估。評估中一個非常重要的指標(biāo)是泛化誤差(Generalization Error),即一個算法面對未知數(shù)據(jù)集的預(yù)測精度究竟怎樣。一旦你對評估結(jié)果滿意,就可以通過模型進(jìn)行真正的預(yù)測了。

  實現(xiàn)感知機(jī)

下面開始搭建我們的分類器。這里我們選用的算法是感知機(jī)(perceptron),它是神經(jīng)網(wǎng)絡(luò)與支持向量機(jī)的基礎(chǔ),是一種最簡單的二元分類器模型。Perceptron算法的思路雖然簡單,但功能強(qiáng)大,給定一個數(shù)據(jù)集,算法可以自動學(xué)習(xí)最佳權(quán)重系數(shù),然后乘以輸入特征,根據(jù)結(jié)果決定一個神經(jīng)元是否啟用。

下面我們根據(jù)具體代碼簡述感知機(jī)模型的基本實現(xiàn)流程。

首先,初始化一個權(quán)重等于零的數(shù)組,數(shù)組長度等于特征數(shù)加1。這里之所以加1,是為了存儲“閾值”(threshold)。這里需要注意的是,Perceptron算法要求特征必須是數(shù)字值。具體代碼如下:

self.w_ = np.zeros(1 + X.shape[1])

第二步,開始一個迭代次數(shù)為 n_iter 的循環(huán)。這是一個由數(shù)據(jù)科學(xué)家定義的超參數(shù)。具體代碼如下:

for _ in range(self.n_iter):

第三步,針對每個訓(xùn)練數(shù)據(jù)和結(jié)果都開始一個循環(huán),這里的結(jié)果是指算法的最終期望輸出。由于我們搭建的是一個二元分類器,因此結(jié)果是 -1 或 1 兩種。

基于數(shù)據(jù)點的特征,算法將計算出最終結(jié)果:-1 或 1 。這里的預(yù)測方法具體是指特征與適當(dāng)權(quán)重的矩陣乘積。在乘積的基礎(chǔ)上加上此前定義好的閾值,如果結(jié)果大于 0 ,則預(yù)測為 1 ,否則為 -1.

算法可以根據(jù)每次迭代得到的預(yù)測結(jié)果的準(zhǔn)確性靈活調(diào)整權(quán)重。在迭代的初期,預(yù)測結(jié)果一般不太可能是準(zhǔn)確的,因為權(quán)重沒有被調(diào)整過,也就不會收斂。需要注意的是,調(diào)整操作與目標(biāo)值、預(yù)測值之間的差成比例,這個差值需要乘以 eta。這里 eta 是數(shù)據(jù)科學(xué)家定義的另一個超參數(shù),介于 0 和 1 之間,eta 的值越大,權(quán)重的校正就越多。最終當(dāng)預(yù)測結(jié)果準(zhǔn)確時,就會停止調(diào)整權(quán)重的過程。具體代碼如下:

self.w_ = np.zeros(1 + X.shape[1])

for _ in range(self.n_iter):

    for xi, target in zip(X, y):

        update = self.eta * (target - self.predict(xi))

        self.w_[1:] += update * xi

        self.w_[0] += update

def net_input(self, X):

    """Calculate net input"""

    return np.dot(X, self.w_[1:]) + self.w_[0]

def predict(self, X):

    """Return class label after unit step"""

    return np.where(self.net_input(X) >= 0.0, 1, -1)     

在代碼中,只有當(dāng)兩個類別是線性可分時,感知機(jī)模型才會收斂。簡單說就是:如果你能畫一條直線來完全分離兩個類,算法才會收斂。否則,算法將一直迭代下去,并將重新調(diào)整權(quán)重,直到循環(huán)達(dá)到最大次數(shù) n_iter。

通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些

以上感知機(jī)的完整代碼如下所示:

通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些

通過以上實踐,我有如下幾點收獲:

  收獲1:參數(shù)的理解

如果你直接調(diào)用 scikit-learn 等工具來實現(xiàn)感知機(jī),那么像學(xué)習(xí)率和迭代次數(shù)這些參數(shù)就會顯得很抽象,因為你只需要把它們填到 API 接口里,然后就得到了結(jié)果,完全不清楚這些參數(shù)的實際意義。但是如果你試著自己寫代碼來實現(xiàn),例如自己實現(xiàn)一個感知機(jī),那么這些參數(shù)的含義就一目了然。

學(xué)習(xí)率

例如學(xué)習(xí)率,就是指當(dāng)預(yù)測不準(zhǔn)確時權(quán)重被校正的比例,該值必須介于 0 和 1 之間。如下代碼所示,fit 函數(shù)將對每個觀察結(jié)果進(jìn)行迭代,調(diào)用 predict 函數(shù),然后根據(jù)目標(biāo)和預(yù)測值之間的差異調(diào)整權(quán)重,然后乘以學(xué)習(xí)率。

更高的學(xué)習(xí)率意味著算法將更積極地調(diào)整權(quán)重。每次迭代都會根據(jù)預(yù)測值是否準(zhǔn)確重新調(diào)整權(quán)重值。

# Partial portion of the "fit" function

for xi, target in zip(X, y):

    update = self.eta * (target - self.predict(xi))

    self.w_[1:] += update * xi

    self.w_[0] += update

    errors += int(update != 0.0)

迭代次數(shù)

迭代次數(shù)是指算法在訓(xùn)練集中運行的總次數(shù)。如果迭代次數(shù)設(shè)為 1,則算法就只在數(shù)據(jù)集上運行一次,針對每個數(shù)據(jù)點只更新一次權(quán)重。這樣得到的模型相比較高迭代次數(shù)的模型,準(zhǔn)確率可能更低。在數(shù)據(jù)集的體量較大時,高迭代次數(shù)可能引起非常高迭代成本。

for _ in range(self.n_iter):

    errors = 0

    for xi, target in zip(X, y):

        update = self.eta * (target - self.predict(xi))

        self.w_[1:] += update * xi

        self.w_[0] += update

        errors += int(update != 0.0)

    self.errors_.append(errors)

學(xué)習(xí)度和迭代次數(shù)通常是相互關(guān)聯(lián)的,需要一起調(diào)整。例如,如果你的學(xué)習(xí)率很小,則意味著算法每次對權(quán)重的調(diào)整都很微小,那么可能就需要更多的迭代次數(shù)。

  收獲2:線性代數(shù)的重要性

其次,特別重要的一點是:不單是Perceptron算法,在整個機(jī)器學(xué)習(xí)領(lǐng)域,線性代數(shù)課程中的相關(guān)內(nèi)容都至關(guān)重要,因為整個算法都可以通過線性代數(shù)的相關(guān)公式來描述。而如果你從來沒有學(xué)過線性代數(shù)的相關(guān)知識,那么這些公式對你來說就是不可見的,也就不利于算法的理解和實現(xiàn)。因此,學(xué)好線性代數(shù)對開發(fā)機(jī)器學(xué)習(xí)和理解各種算法至關(guān)重要,這里推薦一個線性代數(shù)的在線教程,并且附帶練習(xí)。

教程地址:https://www.khanacademy.org/math/linear-algebra 

  收獲3:一種通用的學(xué)習(xí)方法

最后,我想通過以上 Perceptron 算法推薦一個通用的學(xué)習(xí)方法,即手動敲入代碼,拒絕簡單的復(fù)制粘貼。

早在2012年,當(dāng)我在學(xué)習(xí)編寫一個 Web 應(yīng)用時就體會到了手動敲入代碼的好處。當(dāng)時,我花了比別人多得多的時間跟著教程,一步一步把案例中的代碼手動敲入編輯器,而沒有選擇復(fù)制粘貼。這看起來很蠢,但不可否認(rèn)這種方法真的有用。因為不可避免的,在手動敲入這些代碼時你一定會引入錯誤,因此你敲完的代碼可能根本就運行不起來,也可能得到一些意想不到的錯誤,這時你就必須排查和修改代碼中的錯誤。其實,這個排查和修改的過程就是思考和學(xué)習(xí)的過程,通過這樣的過程,你會對整個代碼和教程中的知識點理解的更透徹,當(dāng)然也記得更清楚。

所以,如果你要學(xué)習(xí) Perceptron 算法,請不要直接復(fù)制和粘貼。試著將這些代碼手動敲入編輯器,然后編譯運行。更不要被動地閱讀,僅僅對著代碼讀來讀去,永遠(yuǎn)也成不了數(shù)據(jù)科學(xué)家,你必須參與進(jìn)去,主動修改和運行這些代碼,才能收獲的更多。

原文地址:http://www.jeannicholashould.com/what-i-learned-implementing-a-classifier-from-scratch.html 

深入閱讀:http://www.jeannicholashould.com/learning-machine-learning.html 

雷鋒網(wǎng)相關(guān)閱讀:

機(jī)器學(xué)習(xí)零基礎(chǔ)?手把手教你用TensorFlow搭建圖像分類器| 干貨

Python粉都應(yīng)該知道的開源機(jī)器學(xué)習(xí)框架:Scikit-learn入門指南

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

通過從零開始實現(xiàn)一個感知機(jī)模型,我學(xué)到了這些

分享:
相關(guān)文章

編輯

歡迎交流,微信:whl123465
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說