1. 程式人生 > >.NET平臺機器學習元件-Infer.NET(三) Learner API—資料對映與序列化

.NET平臺機器學習元件-Infer.NET(三) Learner API—資料對映與序列化

關於本文件的說明

  本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。

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

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

1.基本介紹

  一個 "learner"是一個完整的機器學習應用解決方案,例如分類系統或者推薦系統。這些 Learners都能夠直接在命令列或者.NET程式中呼叫,而無須學習Infer.NET的 API介面. 每一個learner都包括訓練,預測以及評估能力。Learners的原始碼包括了一些綜合使用Infer.NET 的構建複雜穩定的機器學習功能程式的例子。本文是在

前一篇文章基礎上進行介紹。本文英文原文地址:原文

2.標準資料格式的對映

 我們一起回顧以下分類器對映介面IClassifierMapping ,它聲明瞭4個方法:

2.1 GetInstances

IEnumerable<TInstance> GetInstances(TInstanceSource instanceSource);

  GetInstances方法手動給學習者提供了例項樣本集(培訓或測試集),可以在訓練和預測中使用。此外,這兩個泛型型別,TInstance TInstanceSource,可以自由選擇。例如,TInstance可能被繫結到一個類提供的特性和標籤;也可能引用或索引到這樣一個類的一個物件。為了配合快取,貝葉斯機器分類器假設相同的例項源總是提供相同的例項。

2.2 GetFeatures

TFeatures GetFeatures(
    TInstance instance, 
    TInstanceSource instanceSource = default(TInstanceSource));

GetFeatures 為指定的樣本例項提供所有特徵值(指標)。這種方法也同樣用在訓練和預測中。注意,如果例項本身包含一個對應的特徵值,則沒有必要指定源。貝葉斯機器分類器需要將TFeatures繫結到 MicrosoftResearch.Infer.Maths.Vector中。為了配合快取,GetFeatures假設相同的例項源總是提供相同的例項。你可能想給所有例項新增一個恆定的特性,如新增1個特徵值一直為1的特徵。這將使分類器具有特性值轉移的不變性(通過為每個類新增一個預期值)。此外,特性之間的相關性存在越少越好(高度相關特性可能導致訓練演算法的收斂速度慢)。

2.3 GetLabel

TLabel GetLabel(TInstance instance, 
    TInstanceSource instanceSource = default(TInstanceSource), 
    TLabelSource labelSource = default(TLabelSource));

    GetLabel提供了例項需要的實際資料的標籤值(類別值),這個方法在訓練的過程中被呼叫。一個標籤的來源如果獨立與例項源,將會更靈活,因為在某些實際情況中,實際的資料來源特性和標籤值可能是分開的。如果例項本身包括了標籤的資料,那麼這裡的就可以省略了。為了快取標籤資料和避免轉換為本地資料格式的帶來的損失,貝葉斯機器分類器假設對於相同的例項呼叫GetLabel都獲取相同的標籤。

2.4 GetClassLabels

IEnumerable<TLabel> GetClassLabels(
    TInstanceSource instanceSource = default(TInstanceSource), 
    TLabelSource labelSource = default(TLabelSource));

    GetClassLabels方法可以獲取分類資料中所有標籤資料集。它不僅包括確定當前任務有多個標籤,還可以獲取對應標籤的型別標籤。在最簡單的情況下,當標籤是Bool型別時,GetClassLabels 將返回{true,false}。GetClassLabels可以在分類過程中保證每一個型別的標籤都是有效的。IClassifierMapping介面需要這種方法,是因為通常情況下,它有可能不能推出完整的樣本標籤集合,也就是說,訓練集或測試集可能並不包含所有標籤型別。

