ML.NET 0.8特性简介
本周.NET生態圈內的更新源源不斷,除了.NET Core 2.2,ASP.NET Core 2.2和Entity Framework Core 2.2之外,ML.NET 0.8也一并登上舞臺。
新的推薦場景
ML.NET使用基于矩陣分解(Matrix Factorization)和場感知分解機(Field-aware Factorization Machine)的方法來作推薦。一般而言,場感知分解機是矩陣分解更通用的例子,它允許傳入額外的元數據。
在ML.NET 0.8中新加了運用矩陣分解的推薦場景。
| 基于產品Id,評價,用戶Id和諸如產品描述,用戶特征(年齡,國家)的額外元數據的產品推薦 | 場感知分解機 | ML.NET 0.3 |
| 基于產品Id,評價,用戶Id的產品推薦 | 矩陣分解 | ML.NET 0.7 |
| 基于產品Id和與其一同購買的產品Id的產品推薦 | One Class矩陣分解 | ML.NET 0.8 |
在新的推薦場景中,即使沒有可用的評價,也可以通過歷史購買數據為用戶構建"經常一起購買的產品"(Frequently Bought Together)的列表。
通過預覽數據改進調試功能
在多數例子里,當開始運行你的機器學習管道(pipeline),且加載數據時,能看到已經載入的數據是很有用的功能。尤其是在某些中間轉換過程之后,需要確保數據如預期的一樣發生變化。
現在當你想要預覽DataView的數據模式(Schema)時,可以懸停鼠標在IDataView對象上,展開它,觀察它的數據模式屬性。
而要查看DataView中已加載的實際數據,通過以下三步可以達成目標。
在調試模式中打開觀察窗口
輸入DataView對象的變量名,調用它的Preview方法
點開想看的某行,這樣就能顯示其中實際加載的數據
默認情況下,只會顯示100行的數據,但可以在Preview方法里傳入參數,比如Preview(500),以獲得更多的數據。
模型可解釋性
為了讓模型更具可解釋性,ML.NET 0.8引入了新的API,用以幫助理解模型的特征重要性(整體特征重要度(Overall Feature Importance))以及創建能被其他人解釋的高效模型(廣義加性模型(Generalized Additive Models))。
整體特征重要度用于評判在模型中哪些特性是整體上最重要的。它幫助理解哪些特征是最有價值的,從而得到更好的預測結果。例如,當預測汽車價格時,一些特性比如里程數和生產商品牌是更重要的,而其它特性,如汽車顏色,則是影響甚小。
模型的整體特征重要度可以通過"排列特征重要度"(Permutation Feature Importance)(PFI)技術來獲得。PFI借由"如果特征值設為隨機數,會怎樣影響模型"這一問題以測量特征重要度。
PFI方法的好處是其與模型無關,任何模型都可以用它作評估,并且它還可以使用任意數據。
使用PFI的方法如下例代碼所示:
// Compute the feature importance using PFIvar permutationMetrics = mlContext.Regression.PermutationFeatureImportance(model, data);// Get the feature names from the training setvar featureNames = data.Schema.GetColumns().Select(tuple => tuple.column.Name) // Get the column names.Where(name => name != labelName) // Drop the Label.ToArray();// Write out the feature names and their importance to the model's R-squared valuefor (int i = 0; i < featureNames.Length; i++)Console.WriteLine($"{featureNames[i]}\t{permutationMetrics[i].rSquared:G4}");生成的結果包括了特征名與它的重要度。
Console output:Feature ? ? ? ? ? ?Model Weight ? ?Change in R - Squared--------------------------------------------------------RoomsPerDwelling ? ? ?50.80 ? ? ? ? ? ? -0.3695EmploymentDistance ? -17.79 ? ? ? ? ? ? -0.2238TeacherRatio ? ? ? ? -19.83 ? ? ? ? ? ? -0.1228TaxRate ? ? ? ? ? ? ?-8.60 ? ? ? ? ? ? ?-0.1042NitricOxides ? ? ? ? -15.95 ? ? ? ? ? ? -0.1025HighwayDistance ? ? ? ?5.37 ? ? ? ? ? ? -0.09345CrimesPerCapita ? ? ?-15.05 ? ? ? ? ? ? -0.05797PercentPre40s ? ? ? ? -4.64 ? ? ? ? ? ? -0.0385PercentResidental ? ? ?3.98 ? ? ? ? ? ? -0.02184CharlesRiver ? ? ? ? ? 3.38 ? ? ? ? ? ? -0.01487PercentNonRetail ? ? ?-1.94 ? ? ? ? ? ? -0.007231廣義加性模型擁有很好的預測可解釋性。在便于理解上,它類似于線性模型,但更加靈活,并具有更佳的性能以及利于分析的可視化能力。
更多的API增強
在DataView中過濾行
有時你會需要對數據集過濾一部分數據,比如那些離群值(outlier)。ML.NET 0.8中新加入了FilterByColumn()API可以幫助解決類似問題。
使用方法如下面的代碼所示:
IDataView trainingDataView = mlContext.Data.FilterByColumn(baseTrainingDataView, "FareAmount", lowerBound: 1, upperBound: 150);緩存功能的API
當對同一數據作多次迭代處理時,通過緩存數據可以大幅減少訓練時間。
以下例子可以減少50%的訓練時間:
var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey("Area", "Label").Append(mlContext.Transforms.Text.FeaturizeText("Title", "TitleFeaturized")).Append(mlContext.Transforms.Text.FeaturizeText("Description", "DescriptionFeaturized")).Append(mlContext.Transforms.Concatenate("Features", "TitleFeaturized", "DescriptionFeaturized")) ? ? ? ?//Example Caching the DataView .AppendCacheCheckpoint(mlContext) .Append(mlContext.BinaryClassification.Trainers.AveragedPerceptron(DefaultColumnNames.Label, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DefaultColumnNames.Features,numIterations: 10));以IDataView二進制格式保存讀取數據
將經過轉換的數據保存為IDataView二進制格式相較普通的文本格式,可以極大地提升效率。同時,由于此格式保留了數據模式,所以可以方便讀取而不需要再指定列類型。
讀取與保存的API如下所示,十分簡單:
mlContext.Data.ReadFromBinary("pathToFile"); mlContext.Data.SaveAsBinary("pathToFile");用于時間序列問題的狀態性預測引擎
ML.NET 0.7里可以基于時間序列處理異常檢查問題。然而,其預測引擎是無狀態的,這意味著每次要指出最新的數據點是否是異常的,需要同時提供歷史數據。
新的引擎中可以保留時間序列的狀態,所以現在只要有最新的數據點,即可以進行預測。需要改動的地方是將CreatePredictionFunction()方法替換成CreateTimeSeriesPredictionFunction()。
原文地址:https://www.cnblogs.com/kenwoo/p/10090881.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ML.NET 0.8特性简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分析现有 WPF / Windows F
- 下一篇: 【.NET Core项目实战-统一认证平