關於ML.NET v0.8的發佈說明

 

ML.NET容許您建立和使用針對場景的機器學習模型,以實現常見任務,如情緒分析,問題分類,預測,推薦,欺詐檢測,圖像分類等。您能夠使用ML.NET示例GitHub倉庫中查看這些常見任務 。ML.NET 0.8發佈之際,咱們能夠解釋爲何到目前爲止它是最好的版本!此版本側重於爲推薦方案添加改進的支持,以特徵重要性的形式添加模型可解釋性,經過預覽內存數據集提供可調試性,API緩存(如緩存,過濾等)。git

如下是此版本的一些亮點。github

  • 全新推薦方案
  • 改進了可調試性
  • 模型可解釋性
  • 其餘API改進

全新推薦方案

 

推薦系統能夠爲產品目錄,歌曲,電影等中的產品生成推薦列表。像Netflix,亞馬遜,Pinterest這樣的產品在過去十年中已經保持公平合理原則使用相似推薦的方案。api

ML.NET使用Matrix Factorization和Field Aware Factorization基於機器的推薦方法來實現如下場景。一般,Field Aware Factorization機器是矩陣分解的更通常化的狀況,並容許傳遞額外的元數據。緩存

使用ML.NET 0.8,咱們爲Matrix Factorization添加了另外一種方案,能夠提供建議。架構

