數(shù)據(jù)科學(xué)簡介:通過對數(shù)據(jù)分類進(jìn)行預(yù)測(二)
你可以從原始數(shù)據(jù)提取出的一種關(guān)鍵價值是,能夠構(gòu)建一個可用于預(yù)測或分類的模型。應(yīng)用此模型,您可以將觀察值轉(zhuǎn)換為具有明顯價值的預(yù)測或分類。本教程延續(xù)了第 1 部分:“數(shù)據(jù)、結(jié)構(gòu)和數(shù)據(jù)科學(xué)管道”中引入的原則,探討兩種使用監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)的分類方法(一種預(yù)測形式)。
分類是機(jī)器學(xué)習(xí)算法的一種常見應(yīng)用。您可以使用監(jiān)督學(xué)習(xí)來實現(xiàn)預(yù)測和分類,使用以前的觀察值構(gòu)建一個模型,以便根據(jù)未見過的觀察值來預(yù)測結(jié)果。也可以使用無監(jiān)督學(xué)習(xí)來實現(xiàn)這一過程,將觀察值聚類到集合中,以便根據(jù)與新觀察值最接近的集群來預(yù)測它們的行為。
機(jī)器學(xué)習(xí)已成功應(yīng)用于許多預(yù)測和分類問題,包括航班晚點(diǎn)、信用評分和股票價格。在這里,我將探討兩種重要算法:概率神經(jīng)網(wǎng)絡(luò)和基于密度的聚類 (DBSCAN)。
概率神經(jīng)網(wǎng)絡(luò)
概率神經(jīng)網(wǎng)絡(luò) (PNN) 是 1966 年創(chuàng)建的,類似于我在“神經(jīng)網(wǎng)絡(luò)深入剖析”中討論的反向傳播(back-propagation)神經(jīng)網(wǎng)絡(luò)。二者都是多層的前饋神經(jīng)網(wǎng)絡(luò),但 PNN 不依靠誤差反向傳播,它采用了一種不同的訓(xùn)練方法。您可以使用 PNN 執(zhí)行模式識別、聚類、分類,以及預(yù)測。
PNN 架構(gòu)
PNN 是一種監(jiān)督學(xué)習(xí)方法,依賴于一個包含標(biāo)簽(用于標(biāo)識每個觀察值的類)的訓(xùn)練集。PNN 由 4 層組成,如下所示。
圖 1. PNN 架構(gòu)

輸入層 (input layer) 代表輸入矢量,具有一個包含問題的特征數(shù)量的維度。模式層 (pattern layer) 也稱為隱藏層,由訓(xùn)練數(shù)據(jù)集中每個觀察值對應(yīng)的神經(jīng)元組成。模式神經(jīng)元計算離訓(xùn)練樣本(由神經(jīng)元表示)的歐氏距離,并將該距離表示為該類的特征矢量圖心的輸入特征矢量。匯總層 (summation layer) 包含該數(shù)據(jù)集表示的每個類所對應(yīng)的神經(jīng)元。顧名思義,匯總層中的神經(jīng)元會計算出它們所代表的特定類的模式層神經(jīng)元的輸出之和(其中包括一個基于該類的觀察值數(shù)量的平均值)。***,輸出層,也稱為決策層 (decision layer),實現(xiàn)了一種贏家通吃的方法:它識別匯總層中具有***值的類神經(jīng)元。然后,這個類表示了所預(yù)測的輸入矢量的類。
PNN 算法
您很快就會在一段代碼中看到,訓(xùn)練和使用 PNN 的算法很簡單。不需要訓(xùn)練,因為計算一個預(yù)測值只需迭代整個數(shù)據(jù)集來計算匯總層中的神經(jīng)元。與之相反,在傳統(tǒng)的反向傳播中,會在訓(xùn)練每個觀察值之后調(diào)整權(quán)重值。因此,反向傳播網(wǎng)絡(luò)使用起來可能更快,但花費(fèi)的訓(xùn)練時間可能更長(根據(jù)一個關(guān)于數(shù)據(jù)集大小的函數(shù))。
該流程從一個示例特征矢量(表示您希望預(yù)測其類的觀察值)和包含帶標(biāo)簽觀察值的數(shù)據(jù)集開始。對于匯總層中的每個神經(jīng)元(表示一個類),可以迭代該數(shù)據(jù)集,并計算該類的示例特征矢量和每個數(shù)據(jù)集觀察值的平方和,然后應(yīng)用一個平滑系數(shù)。當(dāng)利用數(shù)據(jù)集中表示的(該類的)觀察值計算了所有匯總神經(jīng)元后,會通過贏者通吃的方法選擇***的值。這個類表示了該示例的預(yù)測類。
PNN 實現(xiàn)
可以在 GitHub 上找到這個 PNN 的完整實現(xiàn)。清單 1 提供了分類器函數(shù),該函數(shù)接受一個示例觀察值并返回它應(yīng)該屬于的類(預(yù)測結(jié)果)。正如前面所討論的,此代碼從匯總層開始,使用示例觀察值來計算該類中包含的數(shù)據(jù)集觀察值的匯總神經(jīng)元。然后將匯總神經(jīng)元傳遞給一個名為 winner_takes_all 的函數(shù),該函數(shù)只確定哪個神經(jīng)元具有***值(贏者)。
清單 1. PNN 分類器的 C 代碼

