機器學習之ML.NET

 

專有名詞概念

標籤(Labels):預測列,需要預測的內容
特徵(Features):用於幫助預測標籤的列
模型(Model):模型是通過訓練數據學習到的機器學習算法。它可以用來預測未知數據的標籤

 

 官方地址:ML.NET |專爲 .NET 設計的機器學習 (microsoft.com)

準備環境

必須開發工具:Visual Studio 2022

 

必須組件:需要開啓 Visual Studio 中 .NET桌面開發=》ML.NET Model Builder

Visual Studio 2022 版本:17.8.3

.net core 版本: 8.0

 

下面都是用控制檯應用程序演示的,所以自己新建一個控制檯應用程序,我這裏取名 myMLApp。

數據分類

示例說明:對現有的情緒數據進行訓練,現有的情緒數據包含兩列,一列是情緒語句(也就是特徵);一列是對應的情緒,只有兩個值0(悲觀情緒)和1(樂觀情緒)。生成訓練模型後會根據輸入的情緒語句進行預測判定對應的情緒

 1. 添加機器學習模型模型,取名爲MLModel.mbconfig

2. 選取方案,數據分類

3. 選擇環境,這裏只有一個選項

4. 導入數據。點擊直接下載。更多其他數據可以訪問Datasets - UCI Machine Learning Repository

 4.1 數據下載後解壓縮 sentiment labelled sentences.zip 並保存 yelp_labelled.txt 文件到 myMLApp 目錄。yelp_labelled.txt 中的每一行代表用戶在 Yelp 上對餐廳的不同評論。第一列代表用戶留下的評論,第二列代表文本的情緒(0 爲負面,1 爲正面)。這些列由製表符分隔,並且數據集沒有標頭。

 4.2 數據來源選擇文件,數據集瀏覽 yelp_labelled.txt 文件路徑。數據預覽會自動生成表頭col0 和 col1.

 4.3 在“預測列 (標籤)”下,選擇 "col1"。“標籤”是預測內容,在本例中是在數據集的第二列 ("col1") 中發現的情緒。

 4.4用於幫助預測標籤的列稱爲“特徵”。除“標籤”外,數據集中的所有列都將自動選擇爲“特徵”。在這種情況下,審閱評論列(“col0”)是特徵列。可以在“高級數據選項”中更新特徵列並修改其他數據加載選項,但在本示例中不是必需的。

5. 訓練模型。選擇方案、環境、數據和標籤後,模型生成器會訓練該模型。

訓練是一個自動的過程,模型生成器通過該過程教模型如何回答方案相關的問題。 訓練後,模型可以對其沒有見過的輸入數據進行預測。因爲模型生成器使用自動機器學習 (AutoML),所以在訓練期間不需要任何人工輸入或微調操作。

訓練時長:模型生成器使用 AutoML 瀏覽多個模型,以查找性能最佳的模型。更長的訓練週期允許 AutoML 通過更多設置來瀏覽更多模型。下表彙總了在本地計算機上爲一組示例數據集獲取良好性能所花的平均時間。

這些數字僅用於指南。 訓練的確切長度取決於:

  • 用作模型輸入的特徵(列)數
  • 列的類型
  • ML 任務
  • 用於訓練的計算機的 CPU、磁盤和內存性能

通常建議使用超過 100 行的數據集,否則可能不會生成任何結果。

最佳 MacroAccuracy - 這將向你展示 Model Builder 找到的最佳模型的準確性。準確性越高意味着模型對於測試數據的預測越正確。
最佳模型 - 這將顯示在 Model Builder 探索期間表現最佳的算法。
訓練時間 - 顯示訓練/探索模型所花費的總時間量。
已瀏覽的模型(總計) - 這將顯示 Model Builder 在給定時間內瀏覽的模型總數。
生成的代碼隱藏 - 這顯示爲幫助使用模型或訓練新模型而生成的文件的名稱。

6. 評估是衡量模型品質的過程。 模型生成器使用經過訓練的模型對新的測試數據進行預測,然後度量預測效果的過程

7. 使用。前面已經訓練好模型了,這裏提供了兩種使用方式示例:一種是直接複製代碼在當前模型所在應用程序就可以使用了,一種是生成對應的控制檯或web api項目,生成的項目會自動複製剛剛訓練的模型,我這裏測試就用的第一種

8. 將剛剛的示例代碼複製到控制檯直接運行(我這裏新加了幾行代碼便於觀察)

using MyMLApp;

var sampleData = new MyMLModel.ModelInput()
{
    Col0 = @"I advise EVERYONE DO NOT BE FOOLED!",
};

//Load model and predict output
var result = MyMLModel.Predict(sampleData);

Console.WriteLine("預測結果:"+ result.PredictedLabel);
var sortedScoresWithLabel = MyMLModel.GetSortedScoresWithLabels(result);
Console.WriteLine($"{"Class",-40}{"Score",-20}");
Console.WriteLine($"{"-----",-40}{"-----",-20}");

foreach (var score in sortedScoresWithLabel)
{
    Console.WriteLine($"{score.Key,-40}{score.Value,-20}");
}
Console.ReadLine();

 

 注意:如果模型性能評分不符合預期,可以:

1. 延長訓練時間。 有了更多時間,自動機器學習引擎可以體驗更多算法和設置。

2. 添加更多數據。 有時,數據量不足以訓練高質量的機器學習模型。對於包含少量示例的數據集,尤其如此。

3. 均衡分配數據。 對於分類任務,請確保在各個類別間均勻分配訓練集。 例如,若有四個類別和 100 個訓練示例,前兩類(標記 1 和標記 2)包含 90 個記錄,而剩下兩類(標記 3 和標記 4)只包含 10 個記錄,這就存在數據不均衡的問題,
可能會導致模型很難正確預測標記 3 或標記 4

 

利用迴歸函數進行值預測

場景:可以根據打車的時間,行駛里程數等因素預測車費,根據房子大小、地理位置來預測房價等等

示例說明:手動模擬了一百多條數據,來預測打車的費用,數據包含四列:第一列爲行車時間(秒),第二列爲里程數,第三列爲支付方式(這裏有兩種支付方式,支付寶和微信),第四列爲車費。默認使用車費=行車時間*0.1+里程數*0.2,如果使用微信支付打0.88折,支付寶則不打折(這個規則只是隨便編的爲了驗證後面的數據)

具體步驟和上面數據分類的步驟差不多,這裏就省略了很多相同的步驟

1. 方案選擇值預測

2. 數據:導入準備的測試數據

3. 訓練:選擇了30秒,訓練完成後會自動覆蓋之前的模型代碼

4. 評估:可以直接在這裏測試

5. 使用:不同的方案生成的代碼不一樣,輸入輸出的類和方法不同,但是使用方式是差不多的

var sampleData = new MyMLModel.ModelInput()
{
    Col0 = 200,
    Col1 = 12,
    Col2 = @"ZFB",
};

//Load model and predict output
var result = MyMLModel.Predict(sampleData);
Console.WriteLine("預測結果值:"+ result.Score);
Console.ReadLine();

按照之前預置的規則費用如果是支付寶支付,車費應該=行車時間*0.1+里程數*0.2=200*0.1+12*0.2=22.4。 這裏預測出來是24.78054,因爲我這裏數據只有一百多條進行訓練,肯定有偏差,如果進行大量的數據訓練,這個數據偏差肯定會更小

 其他環境使用類似

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章