使用 ML.NET 进行保险价格预测
此前通過多篇文章已充分介紹過,ML.NET是一個(gè)開源的跨平臺(tái)機(jī)器學(xué)習(xí)框架,特別適合 .NET 開發(fā)人員。它允許將機(jī)器學(xué)習(xí)集成到 .NET 應(yīng)用中,而無需離開 .NET 生態(tài)系統(tǒng),甚至擁有 ML 或數(shù)據(jù)科學(xué)背景。ML.NET?現(xiàn)有的各種內(nèi)置模型訓(xùn)練器可用于圖像檢測(cè)、音頻檢測(cè)、基于文本的場(chǎng)景、情緒分析、銷售預(yù)測(cè)、電影推薦、異常檢測(cè)等等。隨著 ML.NET 的普及,越來越多的案例也證明了它走進(jìn)了實(shí)際生產(chǎn)環(huán)境,能夠解決豐富的機(jī)器學(xué)習(xí)場(chǎng)景問題了。本文的案例來自 Chandra Kudumula 的工作分享,Chandra Kudumula 是一名高級(jí)程序員兼分析師,擁有超過十二年的 IT 經(jīng)驗(yàn)。他成功地在金融、博彩和保險(xiǎn)服務(wù)等多個(gè)領(lǐng)域設(shè)計(jì)并開發(fā)了各種高可擴(kuò)展和高可用的企業(yè)應(yīng)用程序。本文跳過機(jī)器學(xué)習(xí)基礎(chǔ)知識(shí)和算法類型,以一個(gè)控制臺(tái)程序的完整代碼編寫過程為案例,重點(diǎn)展示他如何使用 ML.NET 來預(yù)測(cè)保險(xiǎn)價(jià)格。
大多數(shù)傳統(tǒng)保險(xiǎn)公司是雇用精算師來計(jì)算保險(xiǎn)費(fèi)。精算師是商業(yè)專業(yè)人士,他們使用數(shù)學(xué)和統(tǒng)計(jì)數(shù)據(jù)來評(píng)估財(cái)務(wù)損失的風(fēng)險(xiǎn),并根據(jù)年齡和性別等因素/特征預(yù)測(cè)保險(xiǎn)費(fèi)和索賠的可能性。它們通常會(huì)生成一種稱為精算表的東西,提供給保險(xiǎn)公司的承保部門,該部門通過輸入條件數(shù)據(jù)來設(shè)置保險(xiǎn)費(fèi)。保險(xiǎn)公司相當(dāng)一部分工作是依賴專業(yè)人士計(jì)算和編寫所有程序,但使用機(jī)器學(xué)習(xí)變得更加簡(jiǎn)單。機(jī)器學(xué)習(xí)允許程序從一組數(shù)據(jù)中學(xué)習(xí),以找出特定的問題特征。ML 會(huì)關(guān)注性別、吸煙、兒童人數(shù)和地區(qū)等不同因素,以找到總體最高的醫(yī)療費(fèi)用,并根據(jù)需求使用特定算法確定價(jià)格,比如吸煙者和孩子較多的客戶往往醫(yī)療費(fèi)用較高,因此這些群體的保費(fèi)將更多。隨著 ML 訓(xùn)練越來越多的數(shù)據(jù),ML 程序在預(yù)測(cè)確切價(jià)格方面變得更加聰明和敏感。最后,您需要調(diào)用一個(gè)交互程序,根據(jù)提供的輸入因素為特定人員計(jì)算保險(xiǎn)費(fèi),而不需要自己編寫所有這些程序。ML 程序查看提供的所有數(shù)據(jù)集以及訓(xùn)練學(xué)習(xí),最終將提供一個(gè)機(jī)器學(xué)習(xí)模型,您可以在應(yīng)用程序中使用。例如模型會(huì)認(rèn)為保險(xiǎn)價(jià)格取決于各種特征,如年齡、保險(xiǎn)類型、所需保險(xiǎn)金額、性別、體重指數(shù) (BMI)、地區(qū)以及吸煙等特殊因素,如果您想要預(yù)測(cè)保險(xiǎn)價(jià)格,在應(yīng)用程序中輸入這些因素的值就能獲得結(jié)果。
機(jī)器學(xué)習(xí)工作流程
ML 工作流有三個(gè)關(guān)鍵步驟:
準(zhǔn)備數(shù)據(jù)。加載數(shù)據(jù)庫或CSV文件的數(shù)據(jù)。提取/識(shí)別與您將要解決或預(yù)測(cè)結(jié)果的問題相關(guān)的關(guān)鍵特征(輸入和輸出參數(shù))。
構(gòu)建和訓(xùn)練ML模型。在這里,您可以評(píng)估不同的算法、設(shè)置參數(shù)并查看哪個(gè)模型最適合您的方案。
模型準(zhǔn)備好后,請(qǐng)?jiān)趹?yīng)用程序中使用模型。
?
?
?
預(yù)測(cè)保險(xiǎn)價(jià)格/保費(fèi)的 ML.NET
價(jià)格預(yù)測(cè)根據(jù)一些輸入數(shù)據(jù)(如年齡、性別、吸煙、體重指數(shù) (BMI)、兒童數(shù)量和地區(qū))確定保險(xiǎn)價(jià)格。價(jià)格預(yù)測(cè)是機(jī)器學(xué)習(xí)回歸任務(wù)的一個(gè)例子,該任務(wù)可以預(yù)測(cè)數(shù)字相關(guān)的問題。
對(duì)保險(xiǎn)費(fèi)的預(yù)測(cè)如下。你有一些特征輸入(年齡,性別,吸煙等),進(jìn)入訓(xùn)練過程。這些特征可以確定溢價(jià)金額的高或低。例如,年輕人不太可能需要醫(yī)療照顧,所以他們的保費(fèi)通常更便宜,吸煙者的保費(fèi)也更高。標(biāo)簽輸出是您想要預(yù)測(cè)的價(jià)格,這是調(diào)用機(jī)器學(xué)習(xí)模型的結(jié)果。
下圖是保險(xiǎn)數(shù)據(jù)的示例,該示例是模型的輸入和輸出:
如何開始與 ML.NET
從 ML.NET 開始有三種方法
API 模型:您可以通過API開始 ML.NET,并以 C# 或 F# 編寫代碼
GUI 模型:在 Visual Studio 中使用 ML.NET模型構(gòu)建器。
CLI 模型:對(duì)于像 Mac 和 Linux 這樣的跨平臺(tái)開發(fā),請(qǐng)使用 ML.NET CLI。
讓我們開始以 API 模型使用 ML.NET 框架預(yù)測(cè)保險(xiǎn)費(fèi)。
我使用 Visual Studio 2019 創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序。請(qǐng)確保您擁有最新版本的VS,并且安裝了 .NET 5 SDK。
打開 Visual Studio 創(chuàng)建一個(gè)新項(xiàng)目->選擇C#控制臺(tái)應(yīng)用程序。
提供項(xiàng)目名稱
?
?
從下拉中選擇目標(biāo)框架并按下"創(chuàng)建"按鈕。
?
?
創(chuàng)建控制臺(tái)應(yīng)用程序。
?
?
需要ML模型的樣本/測(cè)試保險(xiǎn)數(shù)據(jù)。從 https://www.kaggle.com/mirichoi0218/insurance 下載insurance.csv文件數(shù)據(jù),并將文件復(fù)制到控制臺(tái)項(xiàng)目中。您可以使用列標(biāo)題(年齡、性別、BMI 等)查看數(shù)據(jù),并在打開文件時(shí)通過逗號(hào)將其分離。
?
?
從NuGet安裝所需的ML包。在"解決方案資源管理器"中,右鍵單擊項(xiàng)目并選擇"Manage ?NuGet 包"。
?
?
安裝 Microsoft.ML 包。
?
?
還要安裝Microsoft.ML.AutoML包。此包通過自動(dòng)定位最佳功能工程、模型和超參數(shù)來優(yōu)化數(shù)據(jù)集的 ML 管道。
注意:我使用此包來找出價(jià)格預(yù)測(cè)的最佳算法。如果您熟悉或決定轉(zhuǎn)到特定算法,則不需要此包。
?
?
添加代碼
已完成的Program.cs文件可以在這里找到。首先添加所需使用語句:
?
?
?
添加ModelInput和ModelOutput類到Program.cs。該類包含與輸入數(shù)據(jù)文件insurance.csv的標(biāo)題匹配的屬性。
?
?
在程序類中,添加兩個(gè)常數(shù),和 H。第一個(gè)包含數(shù)據(jù)集的路徑:后者包含在培訓(xùn)完成后保存模型的路徑。TRAIN_DATA_FILEPATHMODEL_FILEPAT
?
?
創(chuàng)建實(shí)例是所有 ML.NET 操作的初始化步驟。它提供加載和準(zhǔn)備數(shù)據(jù)、訓(xùn)練、評(píng)估和模型預(yù)測(cè)的所有所需組件。有一個(gè)可選參數(shù)稱為種子。默認(rèn)情況下,種子值為空,MLContext環(huán)境不確定,輸出會(huì)跨多個(gè)運(yùn)行時(shí)變更。如果您提供固定數(shù)值,則MLContext環(huán)境將保持變化是確定的,結(jié)果在多個(gè)MLContext運(yùn)行中是一致的。
?
?
創(chuàng)建MLContext實(shí)例后,您需要使用此類加載數(shù)據(jù),以創(chuàng)建在數(shù)據(jù)、加載、保存、緩存、篩選、隨機(jī)和拆分輸入數(shù)據(jù)上的DataOperationsCatalog組件。但這不是模型訓(xùn)練管道的一部分。
從CSV文件加載數(shù)據(jù)。提供所需的輸入?yún)?shù),如 CSV 文件是否有標(biāo)題、使用什么符號(hào)來分離數(shù)據(jù)等。
?
?
數(shù)據(jù)已加載,但需要清理或轉(zhuǎn)換模型可以理解的輸入數(shù)據(jù)。
?
?
輸入數(shù)據(jù)是分類數(shù)據(jù)。分類數(shù)據(jù)只不過是包含標(biāo)簽值的變量,而不是數(shù)字值。輸入數(shù)據(jù)"性別"和"區(qū)域"具有標(biāo)簽值,您需要將其轉(zhuǎn)換為數(shù)字值,并且可能的值數(shù)通常僅限于固定集。例如,區(qū)域數(shù)據(jù)只有兩個(gè)值,即東南或西北。
此外,吸煙者列包含"是"或"否",但這些數(shù)據(jù)需要轉(zhuǎn)換為真或假。
以下是使用"TransformsCatalog"轉(zhuǎn)換吸煙者列和分類數(shù)據(jù)列的代碼:性別和區(qū)域。最后,將所有輸入列串聯(lián)在一起。
?
?
ConversionTransforms:提供操作列表,將數(shù)據(jù)從一種類型轉(zhuǎn)換為另一種類型。包括是對(duì)真,否對(duì)假。
Append:通過將另一個(gè)估計(jì)器附加到此估計(jì)器的末尾創(chuàng)建一個(gè)新的估算鏈。
CategoricalTransforms:創(chuàng)建分類數(shù)據(jù)轉(zhuǎn)換組件的實(shí)例,您將使用它們轉(zhuǎn)換分類數(shù)據(jù),如性別和區(qū)域。
ColumnConcatenate:這將將一個(gè)或多個(gè)輸入列串聯(lián)到新的輸出列中。
您需要在 AutoML 的幫助下找到性能最好的模型。以下是探索多個(gè)模型的代碼。更長(zhǎng)的訓(xùn)練時(shí)間使 AutoML 能夠探索更多,并為機(jī)器學(xué)習(xí)模型提供更高的精度。
?
?
?
運(yùn)行實(shí)驗(yàn)
運(yùn)行實(shí)驗(yàn)后,AutoML 探索了不同的模型。以下是顯示評(píng)估模型并建議最佳模型的控制臺(tái)輸出窗口:基于輸入數(shù)據(jù)的價(jià)格預(yù)測(cè)的LightGbm 回歸。
?
?
?
要打印平均指標(biāo),添加此功能:
?
?
構(gòu)建模型
現(xiàn)在,我有最好的價(jià)格預(yù)測(cè)算法,我會(huì)使用這個(gè)算法的代碼,并建立模型。以下是創(chuàng)建、訓(xùn)練、交叉驗(yàn)證和保存模型的代碼片段。
測(cè)試模型
現(xiàn)在,模型被創(chuàng)建、訓(xùn)練并保存到 Zip 文件中。通過傳遞樣本數(shù)據(jù)測(cè)試訓(xùn)練好的模型。以下是使用預(yù)測(cè)引擎加載模型并預(yù)測(cè)結(jié)果的代碼片段。
?
?
運(yùn)行模型后,以下是控制臺(tái)窗口上的預(yù)測(cè)輸出。
?
?
總結(jié)
您已經(jīng)看到使用 ML.NET 使用 API 框架進(jìn)行價(jià)格預(yù)測(cè)是多么容易。同樣,您可以使用GUI(模型構(gòu)建器)或CLI模型來獲得相同的結(jié)果。
引用
https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet
https://www.kaggle.com/mirichoi0218/insurance
https://www.investopedia.com/ask/answers/09/calculating-premium.asp
https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/
https://github.com/jwood803/MLNetExamples/blob/master/MLNetExamples/AutoML/Program.cs
總結(jié)
以上是生活随笔為你收集整理的使用 ML.NET 进行保险价格预测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hello Blazor:(2)集成Ta
- 下一篇: asp.net ajax控件工具集 Au