在我為 PNN 提供一些數(shù)據(jù)用于預(yù)測時,您就可以看到它的實際效果。在本例中,我返回到我的動物園數(shù)據(jù)集,其中包含一組基于動物特征(毛發(fā)、羽毛、產(chǎn)卵情況、空氣傳播等)的動物。我將構(gòu)造一些樣本觀察值,以查看該算法對類(哺乳動物、昆蟲、兩棲動物等)的預(yù)測結(jié)果。清單 2 提供了該數(shù)據(jù)集的元數(shù)據(jù)(特征矢量描述和類描述)。
清單 2. 動物園數(shù)據(jù)集元數(shù)據(jù)

清單 3 給出了示例特征矢量的樣本代碼,以及用于演示使用 PNN 分類器的類預(yù)測結(jié)果的輸出。此輸出表明,一種有牙齒的跳蚤仍是昆蟲;一種有毛發(fā)的掠食動物是哺乳動物;一種水生的、產(chǎn)卵的、有 6 條腿的動物是無脊椎動物。
清單 3. 特征矢量和預(yù)測示例

基于數(shù)據(jù)的聚類
DBSCAN 創(chuàng)建于 1996 年,是一種可自動確定自然集群數(shù)量的簡單聚類方法。該方法能夠以可靠方式處理異常樣本(DBSCAN 稱之為噪聲)??梢栽?ldquo;用于數(shù)據(jù)分類的無監(jiān)督學(xué)習(xí)”中進(jìn)一步了解聚類算法。DBSCAN 最初被定義為用在數(shù)據(jù)庫中,因識別(大小和形狀)不規(guī)則的集群而聞名,而且適用于 k-均值無法順利實現(xiàn)聚類的數(shù)據(jù)。
DBSCAN 是無監(jiān)督的,它嘗試使用數(shù)據(jù)的隱藏特征來提供數(shù)據(jù)結(jié)構(gòu)。它使用了兩個參數(shù):最少的點(diǎn)數(shù)和 epsilon 距離。
DBSCAN 算法
DBSCAN 處理一個多維空間中的點(diǎn)。每個點(diǎn)由一個特征矢量表示,而且給定了兩個矢量,您可以使用一個指標(biāo)來計算它們之間的距離(比如歐氏距離)。
該算法從一個點(diǎn)開始,您可以識別離原始點(diǎn)給定距離(稱為 epsilon 距離)內(nèi)的鄰近點(diǎn)數(shù)量。如果鄰近點(diǎn)數(shù)量滿足或超出了閾值(稱為最少點(diǎn)數(shù)或 MINPTS),則將這個點(diǎn)稱為核心點(diǎn),并將它與一個新集群相關(guān)聯(lián)。否則,會將這個點(diǎn)標(biāo)為噪聲。對于每個鄰近點(diǎn)(稱為密度可達(dá)點(diǎn)),只要它繼續(xù)滿足條件(離此點(diǎn) epsilon 距離內(nèi)的 MINPTS 點(diǎn)),就繼續(xù)執(zhí)行此操作并對它執(zhí)行聚類。如果您到達(dá)一個沒有密度可達(dá)點(diǎn)的點(diǎn),那么可以將該點(diǎn)包含在集群中,但不使用超過此點(diǎn)的點(diǎn)來合并新點(diǎn)。
任何不滿足條件(epsilon 距離內(nèi)的 MINPTS)的點(diǎn)都被定義為噪聲,但是,如果發(fā)現(xiàn)它們是一個集群中另一個點(diǎn)的密度可達(dá)點(diǎn),那么最終可以將它們移動到該集群中。
讓我們在圖 2 的上下文中看看此流程。首先在左圖中(名為 Start),我挑選了一個點(diǎn)并檢查它的鄰近點(diǎn)。如果 MINPTS == 2,我的點(diǎn)滿足此條件并被添加到集群中。我們添加了兩個鄰近(密度可達(dá))點(diǎn)用于測試,并繼續(xù)執(zhí)行該流程。只要每個點(diǎn)在 epsilon 距離內(nèi)至少有兩個鄰近點(diǎn),它們就會被添加到集群中并稱為核心點(diǎn))。密度可達(dá)但本身不滿足密度標(biāo)準(zhǔn)的點(diǎn)是非核心點(diǎn)(例如藍(lán)色的點(diǎn))。該算法在右側(cè)結(jié)束(名為 End)。綠色的點(diǎn)(核心點(diǎn))和藍(lán)色的點(diǎn)(非核心點(diǎn),但密度可達(dá))都包含在集群中。右上角的紅色點(diǎn)是異常值,被視為噪聲。
圖 2. 完整的 DBSCAN 流程

