ML.NET 0.6版本提供了幾項使人興奮的新增功能:git
用於構建和使用機器學習模型的新APIgithub
咱們主要關注的是發佈用於構建和使用模型的新ML.NET API的第一次迭代。這些新的,更靈活的API支持新任務和代碼工做流,這是之前的LearningPipeline
API 沒法實現的。咱們開始棄用當前的LearningPipeline
API。算法
這是一項重大改變,旨在使您的機器學習更輕鬆,更強大。咱們但願經過GitHub的公開討論來反饋您的反饋,以幫助塑造長期的ML.NET API,以最大限度地提升您的生產力,靈活性和易用性。數據庫
瞭解有關新ML.NET API的更多信息api
可以對預先訓練的ONNX模型進行評分服務器
圖像分類,語音到文本和翻譯等許多場景均可以從深度學習模型中使用預測中獲益。在ML.NET 0.5中,咱們添加了對使用TensorFlow模型的支持。如今在ML.NET 0.6中,咱們增長了對從ONNX模型獲取預測的支持。架構
瞭解有關在ML.NET中使用ONNX模型的更多信息框架
模型預測,.NET類型系統一致性等方面的顯着性能改進機器學習
咱們知道應用程序性能相當重要。在此版本中,咱們將模型預測性能提升了100倍或更多。ide
其餘加強功能包括:
最後,咱們期待與開源社區合做,進一步開發和增長對.NET機器學習的支持。咱們已經採起措施與Infer.NET集成,這是微軟研究的一個項目,最近剛剛在.NET Foundation下做爲開源項目發佈。Infer.NET將擴展ML.NET以進行統計建模和在線學習,並在Microsoft.ML.Probabilistic
命名空間中提供。
接下來的部分將詳細介紹上面列出的公告。
雖然與ML.NET 0.1一塊兒發佈的現有LearningPipeline API很容易上手,但在咱們以前的ML.NET博客文章中解釋了一些限制。繼續前進,LearningPipeline API已移至Microsoft.ML.Legacy命名空間(例如,基於使用LearningPipeline API的二進制分類的情感分析)。
新API旨在支持更普遍的場景,並嚴格遵循ML原則,並從其餘流行的ML相關框架(如Apache Spark和Scikit-Learn)命名。
讓咱們來看一個使用新API構建情感分析模型的示例,並介紹新概念。
構建ML模型涉及如下高級步驟:
要使用ML.NET完成這些步驟,新API基本上有五個主要概念,讓咱們經過這個例子來看看它們:
使用ML.NET構建模型時,首先要建立ML上下文或環境。這與在實體框架中使用DbContext至關,但固然,在徹底不一樣的域中。環境爲ML做業提供了可用於異常跟蹤和日誌記錄的上下文。
var env = new LocalEnvironment();
咱們正在努力使這個概念/命名更接近EF和其餘.NET框架。
最重要的事情之一就是一如既往的數據!將數據集加載到ML管道中以用於訓練模型。
在ML.NET中,數據相似於SQL視圖。它被懶惰地評估,模式化,異質化。在此示例中,示例數據集以下所示:
Toxic(標籤) | Comment(文字) |
---|---|
1 | == RUDE ==老兄,你老實了...... |
1 | ==好的!== IM即將破壞...... |
0 | 我還發現使用「人文主義者」一詞使人困惑...... |
0 | 噢,謝謝DietLime先生...... |
要讀入此數據,您將使用數據讀取器,它是一個ML.NET組件。讀者會接受環境並要求您定義數據的架構。在這種狀況下,第一列(Toxic)的類型爲Boolean,「label」(也指預測)和第二列(Comment)是咱們將用於預測情緒的文本/字符串類型的特徵。
var reader = TextLoader.CreateReader(env, ctx => (label: ctx.LoadBool(0), text: ctx.LoadText(1))); var traindata = reader.Read(new MultiFileSource(TrainDataPath));
您的數據模式包含兩列:
請注意,這種狀況,從文件加載您的訓練數據,是最簡單的入門方式,但ML.NET還容許您從數據庫或內存中的集合加載數據。
機器學習算法能夠理解特徵化數據,所以下一步是咱們將文本數據轉換爲ML算法識別的格式。爲此,咱們建立一個估算器並使用FeaturizeText轉換,以下面的代碼段所示:
var est = reader.MakeNewEstimator().Append(row => { var featurizedText = row.text.FeaturizeText(); //Convert text to numeric vectors //... });
從數據獲悉預估對象,並轉換這個用於學習的結果。一個很好的例子是訓練模型estimator.Fit()
,學習訓練數據併產生機器學習模型。
如今,咱們的文本已經featurized,下一步是添加一個學習者。在這種狀況下,咱們將使用SDCA分類學習器。
添加學習者還須要咱們建立一個額外的上下文,由於咱們正在爲咱們的情緒分析執行二元分類ML任務。
var bctx = new BinaryClassificationContext(env); var est = reader.MakeNewEstimator().Append(row => { var featurizedText = row.text.FeaturizeText(); //Convert text to numeric vectors var prediction = bctx.Trainers.Sdca(row.label, featurizedText); //Specify SDCA trainer return (row.label, prediction); //Return label and prediction columns });
學習者接受label
,並將特徵 text
做爲輸入參數並返回prediction
包含predictedLabel
機率和得分字段三元組的內容。
定義估算器後,使用Fit()API訓練模型。這將返回用於預測的模型。
var model = est.Fit(traindata);
如今您已經建立並訓練了模型,使用不一樣的數據集對其進行評估,以得到質量保證和驗證,代碼相似於如下內容:
// Evaluate the model var predictions = model.Transform(testdata); var metrics = bctx.Evaluate(predictions, row => row.label, row => row.prediction); Console.WriteLine("PredictionModel quality metrics evaluation"); Console.WriteLine("------------------------------------------"); Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
代碼段實現如下內容:
如今,您擁有通過培訓的模型,可用於您的應用程序和服務。
如今,您能夠經過使用剛剛建立和訓練的模型來預測測試數據。
如下代碼是您在「生產」應用程序中經過使用模型評分來預測某些內容時要編寫的示例:
// Create the prediction function var predictionFunct = model.AsDynamic.MakePredictionFunction<SentimentIssue, SentimentPrediction>(env); // Predict the sentiment! var resultprediction = predictionFunct.Predict(new SentimentIssue { text = "This is a very rude movie" }); Console.WriteLine($"Text: {sampleStatement.text} | Prediction: {(resultprediction.PredictionLabel ? "Negative" : "Positive")} sentiment");
在該示例中,您能夠猜想因爲提供的文本,預測不會是正面的。
您能夠在此處找到情緒分析示例的全部代碼。
ONNX是一種開放且不易操做的模型格式,可使用在一個框架中訓練的模型(即scikit-learn,TensorFlow,xgboost等)並在另外一個框架中使用它們(如ML.NET)。
在ML.NET v0.3中,咱們添加了將ML.NET模型導出爲ONNX-ML格式的功能,所以額外的執行環境能夠運行該模型(例如Windows ML)。
在這個新的v0.6版本中,ML.NET還可使用ONNX模型來評分/預測使用ONNX標準v1.2的訓練有素的ONNX模型。咱們使用新的變換器和運行時啓用了這個,用於評分ONNX模型,以下所示。
在多個框架中建立和培訓了大量ONNX模型,能夠將模型導出爲ONNX格式。這些模型可用於圖像分類,情感識別和對象檢測等任務。
ML.NET 中的ONNX 轉換器容許向現有的ONNX模型(例如上面的模型)提供一些數據並從中得到分數(預測)。
ML.NET中的ONNX運行時目前僅支持x64 CPU上的Windows。路線圖中包含對其餘平臺(Linux和macOS)的支持。
在估算器中使用ONNX模型的方法是簡單地使用相似於如下代碼的行添加它:
.Append(row => (row.name, softmaxout_1: row.data_0.ApplyOnnxModel(modelFile)));
能夠在此處找到進一步的示例用法。
在這個版本中,咱們更容易在ML.NET中使用TensorFlow模型。使用TensorFlow評分轉換須要知道要從中檢索模型的哪一個節點,所以咱們添加了一個API來發現TensorFlow模型中的節點,以幫助識別TensorFlow模型的輸入和輸出。能夠在此處找到示例用法。
此外,以前在ML.NET 0.5中咱們只啓用了「凍結」TensorFlow模型。如今在ML.NET 0.6中,也可使用保存的模型格式的 TensorFlow模型。
在ML.NET 0.6版本中,咱們在從訓練模型進行單一預測時進行了幾項性能改進。第一項改進來自於從傳統的LearningPipeline API遷移到新的Estimators API。第二個改進來自優化新API中PredictionFunction的性能。
要了解基準測試結果的詳細信息,請參閱GitHub問題,其中詳細介紹了這一點。
Estimators
API加速29倍,加速進一步加速112倍PredictionFunction
)。Estimators
API 加速 22.8倍,加速進一步加速8.68倍PredictionFunction
)。這個模型包含一個文本特徵,因此咱們看到一個較小的增益就不足爲奇了。Estimators
API 加速 59.7倍,加速進一步提升109倍PredictionFunction
)。爲了使ML.NET更易於使用並利用.NET中的創新,在ML.NET 0.6中,咱們已經用.NET的標準類型系統取代了Dv類型系統。
此外,因爲改進的依賴注入方法,您如今還可使用.NET應用程序模型(如Azure功能)輕鬆地在其餘方案中部署ML.NET,而無需進行復雜的解決方法。
2018年10月5日,微軟研究院宣佈開放Infer.NET,這是一個基於模型的機器學習的跨平臺框架。
Infer.NET與傳統的機器學習框架的不一樣之處在於,它要求用戶指定問題的統計模型。這容許高度可解釋性,結合領域知識,進行無監督/半監督學習,以及在線推理 - 隨着新數據的到來學習的能力。咱們的免費在線預訂課程中介紹了該方法及其許多應用。
在微軟使用Infer.NET的地方包括TrueSkill - 一個用於Halo和Gears of War配對的技能評級系統,Matchbox-- Azure機器學習中的推薦系統,以及Alexandria - Satori的自動知識庫構建,僅舉幾例。
咱們正在與Infer.NET團隊合做,使其成爲ML.NET系列的一部分。已經朝着這個方向邁出的步驟包括在.NET Foundation下發布並將包名和命名空間更改成Microsoft.ML.Probabilistic。