VS Code + ML.NET 玩转交互式机器学习
在上一篇文章中,我們介紹了 .NET Interactive Notbook,可以進(jìn)行代碼實(shí)時(shí)運(yùn)行和交互式展示。
這對(duì)于ML.NET來說非常棒,可以運(yùn)用到許多場(chǎng)景,比如數(shù)據(jù)探索、繪制數(shù)據(jù)圖表、編制教學(xué)課件等。
下面,我們就用出租車費(fèi)預(yù)測(cè)(https://github.com/feiyun0112/machinelearning-samples.zh-cn/tree/master/samples/csharp/getting-started/Regression_TaxiFarePrediction)來進(jìn)行演示。
1.創(chuàng)建Notebook
首先,VS Code需要安裝“.NET Interactive Notebooks”擴(kuò)展。
新建文件,編程語言選擇“.NET Interactive”,保存文件名后綴為“.ipynb”。
添加Markdown標(biāo)記,說明一下這個(gè)機(jī)器學(xué)習(xí)任務(wù)要解決的問題場(chǎng)景。
完成編輯后,可以自動(dòng)顯示Markdown標(biāo)記結(jié)果:
2.安裝Nuget包
引用后面需要使用的NuGet包,這里,我們將使用ML.NET進(jìn)行機(jī)器學(xué)習(xí)和XPlot繪制圖表。
運(yùn)行代碼,下載和安裝NuGet包。
可以看到,安裝時(shí)間還是比較長(zhǎng)的,所以可以放在單獨(dú)的代碼塊提前運(yùn)行。
3.定義DataStructures
定義加載數(shù)據(jù)以及訓(xùn)練或預(yù)測(cè)時(shí),需要使用輸入類和預(yù)測(cè)類,代碼如下:
?public?class?TaxiTrip {[LoadColumn(0)]public?string?VendorId;[LoadColumn(1)]public?string?RateCode;[LoadColumn(2)]public?float?PassengerCount;[LoadColumn(3)]public?float?TripTime;[LoadColumn(4)]public?float?TripDistance;[LoadColumn(5)]public?string?PaymentType;[LoadColumn(6)]public?float?FareAmount; }4.加載數(shù)據(jù)
加載訓(xùn)練和測(cè)試數(shù)據(jù)集,文件放在Notebook同一目錄下:
MLContext?mlContext?=?new?MLContext(seed:?0);string?TrainDataPath?=?"./taxi-fare-train.csv"; string?TestDataPath?=?"./taxi-fare-test.csv"; IDataView?baseTrainingDataView?=?mlContext.Data.LoadFromTextFile<TaxiTrip>(TrainDataPath,?hasHeader:?true,?separatorChar:?','); IDataView?testDataView?=?mlContext.Data.LoadFromTextFile<TaxiTrip>(TestDataPath,?hasHeader:?true,?separatorChar:?',');IDataView?trainingDataView?=?mlContext.Data.FilterRowsByColumn(baseTrainingDataView,?nameof(TaxiTrip.FareAmount),?lowerBound:?1,?upperBound:?150); display(h4("展示訓(xùn)練數(shù)據(jù):")); var?someRows?=?mlContext.Data.CreateEnumerable<TaxiTrip>(trainingDataView,?reuseRowObject:?false).Take(4).ToArray(); display(someRows);我們篩選了出租車票金額在1-150之間的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),并用內(nèi)置函數(shù)display展示4行訓(xùn)練數(shù)據(jù)內(nèi)容:?
5.圖形化展示數(shù)據(jù)
圖形方式能讓我們更好地理解數(shù)據(jù),選取100條訓(xùn)練數(shù)據(jù),看看費(fèi)用的分布情況:
var?faresHistogram?=?Chart.Plot(new?Histogram()?{?x?=?trainingDataView.GetColumn<float>("FareAmount").Take(100).ToArray(),?autobinx?=?false,?nbinsx?=?20?}); var?layout?=?new?Layout.Layout()?{?title?=?"出租車費(fèi)分布"?}; faresHistogram.WithLayout(layout); faresHistogram.WithXTitle("費(fèi)用范圍"); faresHistogram.WithYTitle("出行數(shù)");display(faresHistogram)可以看到費(fèi)用大多數(shù)在5-10之間,?
6.訓(xùn)練模型
現(xiàn)在,讓我們真正開始執(zhí)行機(jī)器學(xué)習(xí)。我們將首先處理數(shù)據(jù)轉(zhuǎn)換,然后添加訓(xùn)練器/算法,最后訓(xùn)練模型。
在執(zhí)行窗口底部可以看到,訓(xùn)練速度還是比較快的,在我的機(jī)器上只需要1.7秒。
7.評(píng)估模型
我們需要這一步來總結(jié)我們的模型對(duì)新數(shù)據(jù)的準(zhǔn)確性。為此,上一步中的模型針對(duì)另一個(gè)未在訓(xùn)練中使用的數(shù)據(jù)集運(yùn)行(taxi-fare-test.csv)。此數(shù)據(jù)集也包含已知的費(fèi)用。Regression.Evaluate()計(jì)算已知費(fèi)用和模型預(yù)測(cè)的費(fèi)用之間差異的各種指標(biāo)。
IDataView?predictions?=?trainedModel.Transform(testDataView); var?metrics?=?mlContext.Regression.Evaluate(predictions,?labelColumnName:?"Label",?scoreColumnName:?"Score");display(metrics)6.繪制對(duì)比圖
最后,我們繪制預(yù)測(cè)與實(shí)際值的對(duì)比圖。如果回歸模型工作得很好,那么這些點(diǎn)大部分應(yīng)該是圍繞著一條直線的,這條直線就是回歸線。
回歸線越接近“完美”(預(yù)測(cè)值等于測(cè)試數(shù)據(jù)集中的實(shí)際值),模型的質(zhì)量就越好。
結(jié)論
后面的保存和使用模型,我們就不再演示了,請(qǐng)大家自行探索。
通過上面的示例,可以看到非常棒的交互體驗(yàn)。歡迎大家繼續(xù)挖掘.NET Interactive的潛力,玩轉(zhuǎn)交互式機(jī)器學(xué)習(xí)!!!
歡迎關(guān)注我的個(gè)人公眾號(hào)”My IO“
總結(jié)
以上是生活随笔為你收集整理的VS Code + ML.NET 玩转交互式机器学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么async/await方法不能有l
- 下一篇: 谈谈MySQL面试的45个常见问题