天天看點

【原創】.NET平台機器學習元件-Infer.NET連載(二)貝葉斯分類器關于本文檔的說明1.Infer.NET貝葉斯分類器介紹2.性别預測介紹3.資料和映射4.建立貝葉斯分類器,并訓練,預測和評估5.資源

  歡迎傳播分享,必須保持原作者的資訊,但禁止将該文檔直接用于商業盈利。

  本人正在研究基于infer.net元件,并計劃将其應用于實際的預測之中,該元件功能強大,封裝很完善,但也有很多難以了解的地方,同時官方也給出了大量的例子,限于個人精力有限,更新時間較慢,也希望有興趣的朋友一起來完成該項工作。

  本教程提供了一個簡短的,循序漸進的介紹如何使用c# api建立、訓練和測試一個貝葉斯機分類器的過程。如果你隻是想嘗試使用貝葉斯機器分類器,你可以提供資料一個特定格式文本檔案,不用擔心最終的性能,可以參考一下指令行的使用。

  本項目使用的貝葉斯分類器是基于infer.net api建構的,源碼等資料在本文最後的資源資訊。

  本教程的目的,讓我們假設我們要根據一組給人身高和體重的資料來預測一個人的性别。讓我們進一步假設我們已經收集到的樣本大小為n=1000,而我們知道的性别作為标簽樣本單獨存放。下面圖是樣本資料可視化的結果:

  

【原創】.NET平台機器學習元件-Infer.NET連載(二)貝葉斯分類器關于本文檔的說明1.Infer.NET貝葉斯分類器介紹2.性别預測介紹3.資料和映射4.建立貝葉斯分類器,并訓練,預測和評估5.資源

  解決這類問題的一個方法是建立一個機率模型。infer.net允許您使用各種各樣的模型。在描述了這個分類問題後,我們已經給你準備了一個完整和穩定的模型,是以你不需要做這個工作。然而,我們建立的貝葉斯機器(bpm)分類器,必須要有一些前提條件,這些你可能要搞清楚。如果這些假設不滿足你的情況,你自己可以考慮建立一個更符合你實際情況的機率模型。樣本資料中包含508名女性(紅色)和508名男性(藍色)。樣本中的女性平均身高是162厘米,男性平均身高為175.2厘米。女性平均體重為70.1公斤,男性平均體重為83.8公斤。正如人們所預料的,該圖的中,兩組資料的顯示有很大的重疊,這意味着給定一個人的身高和體重,并不能完全的區分為男性或者女性。現在,根據這些資料,那麼一個身高183厘米,體重78公斤的人是一個女人的可能性大嗎?

   使用visual studio建立項目,并添加下面幾個dll引用:infer.learners.dll,infer.learners.classifier.dll,infer.runtime.dll。這個過程比較簡單,基本忽略。

  針對上述提供的資料。每個人的身高和體重是以向量執行個體存儲在記憶體中的,相應的性别以字元串類型對象表示的,其值是“女性”或“男性”。是以整個樣本,包含個數是1000的向量數組對象和1000個字元串類型對象。

相關說明:

  1.貝葉斯機器分類器模型并不顯式地指定一個預期結果。然而,在許多分類問題中,添加一個預期結果是至關重要的,因為它使得貝葉斯分類器以固定的特性轉換特征(決策邊界不需要原始資料特征),進而顯著的影響預測性能[翻譯不太準确]。bpm可以實作添加預期值的功能,使其總有1這個值。如果你的分類資料還不包括這樣一個常數特征值,你應該很想将它添加到特征向量中。

  2.如果特性(包括預期值)是高度相關的,貝葉斯機器分類器的訓練可能出現收斂速度慢的情況。

  在上述性别預測的例子中,我們可以使用了一個增強的三維特征向量,不僅包含一個人的身高和體重,還有額外的特征值為1。此外,讓我們在原始資料中減去平均身高和平均體重,這就消除身高、體重和預期值之間的相關性。

  資料可以存儲在各種不同的格式中。通常的您的資料格式都和學習者learner所預期要求的資料類型都不一緻。這意味着您必須将原始資料轉化為學習者的格式。這在一些小的用例測試中,當然是一個合理的選擇,但對于大型的真實資料集,這種轉換代價是非常大的。是以為了避免使用者輸入固定類型的資料,infer.net提供了一個靈活的機制,允許您指定學習者應該如何使用他們的輸入資料。這種機制被稱為映射。一個映射定義輸入資料是如何傳遞到infer.net的學習者中的。因為它讓你選擇最友善的格式,它有助于避免不必要的資料轉換。

  貝葉斯機器分類器中有兩種不同類型的映射,詳細可以參考mappings類。在我們簡單介紹的例子中,最簡單的将輸入資料映射到一個表單以便于貝葉斯分類器了解的方法是實作iclassifiermapping接口,如下所示:  

為了實作iclassifiermapping 接口,必須要實作以下幾點:

1.哪個是要分批交給分類器的對象?(getinstances);

2.如何擷取給定執行個體的特征值? (getfeatures);

3.如何擷取給定執行個體實際的标簽值? (getlabel);

4.擷取資料中所有不同類型标簽值,相當于标簽範圍(getclasslabels)。

有了手動建立的資料映射,就可以建立貝葉斯機器分類器,如下所示:

這樣,就可以使用分類器根據身高和體重去學習和預測性别。使用1000個樣本去訓練貝葉斯機器分類器,如下所示:

trainingset.featurevectors是一個包括身高和體重測量資料的向量數組,trainingset.labels是一個代表性别的預期标簽。

注意,訓練貝葉斯我們并不需要設定任何參數,如前置分布權重。這是因為貝葉斯機器分類器是無需超參數的(hyper-parameter)。這不僅避免了一些錯誤的參數設定,還可以自動移除一些影響運作時間的參數。更厲害的是:它甚至不需要規範化的資料輸入,貝葉斯機器分類器能夠自己自動适應不同尺度的觀察資料。這些都是通過heavy-tailed 前置分布權重設定的。

  使用訓練後的貝葉斯機器分類器,就能夠預測那些隻有身高和體重資料的人的性别。特别是,現在我們可以回答之前那個身高183厘米,體重178公斤的人是一個女人的可能性有多大。如下代碼:

testset.featurevectors是一個隻包含身高,體重以及預期值的向量數組。

調用predictdistribution在測試集中,給每個執行個體傳回一個伯努利分布,這個事實說明給定一個人的身高和體重,我們通常并不能完全确定一個人的性别。例如:

根據訓練集1000個樣本的觀測資料,這個身高183厘米,體重78公斤的人是女性的機率是7%。在許多情況下,您可能需要預測一個最終确定的答案,而不是調用predictdistribution,然後簡單地預測,給出機率,例如,我們可以這樣寫:

結果是:male

注意,這種精确的分類預測仍然需要計算預測分布作為一個中間步驟。此外,最佳的精确答案不一定是最有可能的類。

為了評價分類器的預測情況,我們需要利用一些不同于訓練集的有标簽的資料,是以我們假定我們可以得到一組100個額外的真實性别,體重和身高的測量記錄。一個評價過程要通過classifierevaluator進行,如下:

結果:accuracy = 0.85;auc = 0.926

classifierevaluator  also allows you to get the receiver operating characteristic curve itself (for "female" as the designated positive class):

【原創】.NET平台機器學習元件-Infer.NET連載(二)貝葉斯分類器關于本文檔的說明1.Infer.NET貝葉斯分類器介紹2.性别預測介紹3.資料和映射4.建立貝葉斯分類器,并訓練,預測和評估5.資源

  我們将在後續的文章中分享關于基于infer.net元件建構的貝葉斯機器分類器更多的功能和相關細節。

  本人手動制作了infer.net 2.6的幫助文檔,chm格式,還有貝葉斯分類器的相關代碼,

  檔案比較大,将通過郵箱與30日下午統一發送,需要的朋友留email。 

      如果您看完本篇文章感覺不錯,請點選一下右下角的【推薦】來支援一下部落客,謝謝!

繼續閱讀