本博客所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html
微軟Infer.NET機器學習組件文章目錄:http://www.cnblogs.com/asxinyu/p/4329742.html
關於本文檔的說明
本文檔基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不局限與其順序。
歡迎傳播分享,必須保持原作者的信息,但禁止將該文檔直接用於商業盈利。
本人正在研究基於Infer.NET組件,並計划將其應用於實際的預測之中,該組件功能強大,封裝很完善,但也有很多難以理解的地方,同時官方也給出了大量的例子,限於個人精力有限,更新時間較慢,也希望有興趣的朋友一起來完成該項工作。
Email:asxinyu@qq.com
本文章原始地址:http://www.cnblogs.com/asxinyu/p/4255921.html
1.Infer.NET貝葉斯分類器介紹
本教程提供了一個簡短的,循序漸進的介紹如何使用C# API創建、訓練和測試一個貝葉斯機分類器的過程。如果你只是想嘗試使用貝葉斯機器分類器,你可以提供數據一個特定格式文本文件,不用擔心最終的性能,可以參考一下命令行的使用。
本項目使用的貝葉斯分類器是基於Infer.NET API構建的,源碼等資料在本文最后的資源信息。
該文章翻譯的網址為:點擊這里看英文原文
2.性別預測介紹
本教程的目的,讓我們假設我們要根據一組給人身高和體重的數據來預測一個人的性別。讓我們進一步假設我們已經收集到的樣本大小為N=1000,而我們知道的性別作為標簽樣本單獨存放。下面圖是樣本數據可視化的結果:
解決這類問題的一個方法是創建一個概率模型。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。這個過程比較簡單,基本忽略。
3.數據和映射
針對上述提供的數據。每個人的身高和體重是以向量實例存儲在內存中的,相應的性別以字符串類型對象表示的,其值是“女性”或“男性”。因此整個樣本,包含個數是1000的向量數組對象和1000個字符串類型對象。
相關說明:
1.貝葉斯機器分類器模型並不顯式地指定一個預期結果。然而,在許多分類問題中,添加一個預期結果是至關重要的,因為它使得貝葉斯分類器以固定的特性轉換特征(決策邊界不需要原始數據特征),從而顯著的影響預測性能[翻譯不太准確]。BPM可以實現添加預期值的功能,使其總有1這個值。如果你的分類數據還不包括這樣一個常數特征值,你應該很想將它添加到特征向量中。
2.如果特性(包括預期值)是高度相關的,貝葉斯機器分類器的訓練可能出現收斂速度慢的情況。
在上述性別預測的例子中,我們可以使用了一個增強的三維特征向量,不僅包含一個人的身高和體重,還有額外的特征值為1。此外,讓我們在原始數據中減去平均身高和平均體重,這就消除身高、體重和預期值之間的相關性。
數據可以存儲在各種不同的格式中。通常的您的數據格式都和學習者Learner所預期要求的數據類型都不一致。這意味着您必須將原始數據轉化為學習者的格式。這在一些小的用例測試中,當然是一個合理的選擇,但對於大型的真實數據集,這種轉換代價是非常大的。因此為了避免用戶輸入固定類型的數據,Infer.NET提供了一個靈活的機制,允許您指定學習者應該如何使用他們的輸入數據。這種機制被稱為映射。一個映射定義輸入數據是如何傳遞到Infer.NET的學習者中的。因為它讓你選擇最方便的格式,它有助於避免不必要的數據轉換。
貝葉斯機器分類器中有兩種不同類型的映射,詳細可以參考Mappings類。在我們簡單介紹的例子中,最簡單的將輸入數據映射到一個表單以便於貝葉斯分類器理解的方法是實現IClassifierMapping接口,如下所示:
1 /// <summary> 2 /// A mapping for the Bayes Point Machine classifier tutorial. 3 /// </summary> 4 public class ClassifierMapping: IClassifierMapping<IList<Vector>, int, IList<string>, string, Vector> 5 { 6 public IEnumerable<int> GetInstances(IList<Vector> featureVectors) 7 { 8 for (int instance = 0; instance < featureVectors.Count; instance++) 9 { 10 yield return instance; 11 } 12 } 13 public Vector GetFeatures(int instance, IList<Vector> featureVectors) 14 { 15 return featureVectors[instance]; 16 } 17 18 public string GetLabel(int instance, IList<Vector> featureVectors, IList<string> labels) 19 { 20 return labels[instance]; 21 } 22 23 public IEnumerable<string> GetClassLabels(IList<Vector> featureVectors = null, IList<string> labels = null) 24 { 25 return new[] { "Female", "Male" }; 26 } 27 }
為了實現IClassifierMapping 接口,必須要實現以下幾點:
1.哪個是要分批交給分類器的對象?(GetInstances);
2.如何獲取給定實例的特征值? (GetFeatures);
3.如何獲取給定實例實際的標簽值? (GetLabel);
4.獲取數據中所有不同類型標簽值,相當於標簽范圍(GetClassLabels)。
4.創建貝葉斯分類器,並訓練,預測和評估
4.1 創建分類器
有了手動創建的數據映射,就可以創建貝葉斯機器分類器,如下所示:
1 有了手動創建的映射,就可以創建貝葉斯機器分類器,如下所示: 2 // Create the Bayes Point Machine classifier from the mapping 3 var mapping = new ClassifierMapping(); 4 var classifier = BayesPointMachineClassifier.CreateBinaryClassifier(mapping);
4.2 訓練
這樣,就可以使用分類器根據身高和體重去學習和預測性別。使用1000個樣本去訓練貝葉斯機器分類器,如下所示:
1 // Train the Bayes Point Machine classifier on the gender data 2 classifier.Train(trainingSet.FeatureVectors, trainingSet.Labels);
trainingSet.FeatureVectors是一個包括身高和體重測量數據的向量數組,trainingSet.Labels是一個代表性別的預期標簽。
注意,訓練貝葉斯我們並不需要設置任何參數,如前置分布權重。這是因為貝葉斯機器分類器是無需超參數的(hyper-parameter)。這不僅避免了一些錯誤的參數設置,還可以自動移除一些影響運行時間的參數。更厲害的是:它甚至不需要規范化的數據輸入,貝葉斯機器分類器能夠自己自動適應不同尺度的觀察數據。這些都是通過heavy-tailed 前置分布權重設置的。
4.3 預測
使用訓練后的貝葉斯機器分類器,就能夠預測那些只有身高和體重數據的人的性別。特別是,現在我們可以回答之前那個身高183厘米,體重178公斤的人是一個女人的可能性有多大。如下代碼:
1 // Making predictions on previously unseen data 2 var predictions = classifier.PredictDistribution(testSet.FeatureVectors);
testSet.FeatureVectors是一個只包含身高,體重以及預期值的向量數組。
調用PredictDistribution在測試集中,給每個實例返回一個伯努利分布,這個事實說明給定一個人的身高和體重,我們通常並不能完全確定一個人的性別。例如:
1 P(gender = 'Female' | height = 183cm, weight = 78kg) = 0.07
根據訓練集1000個樣本的觀測數據,這個身高183厘米,體重78公斤的人是女性的概率是7%。在許多情況下,您可能需要預測一個最終確定的答案,而不是調用PredictDistribution,然后簡單地預測,給出概率,例如,我們可以這樣寫:
1 // Making decisions 2 string estimate = classifier.Predict(InstanceOfInterest, testSet.FeatureVectors);
結果是:Male
注意,這種精確的分類預測仍然需要計算預測分布作為一個中間步驟。此外,最佳的精確答案不一定是最有可能的類。
4.4 評估測試
為了評價分類器的預測情況,我們需要利用一些不同於訓練集的有標簽的數據,因此我們假定我們可以得到一組100個額外的真實性別,體重和身高的測量記錄。一個評價過程要通過ClassifierEvaluator進行,如下:
1 // Create an evaluator for mapping 2 var evaluatorMapping = mapping.ForEvaluation(); 3 var evaluator = 4 new ClassifierEvaluator<IList<Vector>, int, IList<string>, string>( 5 evaluatorMapping);
結果: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):
1 IEnumerable<Pair<double, double>> rocCurve = 2 evaluator.ReceiverOperatingCharacteristicCurve( 3 "Female", testSet.FeatureVectors, predictions);
我們將在后續的文章中分享關於基於Infer.NET組件構建的貝葉斯機器分類器更多的功能和相關細節。
5.資源
本人手動制作了Infer.NET 2.6的幫助文檔,CHM格式,還有貝葉斯分類器的相關代碼,
文件比較大,將通過郵箱與30日下午統一發送,需要的朋友留Email。
如果本文章資源下載不了,或者文章顯示有問題,請參考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4255921.html
如果您看完本篇文章感覺不錯,請點擊一下右下角的【推薦】來支持一下博主,謝謝!