由於可以很靈活的選擇合適的資料型別TInstance,TInstanceSource,TLabelSource和TLabel(TFeatures需要Vector型別),一般直接提供一個簡單、高效的IClassifierMapping介面實現就可以了,所以提供標準的資料格式是一個使用分類器非常方便的方法。正如前面提到的,貝葉斯機器分類器最終需要將標準的資料格式的轉換為Infer.NET演算法可以接受的本地資料格式。然而,在很多情況下,在程式中使用本地資料格式要比需要轉換的標準資料格式更加有用。IClassifierMapping的一個實現的例子就是本教程前面的性別預測的例子。

3.本地資料格式對映

    IBayesPointMachineClassifierMapping介面提供可以由貝葉斯機器分類在訓練和預測過程中不需要轉換的資料格式,因此這個提供的格式也被稱為本地資料格式。

本機資料格式有兩個不同的表示方法:密集和稀疏。密集表示單個例項相關聯的所有特徵值都儲存在一個double陣列,而稀疏表示包含所有非零特徵值和相應的索引。這2種表示方法產生的結果是相同的,只是計算的代價有差別。在訓練和預測資料包括很多0特徵值的矩陣比對應的稀疏矩陣要快一些。

除了特徵值的表示功能,本機資料格式還可以修復標籤的型別。在二分類問題中,標籤值必須是布林型別,在多分類問題時,標籤必須從0開始的連續整數。通過原生格式提供資料需要實現下面8個方法:

1.IsSparse:IsSparse表示是否以稀疏矩陣儲存,注意該特徵是不能修改的。

bool IsSparse(TInstanceSource instanceSource);

2.GetFeatureCount:GetFeatureCount獲取分類資料中多少個特徵。當使用稀疏矩陣表示時,需要建立對應的推理演算法。

int GetFeatureCount(TInstanceSource instanceSource);

3.GetClassCount:GetClassCount 返回例項中所有類別標籤總數。

int GetClassCount(
    TInstanceSource instanceSource = default(TInstanceSource), 
    TLabelSource labelSource = default(TLabelSource));

    上述三種方法都是用於設定貝葉斯機器分類器的特徵和標籤的有效性。他們都在訓練和預測過程中被呼叫。IsSparse和GetFeatureCount方法可以從GetFeatureValues和GetFeatureIndexes中確定部分返回值。下面兩個方法在單個物件的預測中給單個例項傳遞特徵值。他們的返回值不會被快取。

4.GetFeatureValues (single-instance):GetFeatureValues返回給定例項的一個特徵值陣列。如果是以稀疏特性表示的(例如IsSparse返回true),這個方法只返回給定例項的所有相關非零特徵值。如果表示是非稀疏表示,GetFeatureValues會返回所有的特徵值,而不管他們是不是是否他們是零。

double[] GetFeatureValues(
    TInstance instance, 
    TInstanceSource instanceSource = default(TInstanceSource));

5.GetFeatureIndexes (single-instance):GetFeatureIndexes方法如果例項是以非稀疏矩陣表示,則返回null,否則返回一個返回非零特徵值對應的特徵指數的陣列。(??),因此,給訓練和測試演算法有兩種提供特性值和其索引的方法。在訓練時,例項可能被進一步分成多個子集(稱為批次),可以不直接從記憶體出處理全部資料。不使用批次,也大部分使用以下兩個方法。

int[] GetFeatureIndexes(TInstance instance, 
    TInstanceSource instanceSource = default(TInstanceSource));

6.GetFeatureValues (multi-instance):GetFeatureValues返回每個例項指定的批處理的例項的特性值(相對於是返回指定批次的特徵值)。預設情況下,假定所有例項的特性和標籤都是在一個處理中進行。如果這是很困難,可能是因為需要太多記憶體,貝葉斯機器分類器允許將訓練資料對映為多個批次進行(設定BatchCount屬性)。例項將執行索引從0到BatchCount - 1的批處理。訓練的多個批次處理設定參考IterationCount。

double[][] GetFeatureValues(
    TInstanceSource instanceSource, int batchNumber = 0);

7.GetFeatureIndexes (multi-instance):如果以稀疏矩陣標準,GetFeatureIndexes返回null;否則返回指定例項上指定批次的特徵索引。對同一批次的例項,這要與GetFeatureValues返回的特徵值一致。IBayesPointMachineClassifierMapping最後一個方法是提供真實標籤值:

