在Python中構建和改進K近鄰算法!

K近鄰算法,簡稱K-NN,是一種經典的機器學習工作算法,在進行深度學習的時候經常被忽略。在本教程中,我們將在Scikit-Learn中構建一個K-NN算法,並在MNIST數據集上運行它。在此基礎上,我們將建立自己的K-NN算法,希望能夠開發出比Scikit-Learn K-NN更好的分類精度和分類速度。

現在讓我們一起開始這項旅程!

K-近鄰分類模型

在Python中構建和改進K近鄰算法!

K-最近鄰算法是一種有監督的機器學習算法,其易於實現,並且具有進行可靠分類的能力。 K-NN最大的優點之一就是它是一種惰性學習方法。這意味著該模型不需要訓練,並且可以對數據進行分類,而不像其他機器學習的兄弟姐妹,如SVM、迴歸和多層感知。

K-NN如何工作

為了對某個給定的數據點p進行分類,一個K-NN模型將首先使用一些距離度量將p與其數據庫中可用的每個其他點進行比較。距離度量是諸如歐幾里得距離之類的東西,一個簡單的函數,它取兩點,並返回這兩點之間的距離。因此,可以假設它們之間距離較小的兩個點,它們之間的距離就越接近於兩個點。這是K-NN背後的核心思想。

這個過程將返回一個無序數組,其中數組中的每個條目都保持在模型數據庫中,p和n個數據點之間的距離。所以返回的數組的大小為n。這就是K近鄰進來的一部分:K是選擇的一些任意值(通常3-11之間),它告訴模型在分類p時應該考慮多少最相似的點。然後模型將採用k個最相似的值,並使用投票技術來決定如何對p進行分類,如下圖所示。

在Python中構建和改進K近鄰算法!

圖像中的K-NN模型的k值為3,而箭頭指向中心的點為p,這是需要分類的點。正如你所看到的,圓圈中的三個點是最接近的3個點,或者是與p最接近的點。因此,使用簡單的投票技術,p將被歸類為“白色”,因為白色會構成k個最相似值中的大多數。

令人驚訝的是,這個簡單的算法可以在某些情況下實現超人的結果,並且可以應用於各種各樣的問題,我們將在接下來的討論中看到。

在Scikit-Learn中實現K-NN算法以分類,並對MNIST圖像進行分類

數據:

對於這個例子,我們將使用無處不在的MNIST數據集。 MNIST數據集是機器學習中最常用的數據集之一,因為它很容易實現,而且可以作為驗證模型的可靠方法之一。

在Python中構建和改進K近鄰算法!

MNIST是一組70,000個手寫數字編號為0-9的數據集。沒有兩個手寫數字是完全相同的,有些可能很難正確分類。 MNIST分類的人類基準準確率約為97.5%,因此我們的目標是打敗它!

算法:

我們將使用Scikit-Learn Python庫中的KNeighborsClassifier()來啟動。這個函數需要很多參數,但在這個例子中我們只需要擔心幾個參數。具體來說,我們只會傳遞n_neighbors參數的值(這是k值)。權重參數給出了模型使用的投票系統的類型,其中默認值是一致的,這意味著在對p進行分類時k個點中的每一個都被相等地加權。算法參數也將保留為默認值,因為我們希望Scikit-Learn找到用於對MNIST數據本身進行分類的最佳算法。

下面,我嵌入了一個用Scikit-Learn構建K-NN分類器的Jupyter Notebook。

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

我們使用Scikit-Learn構建了一個非常簡單的K近鄰模型,該模型在MNIST數據集上表現不錯。

那麼分類這些點需要很長時間(兩個數據集分別為8分鐘和4分鐘),具有諷刺意味的是,K-NN仍然是最快的分類方法之一。

建立更快的模型

大多數K-NN模型使用歐幾里德距離或曼哈頓距離作為前往距離度量。這些指標非常簡單,適用於各種各樣的情況。

很少使用的一個距離度量是餘弦相似度。餘弦相似度通常不是最優的距離度量,因為它違反了三角不等式,並且不適用於負數據。但是,餘弦相似性對於MNIST是完美的。它快速、簡單,並且比MNIST上的其他距離度量準確度稍高。但要真正實現最佳性能,我們必須編寫我們自己的K-NN模型。在我們自己製作K-NN模型之後,我們應該比Scikit-Learn模型獲得更好的性能,並且可能是更好的準確性。讓我們看看下面我們建立的自己的K-NN模型的筆記本。

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

在Python中構建和改進K近鄰算法!

正如筆記本所示,我們自己製作的K-NN模型在分類速度(相當大的保證金)和準確性(一個數據集提高1%)方面都優於Scikit-Learn K-NN!現在,我們可以在實踐中繼續實施這個模型,因為現在已經開發了一個真正快速的算法。

結論

在以上繁瑣的步驟中,我們學到了一些寶貴的經驗教訓。首先,我們瞭解了K-NN如何工作,以及如何輕鬆實施。但最重要的是,我們瞭解到始終要考慮你嘗試解決的問題以及解決該問題的工具非常重要。有時候,最好花一些時間來試驗。當然,在解決問題時,一定要建立你自己的模型。正如在筆記本中所證明的那樣,它可以支付巨大的紅利:我們的第二個專有模型使用了1.5-2倍的加速,節省了使用該模型的實體的很多時間。


分享到:


相關文章: