【转】使用 ML.NET 进行保险价格预测
此前通过多篇文章已充分介绍过,ML.NET是一个开源的跨平台机器学习框架,特别适合 .NET 开发人员。它允许将机器学习集成到 .NET 应用中,而无需离开 .NET 生态系统,甚至拥有 ML 或数据科学背景。ML.NET 现有的各种内置模型训练器可用于图像检测、音频检测、基于文本的场景、情绪分析、销售预测、电影推荐、异常检测等等。随着 ML.NET 的普及,越来越多的案例也证明了它走进了实际生产环境,能够解决丰富的机器学习场景问题了。本文的案例来自 Chandra Kudumula 的工作分享,Chandra Kudumula 是一名高级程序员兼分析师,拥有超过十二年的 IT 经验。他成功地在金融、博彩和保险服务等多个领域设计并开发了各种高可扩展和高可用的企业应用程序。本文跳过机器学习基础知识和算法类型,以一个控制台程序的完整代码编写过程为案例,重点展示他如何使用 ML.NET 来预测保险价格。
大多数传统保险公司是雇用精算师来计算保险费。精算师是商业专业人士,他们使用数学和统计数据来评估财务损失的风险,并根据年龄和性别等因素/特征预测保险费和索赔的可能性。它们通常会生成一种称为精算表的东西,提供给保险公司的承保部门,该部门通过输入条件数据来设置保险费。保险公司相当一部分工作是依赖专业人士计算和编写所有程序,但使用机器学习变得更加简单。机器学习允许程序从一组数据中学习,以找出特定的问题特征。ML 会关注性别、吸烟、儿童人数和地区等不同因素,以找到总体最高的医疗费用,并根据需求使用特定算法确定价格,比如吸烟者和孩子较多的客户往往医疗费用较高,因此这些群体的保费将更多。随着 ML 训练越来越多的数据,ML 程序在预测确切价格方面变得更加聪明和敏感。最后,您需要调用一个交互程序,根据提供的输入因素为特定人员计算保险费,而不需要自己编写所有这些程序。ML 程序查看提供的所有数据集以及训练学习,最终将提供一个机器学习模型,您可以在应用程序中使用。例如模型会认为保险价格取决于各种特征,如年龄、保险类型、所需保险金额、性别、体重指数 (BMI)、地区以及吸烟等特殊因素,如果您想要预测保险价格,在应用程序中输入这些因素的值就能获得结果。
机器学习工作流程
ML 工作流有三个关键步骤:
- 准备数据。加载数据库或CSV文件的数据。提取/识别与您将要解决或预测结果的问题相关的关键特征(输入和输出参数)。
- 构建和训练ML模型。在这里,您可以评估不同的算法、设置参数并查看哪个模型最适合您的方案。
- 模型准备好后,请在应用程序中使用模型。
预测保险价格/保费的 ML.NET
价格预测根据一些输入数据(如年龄、性别、吸烟、体重指数 (BMI)、儿童数量和地区)确定保险价格。价格预测是机器学习回归任务的一个例子,该任务可以预测数字相关的问题。
对保险费的预测如下。你有一些特征输入(年龄,性别,吸烟等),进入训练过程。这些特征可以确定溢价金额的高或低。例如,年轻人不太可能需要医疗照顾,所以他们的保费通常更便宜,吸烟者的保费也更高。标签输出是您想要预测的价格,这是调用机器学习模型的结果。
下图是保险数据的示例,该示例是模型的输入和输出:
如何开始与 ML.NET
从 ML.NET 开始有三种方法
- API 模型:您可以通过API开始 ML.NET,并以 C# 或 F# 编写代码
- GUI 模型:在 Visual Studio 中使用 ML.NET模型构建器。
- CLI 模型:对于像 Mac 和 Linux 这样的跨平台开发,请使用 ML.NET CLI。
让我们开始以 API 模型使用 ML.NET 框架预测保险费。
我使用 Visual Studio 2019 创建一个控制台应用程序。请确保您拥有最新版本的VS,并且安装了 .NET 5 SDK。
打开 Visual Studio 创建一个新项目->选择C#控制台应用程序。
提供项目名称
从下拉中选择目标框架并按下"创建"按钮。
创建控制台应用程序。
需要ML模型的样本/测试保险数据。从 https://www.kaggle.com/mirichoi0218/insurance 下载insurance.csv文件数据,并将文件复制到控制台项目中。您可以使用列标题(年龄、性别、BMI 等)查看数据,并在打开文件时通过逗号将其分离。
从NuGet安装所需的ML包。在"解决方案资源管理器"中,右键单击项目并选择"Manage NuGet 包"。
安装 Microsoft.ML 包。
还要安装Microsoft.ML.AutoML包。此包通过自动定位最佳功能工程、模型和超参数来优化数据集的 ML 管道。
注意:我使用此包来找出价格预测的最佳算法。如果您熟悉或决定转到特定算法,则不需要此包。
添加代码
已完成的Program.cs文件可以在这里找到。首先添加所需使用语句:
添加ModelInput
和ModelOutput类
到Program.cs。该类包含与输入数据文件insurance.csv的标题匹配的属性。
在程序类中,添加两个常数,和 H。第一个包含数据集的路径:后者包含在培训完成后保存模型的路径。TRAIN_DATA_FILEPATH
MODEL_FILEPAT
创建实例是所有 ML.NET 操作的初始化步骤。它提供加载和准备数据、训练、评估和模型预测的所有所需组件。 有一个可选参数称为种子。默认情况下,种子值为空,MLContext环境不确定,输出会跨多个运行时变更。如果您提供固定数值,则MLContext环境将保持变化是确定的,结果在多个MLContext运行中是一致的。
创建MLContext实例后,您需要使用此类加载数据,以创建在数据、加载、保存、缓存、筛选、随机和拆分输入数据上的DataOperationsCatalog组件。但这不是模型训练管道的一部分。
从CSV文件加载数据。提供所需的输入参数,如 CSV 文件是否有标题、使用什么符号来分离数据等。
数据已加载,但需要清理或转换模型可以理解的输入数据。
输入数据是分类数据。分类数据只不过是包含标签值的变量,而不是数字值。输入数据"性别"和"区域"具有标签值,您需要将其转换为数字值,并且可能的值数通常仅限于固定集。例如,区域数据只有两个值,即东南或西北。
此外,吸烟者列包含"是"或"否",但这些数据需要转换为真或假。
以下是使用"
转换吸烟者列和分类数据列的代码:性别和区域。最后,将所有输入列串联在一起。TransformsCatalog
"
ConversionTransforms:提供操作列表,将数据从一种类型转换为另一种类型。包括是对真,否对假。
Append:通过将另一个估计器附加到此估计器的末尾创建一个新的估算链。
CategoricalTransforms:创建分类数据转换组件的实例,您将使用它们转换分类数据,如性别和区域。
ColumnConcatenate:这将将一个或多个输入列串联到新的输出列中。
您需要在 AutoML 的帮助下找到性能最好的模型。以下是探索多个模型的代码。更长的训练时间使 AutoML 能够探索更多,并为机器学习模型提供更高的精度。
运行实验
运行实验后,AutoML 探索了不同的模型。以下是显示评估模型并建议最佳模型的控制台输出窗口:基于输入数据的价格预测的LightGbm 回归。
要打印平均指标,添加此功能:
构建模型
现在,我有最好的价格预测算法,我会使用这个算法的代码,并建立模型。以下是创建、训练、交叉验证和保存模型的代码片段。
测试模型
现在,模型被创建、训练并保存到 Zip 文件中。通过传递样本数据测试训练好的模型。以下是使用预测引擎加载模型并预测结果的代码片段。
运行模型后,以下是控制台窗口上的预测输出。
总结
您已经看到使用 ML.NET 使用 API 框架进行价格预测是多么容易。同样,您可以使用GUI(模型构建器)或CLI模型来获得相同的结果。
引用
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