int[][] GetFeatureIndexes(TInstanceSource instanceSource, int batchNumber = 0);

8.GetLabels:getlabel提供給定例項或者標籤資料來源的實際標籤類別值。注意,TLabel在二分類中是bool型別,在多份類中是int型別。在預測中不需要實用該方法。

TLabel[] GetLabels(TInstanceSource instanceSource, 
    TLabelSource labelSource = default(TLabelSource), 
    int batchNumber = 0);

    MicrosoftResearch.Infer.Learners.BayesPointMachineClassifierInternal名稱空間中的NativeClassifierMapping類及其子方法是實現IBayesPointMachineClassifierMapping介面的例子。這些IClassifierMapping類的封裝展示瞭如何從標準的資料格式轉換為本地資料的過程,以及如何在訓練中分批次的快取資料。

4.評估資料格式對映

        一個簡單的評估測試分類器效能的方法是使用evaluator。Evaluator通過一個實現IClassifierEvaluatorMapping對映介面的例項來讀取真是的標籤值,由於Evaluator獨立於特定分類器要求的具的資料格式,如貝葉斯分類器的IClassifierEvaluatorMapping本質上聲明瞭一個通用的標準資料格式對映IClassifierMapping介面,只是沒有GetFeatures方法。而預測輸入引數的評價方法,不要通過對映。

5.建立與序列化

5.1 建立貝葉斯分類器

   一旦建立對映的例項,就可以根據分類問題的型別,呼叫下面2個工廠方法,很容易的建立一個貝葉斯機器分類器。

BayesPointMachineClassifier.CreateBinaryClassifier (二類問題)
BayesPointMachineClassifier.CreateMulticlassClassifier (多類問題)

另外,這兩種方法都有兩個版本,一個是將輸入對映到本地資料格式,一個是將輸入對映到標準資料格式,分別實現IBayesPointMachineClassifierMapping和IClassifierMapping介面。工廠方法返回IBayesPointMachineClassifier型別的分類器,為訓練和預測提供一些適當設定。

例如,假設我們已經實現一個從SQL資料庫到貝葉斯機器分類所需的本地資料格式的對映SqlNativeMapping,可以很簡單的建立一個多分類器問題的分類器:

var mapping = new SqlNativeMapping();
var classifier = BayesPointMachineClassifier.CreateMulticlassClassifier(mapping);

建立貝葉斯機器分類器的操作是很簡單的,不需要資料輸入相關計算。

5.2 序列化

 序列化是通過ILearner介面的Save擴充套件方法實現的。該方法有2個過載版本,1個是在檔案,1個是在格式化的流。訓練和未訓練的分類器都可以被序列化和反序列化。序列化一個貝葉斯機器分類器到一個檔案的呼叫程式如下:

classifier.Save("bpm.bin");

該程式序列化分類器的引數和使用者定義的對映。它不序列化任何訓練資料也沒有附加任何事件處理程式。

5.3 反序列化

通過呼叫BayesPointMachineClassifier的一個靜態方法可以載入一個之前被序列化的分類器。和儲存方法類似,也可以從一個檔案或者格式化流中反序列化一個分類器。

var classifier = BayesPointMachineClassifier.Load
        <SqlInstanceSource, Instance, SqlLabelSource, int, Discrete,
        BayesPointMachineClassifierTrainingSettings,        MulticlassBayesPointMachineClassifierPredictionSettings<int>>("bpm.bin");

上述方法需要的泛型引數如下:

TInstanceSource :源例項的型別

TInstance :單個例項的型別

TLabelSource :源標籤的型別

TLabel :單個標籤的型別(貝葉斯分類器有2種,2類為bool,多類為Int)

TLabelDistribution :標籤的分佈型別

TTrainingSettings:訓練設定型別

