ML.NET机器学习、API容器化与Azure DevOps实践(一):简介
打算使用幾篇文章介紹一下.NET下的機(jī)器學(xué)習(xí)框架ML.NET的具體應(yīng)用,包括一些常用的業(yè)務(wù)場(chǎng)景、算法的選擇、模型的訓(xùn)練以及RESTful?API的創(chuàng)建、機(jī)器學(xué)習(xí)服務(wù)容器化,以及基于Azure?DevOps的容器化部署等等相關(guān)的內(nèi)容。如果你從來(lái)沒(méi)有玩過(guò)機(jī)器學(xué)習(xí),也從來(lái)沒(méi)有了解過(guò)ML.NET,那么,本文將會(huì)是一個(gè)很好的開(kāi)始。
機(jī)器學(xué)習(xí)是一種對(duì)算法和統(tǒng)計(jì)數(shù)據(jù)模型進(jìn)行科學(xué)學(xué)習(xí)的方式,通過(guò)使用這種方式,計(jì)算機(jī)系統(tǒng)能夠有效地基于模式與推斷,而非遵循特定的指令序列來(lái)完成一項(xiàng)特定的任務(wù)。機(jī)器學(xué)習(xí)是人工智能科學(xué)的一個(gè)分支,屬于人工智能范疇。?(參考:https://en.wikipedia.org/wiki/Machine_learning)。
分類
機(jī)器學(xué)習(xí)可以分為如下幾類:
監(jiān)督學(xué)習(xí)(Supervised Learning)
無(wú)監(jiān)督學(xué)習(xí)(Unsupervised Learning)
半監(jiān)督學(xué)習(xí)(Semi-supervised Learning)
增強(qiáng)學(xué)習(xí)(Reinforcement Learning)
監(jiān)督學(xué)習(xí)
從給定的訓(xùn)練數(shù)據(jù)集中學(xué)習(xí)出一種算法,當(dāng)?shù)臄?shù)據(jù)到來(lái)時(shí),可以根據(jù)這個(gè)函數(shù)預(yù)測(cè)結(jié)果。監(jiān)督學(xué)習(xí)的訓(xùn)練集要求是包括輸入和輸出,也可以說(shuō)是特征和目標(biāo)。訓(xùn)練集中的目標(biāo)是由人標(biāo)注的。常見(jiàn)算法分為:統(tǒng)計(jì)分類(Classification,根據(jù)訓(xùn)練模型,通過(guò)給定的特征屬性,預(yù)測(cè)目標(biāo)屬性屬于哪個(gè)分類)和回歸分析(Regression,根據(jù)訓(xùn)練模型,通過(guò)給定的特征屬性,預(yù)測(cè)目標(biāo)屬性的取值)。
無(wú)監(jiān)督學(xué)習(xí)
與監(jiān)督學(xué)習(xí)相比,訓(xùn)練集沒(méi)有人為標(biāo)注的結(jié)果(沒(méi)有人會(huì)對(duì)訓(xùn)練數(shù)據(jù)集中的某個(gè)屬性進(jìn)行標(biāo)注,標(biāo)注其為哪個(gè)分類,或者取值是多少)。常見(jiàn)算法有聚類(Clustering)、無(wú)監(jiān)督異常情況檢測(cè)(Unsupervised?Anomaly?Detection)等。
半監(jiān)督學(xué)習(xí)
介于監(jiān)督學(xué)習(xí)與無(wú)監(jiān)督學(xué)習(xí)之間,根據(jù)部分已被標(biāo)記的數(shù)據(jù)來(lái)推斷未標(biāo)注數(shù)據(jù)的標(biāo)注信息,并實(shí)現(xiàn)預(yù)測(cè)。
增強(qiáng)學(xué)習(xí)
機(jī)器為了達(dá)成目標(biāo),隨著環(huán)境的變動(dòng),而逐步調(diào)整其行為,并評(píng)估每一個(gè)行動(dòng)之后所到的回饋是正向的或負(fù)向的。常見(jiàn)的棋局預(yù)測(cè)就屬于這一類。
機(jī)器學(xué)習(xí)算法評(píng)估標(biāo)準(zhǔn)
在選擇了機(jī)器學(xué)習(xí)算法之后,就可以基于訓(xùn)練數(shù)據(jù)集,對(duì)機(jī)器學(xué)習(xí)模型進(jìn)行訓(xùn)練,在訓(xùn)練結(jié)束后,可以通過(guò)一些衡量標(biāo)準(zhǔn)來(lái)尋求最優(yōu)的機(jī)器學(xué)習(xí)算法。通常,我們會(huì)使用另一部分已知結(jié)果的數(shù)據(jù)作為測(cè)試樣本數(shù)據(jù)集,基于已訓(xùn)練好的模型進(jìn)行測(cè)試預(yù)測(cè),然后比對(duì)真實(shí)值與預(yù)測(cè)值以對(duì)算法進(jìn)行評(píng)估。機(jī)器學(xué)習(xí)算法的評(píng)估標(biāo)準(zhǔn)常見(jiàn)的有以下幾種(參考:https://machinelearningmastery.com/metrics-evaluate-machine-learning-algorithms-python/):
統(tǒng)計(jì)分類(Classification)算法衡量標(biāo)準(zhǔn)
Classification Accuracy
Logarithmic Loss
Area Under ROC Curve
Confusion Matrix
Classification Report
回歸分析(Regression)算法衡量標(biāo)準(zhǔn)
Mean Absolute Error
Mean Squared Error
R^2 (R-Squared)
ML.NET是微軟推出的一款基于.NET/.NET?Core的機(jī)器學(xué)習(xí)框架,通過(guò)使用ML.NET,開(kāi)發(fā)者可以使用.NET相關(guān)語(yǔ)言和開(kāi)發(fā)工具進(jìn)行機(jī)器學(xué)習(xí)任務(wù)的開(kāi)發(fā)、測(cè)試、部署和運(yùn)行。例如,根據(jù)不同的問(wèn)題場(chǎng)景,開(kāi)發(fā)者可以使用ML.NET并選擇相應(yīng)的算法,基于已有的訓(xùn)練數(shù)據(jù)集,對(duì)機(jī)器學(xué)習(xí)模型進(jìn)行訓(xùn)練,并將模型保存成文件或發(fā)布到云存儲(chǔ)以備后需;也可以使用ML.NET讀取已存儲(chǔ)的訓(xùn)練模型,并基于給定的測(cè)試數(shù)據(jù)集進(jìn)行預(yù)測(cè),返回預(yù)測(cè)結(jié)果。ML.NET支持自定義的機(jī)器學(xué)習(xí)算法,還能整合當(dāng)下流行的機(jī)器學(xué)習(xí)平臺(tái),比如Tensorflow,這使得.NET下機(jī)器學(xué)習(xí)的應(yīng)用變得非常簡(jiǎn)單方便。
從.NET?Core?3.0開(kāi)始,ML.NET將在.NET?Core框架下得到原生的支持(參考Scott?Hunter的《What’s?Coming?in?.NET?Core?3.0》一文),微軟官方的一些產(chǎn)品,例如Azure?Machine?Learning、Windows?Defender以及PowerPoint的新功能:設(shè)計(jì)創(chuàng)意,都使用了ML.NET框架。有了ML.NET,可以在應(yīng)用程序中快速、方便地整合一些機(jī)器學(xué)習(xí)的應(yīng)用功能,比如:情感分析、猜你喜歡、數(shù)據(jù)預(yù)測(cè)、圖片分類等等。下圖展示了ML.NET與.NET?Core?3.0之間的關(guān)系(圖片來(lái)源:https://devblogs.microsoft.com/dotnet/net-core-3-and-support-for-windows-desktop-applications/):
ML.NET支持的機(jī)器學(xué)習(xí)任務(wù)
目前,ML.NET支持以下幾種常見(jiàn)的機(jī)器學(xué)習(xí)任務(wù)(參考:https://docs.microsoft.com/zh-cn/dotnet/machine-learning/resources/tasks):
二元分類(Binary?Classification):預(yù)測(cè)目標(biāo)屬性的取值是“真”或“假”(0或1,Yes或No)
多類分類(Multiclassification):預(yù)測(cè)目標(biāo)屬性的取值屬于哪一分類
回歸(Regression):預(yù)測(cè)目標(biāo)屬性的結(jié)果值(一般是得到一個(gè)浮點(diǎn)數(shù))
聚類分析(Clustering):根據(jù)數(shù)據(jù)集中數(shù)據(jù)的某種特性,將數(shù)據(jù)進(jìn)行分組
異常情況檢測(cè)(Anomaly?Detection):根據(jù)數(shù)據(jù)集的數(shù)據(jù),識(shí)別出小部分的“特殊化”數(shù)據(jù)(異常數(shù)據(jù))
排名(Ranking):排名任務(wù)從一組標(biāo)記的示例構(gòu)建排名程序。?該示例集由實(shí)例組組成,這些實(shí)例組可以使用給定的標(biāo)準(zhǔn)進(jìn)行評(píng)分。?每個(gè)實(shí)例的排名標(biāo)簽是?{?0,?1,?2,?3,?4?}。?排名程序定型為用每個(gè)實(shí)例的未知分?jǐn)?shù)對(duì)新實(shí)例組進(jìn)行排名
建議(Recommendation):支持生成推薦產(chǎn)品或服務(wù)的列表,例如,你為用戶提供歷史電影評(píng)級(jí)數(shù)據(jù),并希望向他們推薦接下來(lái)可能觀看的其他電影
在使用ML.NET進(jìn)行機(jī)器學(xué)習(xí)之前,需要首先確定自己的應(yīng)用場(chǎng)景,然后根據(jù)應(yīng)用場(chǎng)景選擇合適的機(jī)器學(xué)習(xí)算法并定制訓(xùn)練管道(Training?Pipeline)。比如:通過(guò)機(jī)器學(xué)習(xí)來(lái)判斷某種化合物對(duì)于細(xì)胞的作用是陰性的還是陽(yáng)性的,這屬于二元分類的應(yīng)用范疇;再比如,根據(jù)一批學(xué)生的個(gè)人情況以及他們的學(xué)習(xí)成績(jī),來(lái)預(yù)測(cè)另一部分學(xué)生的學(xué)習(xí)成績(jī),這屬于回歸任務(wù)的應(yīng)用范疇。開(kāi)發(fā)者需要根據(jù)應(yīng)用場(chǎng)景來(lái)進(jìn)行選擇。
ML.NET機(jī)器學(xué)習(xí)實(shí)踐步驟
通常情況下,使用ML.NET進(jìn)行機(jī)器學(xué)習(xí)實(shí)踐,有以下這些步驟:
數(shù)據(jù)預(yù)處理與規(guī)整化?:對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行規(guī)整化處理,比如刪除一些特殊數(shù)據(jù)或者拋棄一些空值
確定問(wèn)題類型(是分類、回歸還是聚合等)?:確定我們需要拿著訓(xùn)練數(shù)據(jù)集干什么?是對(duì)其中某些特性進(jìn)行分類,還是用來(lái)預(yù)測(cè)未知值?
確定特征屬性與目標(biāo)屬性:通過(guò)使用Microsoft?Power?BI或者TIBCO?Spotfire等分析工具,來(lái)確定哪些字段屬于特性控制(Feature?Control)字段,哪些字段屬于目標(biāo)字段
使用相應(yīng)分類下的不同算法,基于訓(xùn)練數(shù)據(jù)集進(jìn)行模型訓(xùn)練
根據(jù)算法衡量標(biāo)準(zhǔn)對(duì)模型進(jìn)行評(píng)估,選擇合適算法:使用測(cè)試樣本數(shù)據(jù)集,對(duì)算法所產(chǎn)生的模型進(jìn)行預(yù)測(cè),然后比較預(yù)測(cè)結(jié)果與實(shí)際結(jié)果,從而達(dá)到評(píng)估算法的目的
基于最優(yōu)算法生成并發(fā)布模型:將模型發(fā)布成文件,保存以備后用
構(gòu)建API:基于發(fā)布的模型構(gòu)建RESTful?API,便于應(yīng)用程序集成
部署API:將RESTful?API部署到云端,便于應(yīng)用程序調(diào)用
本文簡(jiǎn)要介紹了機(jī)器學(xué)習(xí)的基本知識(shí),并對(duì)ML.NET機(jī)器學(xué)習(xí)框架進(jìn)行了簡(jiǎn)要介紹。文章最后描述了使用ML.NET進(jìn)行機(jī)器學(xué)習(xí)的實(shí)踐步驟。后續(xù)文章會(huì)以一到兩個(gè)案例為基礎(chǔ),詳細(xì)介紹這8個(gè)步驟的具體實(shí)踐。
原文地址:?http://sunnycoding.cn/2019/04/06/mlnet-containerize-and-azure-devops-practices-part1/
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的ML.NET机器学习、API容器化与Azure DevOps实践(一):简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP.NET Core 进程内(InP
- 下一篇: 聊一聊C# 8.0中的await for