接下來,我將介紹 DBSCAN 實現(xiàn)的核心。
DBSCAN 實現(xiàn)
可以在 GitHub 上找到這個 DBSCAN 實現(xiàn)。現(xiàn)在我們探討一下實現(xiàn)該算法的核心的兩個關(guān)鍵函數(shù)。剩余函數(shù)處理距離計算和鄰近點(diǎn)內(nèi)存管理。
dbscan 函數(shù)(參見清單 4)實現(xiàn)了聚類算法的外部循環(huán)。它迭代數(shù)據(jù)集,確定觀察值是否滿足密度函數(shù)(epsilon 距離內(nèi)的 MINPTS 觀察值)。如果不滿足,則將該觀察值標(biāo)為噪聲;否則,會創(chuàng)建一個集群并處理它的鄰近點(diǎn)。
清單 4. 主 dbscan 函數(shù)

process_neighbor 函數(shù)(參見清單 5)圍繞一個滿足密度限制的點(diǎn)構(gòu)建一個集群。它迭代鄰近點(diǎn)列表(稱為種子集),查看它們是否在當(dāng)前集群內(nèi)。以前定義為噪聲的觀察值會被加載到該集群中,已加載到該集群中的觀察值會被忽略。然后檢查當(dāng)前(未被忽略的)觀察值的鄰近點(diǎn);此觀察值的所有(滿足此條件的)鄰近點(diǎn)都會加載到種子集中,以針對此集群進(jìn)行檢查。這個過程會一直持續(xù)到?jīng)]有新觀察值被加載到種子集中,并且種子集中的所有觀察值都已檢查。返回時,dbscan 函數(shù)會挑選下一個觀察值并繼續(xù)執(zhí)行該流程(可能添加新的集群)。
清單 5. 密度可達(dá)點(diǎn)之后的 process_neighbor 函數(shù)

在不到 50 行的核心 C 代碼中,我創(chuàng)建了一個簡單的聚類解決方案,它與更傳統(tǒng)的方法相比具有明顯優(yōu)勢??紤]使用前面的動物園數(shù)據(jù)集的 DBSCAN:必須調(diào)整 DBSCAN 來選擇正確的 MINPTS 和 epsilon。在這個示例中,我選擇了 epsilon = 1.7 和 MINPTS = 4。通過這些參數(shù),DBSCAN 創(chuàng)建了 6 個類,14 個觀察值是噪聲,整體準(zhǔn)確率為 74%。它***地對鳥和魚的類別進(jìn)行了聚類,但將哺乳動物集群拆分為一個大型集群和一個小型集群。
使用前面的測試案例,它將“flea with teeth”和“six-legged aquatic egg layer”都劃分到昆蟲類別中,將“predator with hair”劃分為噪聲。調(diào)整 epsilon 距離和 MINPTS 參數(shù)可以提高此數(shù)據(jù)集的準(zhǔn)確率。
結(jié)束語
預(yù)測和分類是機(jī)器學(xué)習(xí)的兩個有許多應(yīng)用的重要方面。從預(yù)測消費(fèi)者的行為(基于他們對類似消費(fèi)者的分類)到預(yù)測保險政策的風(fēng)險(基于描述政策和申請者的特征),通過分類進(jìn)行預(yù)測是一個真實的機(jī)器學(xué)習(xí)應(yīng)用示例。