TPredictionSettings :預測設定型別,分二類問題和多類問題,預測設定的型別是不一樣。(BinaryBayesPointMachineClassifierPredictionSettings

和 MulticlassBayesPointMachineClassifierPredictionSettings).

反序列化的泛型引數必須和分類器序列化時的引數精確匹配。同樣在反序列化時,將執行版本檢查程式,如果序列化的版本不匹配,將丟擲一個異常。然而,很多情況下,為了方便,存在很多方法並不需要很多具體的泛型型別,如:

var classifier = BayesPointMachineClassifier.LoadMulticlassClassifier
        <SqlInstanceSource, Instance, SqlLabelSource, int, Discrete>("bpm.bin");

這和前面的從檔案反序列化多類貝葉斯機器分類器是等價的。

相關推薦

.NET平臺機器學習元件-Infer.NET() Learner API資料對映序列

關於本文件的說明   本文件基於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連載(二)貝葉斯分類器

關於本文件的說明   本文件基於Infer.NET 2.6對Infer.NET User Guide進行中文翻譯,但進行了若干簡化和提煉,按照原網站的思路進行,但不侷限與其順序。   歡迎傳播分享,必須保持原作者的資訊,但禁止將該文件直接用於商業盈利。   本人正在研究基於Infer.NET元件,並

.NET平臺開源專案速覽(13)機器學習元件Accord.NET框架功能介紹

    Accord.NET Framework是在AForge.NET專案的基礎上封裝和進一步開發而來。因為AForge.NET更注重與一些底層和廣度,而Accord.NET Framework更注重與機器學習演算法以及提供計算機視訊、音訊、訊號處理以及統計應用相關的解決方案。該專案使用C#語言編寫,專

.NET平臺機器學習

閱讀目錄 .NET平臺機器學習資源彙總,有你想要的麼? 1.開源綜合類 2.開源.NET平臺非綜合類 3.其他資源與技術部落格 4.我的100篇部落格之路     回到目錄 .NET平臺機器學習資源彙總,有你想要的麼?

Machine Learning .NET平臺機器學習

機器學習——深度學習(Deep Learning) https://blog.csdn.net/abcjennifer/article/details/7826917 機器學習系列 https://morvanzhou.github.io/tutorials/machine-learning/ &nb

.NET平臺機器學習資源彙總,有你想要的麼?

   接觸機器學習1年多了,由於只會用C#堆程式碼,所以只關注.NET平臺的資源,一邊積累,一邊收集,一邊學習,所以在本站第101篇部落格到來之際,分享給大家。部分用過的 ,會有稍微詳細點的說明,其他沒用過的,也是我關注的,說不定以後會用上。機器學習並不等於大資料或者資料探勘,還有有些區別,有些東西可以用來處

一個開源的,跨平臺的.NET機器學習框架ML.NET

例子 觀察 bin OS ron feature mean 參考 移動應用 微軟在Build 2018大會上推出的一款面向.NET開發人員的開源,跨平臺機器學習框架ML.NET。 ML.NET將允許.NET開發人員開發他們自己的模型,並將自定義ML集成到他們的應用程序中,而

機器學習演算法--Elastic Net

1) alpha : float, optional Constant that multiplies the penalty terms. Defaults to 1.0. See the notes for the exact mathematical meaning of this parameter

.NET平臺開源專案速覽(14)最快的物件對映元件Tiny Mapper

    好久沒有寫文章,工作甚忙,但每日還是關注.NET領域的開源專案。五一休息,放鬆了一下之後,今天就給大家介紹一個輕量級的物件對映工具Tiny Mapper:號稱是.NET平臺最快的物件對映元件。那就一起看看呢。 臨時更新:感謝@ 的意見,為了避免新手誤解,這裡說明一下,Tiny Mappe

機器學習框架ML.NET學習筆記【1】基本概念

一、序言        微軟的機器學習框架於2018年5月出了0.1版本,2019年5月釋出1.0版本。期間各版本之間差異(包括名稱空間、方法等)還是比較大的,隨著1.0版釋出,應該是趨於穩定了。之前在園子裡也看到不少相關介紹的文章,對我的學習提供了不少幫助。由於目前