推薦場景 推薦解決方案 連接到示例
產品建議基於產品ID,評級,用戶ID和其餘元數據,如產品描述,用戶人口統計(年齡,國家等) 現場感知分解機器 ML.NET 0.3(此處示例
產品建議僅基於產品ID,評級和用戶ID 矩陣分解 ML.NET 0.7(此處示例
基於產品ID和共同購買的產品ID的產品建議 一類矩陣分解 ML.NET 0.8中的新功能(此處示例

即便您只有商店的歷史訂單購買數據,仍然能夠提供產品建議。app

這是一種流行的場景,由於在許多狀況下您可能沒有可用的評級。機器學習

使用歷史購買數據,您仍然能夠經過向用戶提供「常常購買」產品列表來構建建議。ide

如下快照來自Amazon.com,其中推薦基於用戶選擇的產品的一組產品。函數

咱們如今在ML.NET 0.8中支持這種狀況,您能夠嘗試這個基於亞馬遜共同購買數據集執行產品推薦的示例性能

經過預覽數據提升可調試性

 

在大多數狀況下,當開始使用管道並加載數據集時,查看加載到ML.NET DataView中的數據很是有用,甚至正如所料在通過一些中間轉換步驟後查看它以確保數據轉換。

首先,您能夠檢查DataView的架構。
您須要作的就是將鼠標懸停在IDataView對象上,展開它,而後查找Schema屬性。 

若是要查看DataView中加載的實際數據,能夠執行動畫下方顯示的步驟。 

具體步驟是:

  • 在調試時,打開Watch窗口
  • 輸入您的DataView對象的變量名稱(在本例中testDataView)並Preview()爲其調用方法。
  • 如今,單擊要檢查的行。這將顯示DataView中加載的實際數據。

默認狀況下,咱們在ColumnView和RowView中輸出前100個值。可是能夠經過將您感興趣的行數傳遞給Preview()函數做爲參數來改變,例如Preview(500)。

模型可解釋性

在ML.NET 0.8版本中,咱們已經包含了咱們在Microsoft內部使用的模型可解釋性API,以幫助機器學習開發人員更好地理解模型的功能重要性(「總體功能重要性」)並建立能夠解釋的高容量模型其餘(「廣義附加模型」)。

整體特徵重要性令人們瞭解哪些特徵對於模型而言整體上最重要。在建立機器學習模型時,一般不足以簡單地進行預測並評估其準確性。如上圖所示,功能重要性可幫助您瞭解哪些數據特徵對模型最有價值,以便進行良好預測。例如,在預測汽車價格時,某些功能更重要,如里程和品牌/品牌,而其餘功能可能會影響較少,如汽車的顏色。

經過名爲「置換特徵重要性」(PFI)的技術實現模型的「總體特徵重要性」。PFI經過詢問「若是特徵的值被設置爲隨機值(在整個示例中置換)對模型有什麼影響來測量特徵的重要性?」

PFI方法的優勢在於它與模型無關 - 它適用於任何能夠評估的模型 - 它可使用任何數據集而不只僅是訓練集來計算特徵重要性。

您能夠像這樣使用PFI來生成功能導入,其代碼以下所示:

// Compute the feature importance using PFI
var permutationMetrics = mlContext.Regression.PermutationFeatureImportance(model, data);

// Get the feature names from the training set
var 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 value
for (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.3695
    EmploymentDistance   -17.79             -0.2238
    TeacherRatio         -19.83             -0.1228
    TaxRate              -8.60              -0.1042
    NitricOxides         -15.95             -0.1025
    HighwayDistance        5.37             -0.09345
    CrimesPerCapita      -15.05             -0.05797
    PercentPre40s         -4.64             -0.0385
    PercentResidental      3.98             -0.02184
    CharlesRiver           3.38             -0.01487
    PercentNonRetail      -1.94             -0.007231

請注意,在當前的ML.NET v0.8中,PFI僅適用於基於二進制分類和迴歸的模型,但咱們將在即將發佈的版本中擴展到其餘ML任務。

有關使用PFI分析模型的功能重要性的完整示例,請參閱ML.NET存儲庫中的示例。

廣義附加模型或(GAM)具備很是可解釋的預測。它們在易於理解方面相似於線性模型,但更靈活,能夠具備更好的性能,而且還能夠進行可視化/繪圖以便於分析。

可在此處找到如何訓練GAM模型,檢查和解釋結果的示例用法

ML.NET 0.8中的其餘API改進

在此版本中,咱們還爲API添加了其餘加強功能,這些加強功能有助於過濾DataViews中的行,緩存數據,容許用戶將數據保存爲IDataView(IDV)二進制格式。您能夠在此處瞭解這些功能。

過濾DataView中的行

有時您可能須要過濾用於訓練模型的數據。例如,因爲任何緣由(如「異常值」數據),您可能須要刪除特定列的值低於或高於某些邊界的行。

如今可使用FilterByColumn()API之類的其餘過濾器來完成此操做,例如在ML.NET示例中示例應用程序的如下代碼,咱們但願僅保留介於1美圓和150美圓之間的付款行,由於對於此特定狀況,由於考慮高於150美圓「異常值」(極端數據扭曲模型)和低於1美圓多是數據錯誤: 

IDataView trainingDataView = mlContext.Data.FilterByColumn(baseTrainingDataView, "FareAmount", lowerBound: 1, upperBound: 150); 

得益於上面提到的Visual Studio中添加的DataView預覽,您如今能夠檢查DataView中的過濾數據。

其餘示例代碼可在此處獲取

 

一些估算器屢次迭代數據。您能夠選擇緩存數據,以便有時加快訓練執行速度,而不是始終從文件中讀取數據。

當訓練使用針對相同數據運行屢次迭代的OVA(One Versus All)訓練器時,如下是一個很好的示例。經過消除屢次從磁盤讀取數據的須要,您能夠將模型培訓時間減小多達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));

實現此示例代碼,並在ML.NET Samples repo 中的此示例應用程序測量執行時間

可在此處找到其餘測試示例

啓用以IDataView(IDV)二進制格式保存和加載數據以提升性能

 

在轉換數據後保存數據有時頗有用。例如,您可能已將全部文本特徵化爲稀疏向量,並但願使用不一樣的預訓練模型執行重複實驗,而無需不斷重複數據轉換。

IDV格式是ML.NET提供的二進制數據視圖文件格式。

IDV格式保存和加載文件一般比使用文本格式快得多,由於它是壓縮的。

另外,由於它已經在「文件內」進行了模式化,因此您不須要像使用常規TextLoader那樣指定列類型,所以除了更快以外,使用的代碼也更簡單。

可使用如下簡單的代碼行讀取二進制數據文件:

mlContext.Data.ReadFromBinary("pathToFile");

可使用如下代碼編寫二進制數據文件:

mlContext.Data.SaveAsBinary("pathToFile");

爲異常檢測等時間序列問題啓用狀態預測引擎

ML.NET 0.7基於時間序列啓用了異常檢測方案。可是,預測引擎是無狀態的,這意味着每次要肯定最新數據點是不是異常時,您還須要提供歷史數據。這是不天然的。

預測引擎如今能夠保持到目前爲止看到的時間序列數據的狀態,所以您如今能夠經過提供最新的數據點來得到預測。這是經過使用CreateTimeSeriesPredictionFunction()而不是使用CreatePredictionFunction()

能夠在此處找到示例用法。 

開始吧!

 

若是你尚未開始使用ML.NET這些資源對你或許有幫助:

相關文章
相關標籤/搜索