【原創】.NET平臺機器學習元件-Infer.NET連載(二)貝葉斯分類器
關於本文件的說明
本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。
歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。
本人正在研究基於Infer.NET元件,並計劃將其應用於實際的預測之中,該元件功能強大,封裝很完善,但也有很多難以理解的地方,同時官方也給出了大量的例子,限於個人精力有限,更新時間較慢,也希望有興趣的朋友一起來完成該項工作。
1.Infer.NET貝葉斯分類器介紹
本教程提供了一個簡短的,循序漸進的介紹如何使用C# API建立、訓練和測試一個貝葉斯機分類器的過程。如果你只是想嘗試使用貝葉斯機器分類器,你可以提供資料一個特定格式文字檔案,不用擔心最終的效能,可以參考一下命令列的使用。
本專案使用的貝葉斯分類器是基於Infer.NET API構建的,原始碼等資料在本文最後的資源資訊。
2.性別預測介紹
本教程的目的,讓我們假設我們要根據一組給人身高和體重的資料來預測一個人的性別。讓我們進一步假設我們已經收集到的樣本大小為N=1000,而我們知道的性別作為標籤樣本單獨存放。下面圖是樣本資料視覺化的結果:
解決這類問題的一個方法是建立一個概率模型。Infer.NET允許您使用各種各樣的模型。在描述了這個分類問題後,我們已經給你準備了一個完整和穩定的模型,所以你不需要做這個工作。然而,我們建立的貝葉斯機器(BPM)分類器,必須要有一些前提條件,這些你可能要搞清楚。如果這些假設不滿足你的情況,你自己可以考慮建立一個更符合你實際情況的概率模型。
使用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。
如果您看完本篇文章感覺不錯,請點選一下右下角的【推薦】來支援一下博主,謝謝!
相關推薦
【原創】.NET平臺機器學習元件-Infer.NET連載(一)介紹
關於本文件的說明 本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。 歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。 本人正在研究基於Infer.NET元件,並
【原創】.NET平臺機器學習元件-Infer.NET連載(二)貝葉斯分類器
關於本文件的說明 本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。 歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。 本人正在研究基於Infer.NET元件,並
.NET平臺機器學習元件-Infer.NET(三) Learner API—資料對映與序列化
關於本文件的說明 本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。 歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。 本人正在研究基於Infer.NET
機器學習之路: python 樸素貝葉斯分類器 預測新聞類別
groups group news ckey put epo test electron final 使用python3 學習樸素貝葉斯分類api 設計到字符串提取特征向量 歡迎來到我的git下載源代碼: https://github.com/linyi0604/kag
機器學習筆記(六):貝葉斯分類器
機器學習所研究的主要內容,是關於在計算機上從資料中產生“模型”的演算法,這個產生的模型大體上可以分為“判別式模型”和“生成式模型”兩大類。 其中判別式模型是給定x,通過直接對條件概率分佈P(y|x)進行建模來預測y。這種方法尋找不同類別的最優分類面,反映的是異類資料之間的差異。之前幾篇文章中介紹
機器學習演算法筆記之4:貝葉斯分類器
一、貝葉斯分類器詳解 貝葉斯分類器是一類分類演算法的總稱,這類演算法均以貝葉斯定理為理論基礎。貝葉斯分類器的分類原理是通過先驗概率,利用貝葉斯公式計算出後驗概率,選擇最大後驗概率所對應的分類結果。 貝葉斯準則 其中,P(c)是先驗概率,P(x|c)樣本x相對於;類標記c的類
《機器學習西瓜書》學習筆記——第七章_貝葉斯分類器_樸素貝葉斯分類器
樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。 樸素貝葉斯是經典的機器學習演算法之一,也基於概率論的分類演算法,屬於監督學習的生成模型。樸素貝葉斯原理簡單,也很容易實現,多用於文字分類,比如垃圾郵件過濾。 1.演算法思想——基於概率的預測 貝葉斯決策論是概率框架下
Python機器學習與實戰筆記之樸素貝葉斯分類
1聯合概率分佈 p(x,y)=p(y)P(x|y) 或者p(A交B)=p(A)xp(B) p(A交B)不容易求,假設條件獨立拆分成兩個事件的乘積 2基本假設條件獨立性 3利用貝葉斯定理 p(y|x)=P(x,y)/p(x)=p(y)P(x|y)/sum(y-i)[p(
機器學習實戰第四章——樸素貝葉斯分類(原始碼解析)
樸素貝葉斯分類 #coding=utf-8 ''' Created on 2016年1月9日 @author: admin ''' from numpy import * # 載入資料集函式 def loadDataSet(): # 定義郵件列表 p
機器學習-帶你搞懂樸素貝葉斯分類演算法
帶你搞懂樸素貝葉斯分類演算法 你搞懂樸素貝葉斯分類算 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。這篇文章我儘可能用直白的話語總結一下我們學習會上講到的樸素貝葉斯分
【機器學習實踐】用Python實現樸素貝葉斯分類器
閱讀學習了《機器學習》第7章的貝葉斯分類器後,為了加深理解和加強python的程式碼能力,因此嘗試使用Python實現樸素貝葉斯分類器,由於初學Python的緣故,程式碼的一些實現方法可能比較繁瑣,可閱讀性有待提高。程式碼如下: #import numpy a
【機器學習-西瓜書】七、樸素貝葉斯分類器
推薦閱讀:拉普拉斯修正 7.3樸素貝葉斯分類器 關鍵詞: 樸素貝葉斯;拉普拉斯修正 上一小節我們知道貝葉斯分類器的分類依據是這公式:P(c∣x)=P(x,c)P(x)=P(c)⋅P(c∣x)P(x) ,對於每個樣本而言,分母P(x)=∑mi=1P(
【機器學習】樸素貝葉斯分類器
前言:在正式講述樸素貝葉斯分類器之前,先介紹清楚兩個基本概念:判別學習方法(Discriminative Learning Algorithm)和生成學習方法(Generative Learning Algorithm)。 上篇博文我們使用Logist
【機器學習算法-python實現】掃黃神器-樸素貝葉斯分類器的實現
github border release Language 出現 span bus pytho rds 版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.c
機器學習:貝葉斯分類器
貝葉斯 逆向 檢測 .net 極大似然估計 href ref .com blank 參考文獻 從貝葉斯定理說開去 關鍵詞:逆向概率;先驗概率;後驗概率 我所理解的貝葉斯定理--知乎專欄 關鍵詞:醫院病癥檢測中的真假陽性 似然與極大似然估計--知乎專欄 關鍵詞:似然與概率的區
機器學習系列——樸素貝葉斯分類器(二)
表示 -h line log ima 條件 code 樸素貝葉斯 spa 貝葉斯定理: 其中: 表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:。 機器學習系列——樸素貝葉斯分類器(二)
機器學習:貝葉斯分類器(二)——高斯樸素貝葉斯分類器代碼實現
mod ces 數據 大於等於 即使 平均值 方差 很多 mode 一 高斯樸素貝葉斯分類器代碼實現 網上搜索不調用sklearn實現的樸素貝葉斯分類器基本很少,即使有也是結合文本分類的多項式或伯努利類型,因此自己寫了一遍能直接封裝的高斯類型NB分類器,當然與真正的源碼相
機器學習---樸素貝葉斯分類器(Machine Learning Naive Bayes Classifier)
垃圾郵件 垃圾 bubuko 自己 整理 href 極值 multi 帶來 樸素貝葉斯分類器是一組簡單快速的分類算法。網上已經有很多文章介紹,比如這篇寫得比較好:https://blog.csdn.net/sinat_36246371/article/details/601
機器學習實戰(三)樸素貝葉斯NB(Naive Bayes)
目錄 0. 前言 1. 條件概率 2. 樸素貝葉斯(Naive Bayes) 3. 樸素貝葉斯應用於文字分類 4. 實戰案例 4.1. 垃圾郵件分類案例 學習完機器學習實戰的樸素貝葉斯,簡單的做個筆記。文中
機器學習實戰讀書筆記(3)--樸素貝葉斯
基於貝葉斯決策理論的分類方法 優點:在資料較少的情況下仍然有效,可以處理多類別問題 缺點:對輸入資料的準備方式比較敏感,需要標稱資料.確定貝葉斯最優假設的計算代價較大 樸素貝葉斯是貝葉斯決策理論的一部分.貝葉斯決策理論的核心思想:一個數據集包括2類(或兩類以上