機器學習框架ML.NET學習筆記【2】入門之二元分類

一、準備樣本 接上一篇文章提到的問題:根據一個人的身高、體重來判斷一個人的身材是否很好。但我手上沒有樣本資料,只能偽造一批資料了,偽造的資料比較標準,用來學習還是蠻合適的。 下面是我用來偽造資料的程式碼: string Filename = "./figure_full.c

機器學習框架ML.NET學習筆記【3】文字特徵分析

一、要解決的問題 問題:常常一些單位或組織召開會議時需要錄入會議記錄,我們需要通過機器學習對使用者輸入的文字內容進行自動評判,合格或不合格。(同樣的問題還類似垃圾簡訊檢測、工作日誌質量分析等。) 處理思路:我們人工對現有會議記錄進行評判,標記合格或不合格,通過對這些記錄的學習形成模型,學習演算法仍採用二元

機器學習框架ML.NET學習筆記【4】多元分類之手寫數字識別

一、問題與解決方案 通過多元分類演算法進行手寫數字識別,手寫數字的圖片解析度為8*8的灰度圖片、已經預先進行過處理,讀取了各畫素點的灰度值,並進行了標記。 其中第0列是序號(不參與運算)、1-64列是畫素值、65列是結果。 我們以64位畫素值為特徵進行多元分類,演算法採用SDCA最大熵分類演算法。

機器學習框架ML.NET學習筆記【6】TensorFlow圖片分類

 一、概述 通過之前兩篇文章的學習,我們應該已經瞭解了多元分類的工作原理,圖片的分類其流程和之前完全一致,其中最核心的問題就是特徵的提取,只要完成特徵提取,分類演算法就很好處理了,具體流程如下: 之前介紹過,圖片的特徵是不能採用畫素的灰度值的,這部分原理的臺階有點高,還好可以直接使用通過Te

機器學習框架ML.NET學習筆記【7】人物圖片顏值判斷

一、概述  這次要解決的問題是輸入一張照片,輸出人物的顏值資料。 學習樣本來源於華南理工大學釋出的SCUT-FBP5500資料集,資料集包括 5500 人,每人按顏值魅力打分,分值在 1 到 5 分之間。其中包括男性、女性、中國人、外國人四個分類。 SCUT-FBP5500_full.cs

機器學習框架ML.NET學習筆記【8】目標檢測(採用YOLO2模型)

一、概述 本篇文章介紹通過YOLO模型進行目標識別的應用,原始程式碼來源於:https://github.com/dotnet/machinelearning-samples 實現的功能是輸入一張圖片,對圖片中的目標進行識別,輸出結果在圖片中通過紅色框線標記出來。如下:  YOLO簡介

機器學習框架ML.NET學習筆記【9】自動學習

一、概述 本篇我們首先通過迴歸演算法實現一個葡萄酒品質預測的程式,然後通過AutoML的方法再重新實現,通過對比兩種實現方式來學習AutoML的應用。 首先資料集來自於競賽網站kaggle.com的UCI Wine Quality Dataset資料集,訪問地址:https://www.kaggle.co

機器學習基石筆記】、不同類型的機器學習

質數 一個 非監督 輸入 編號 不同 象棋 按順序 pla 一、不同的output 1、二分類 2、多分類 3、回歸問題 4、structured learn: 從一個句子 -> 句子每個 詞的詞性。   輸出是一個結構化的東西。   例子:蛋白質數據 ->

機器學習讀書筆記()決策樹基礎篇之從相親說起

方法 事務 家裏 分類 筆記 判斷 都是 rom tro 一、決策樹 決策樹是什麽?決策樹(decision tree)是一種基本的分類與回歸方法。舉個通俗易懂的例子,如下圖所示的流程圖就是一個決策樹,長方形代表判斷模塊(decision block),橢圓形成代