搭建一个简易的 PMML 模型测试环境
PMML,全称为 Predictive Model Markup Language,是一种标准化的模型描述和交换格式。它允许从不同的数据挖掘和机器学习软件中导出模型,并在其他系统中进行部署,无需重新编写代码。PMML 通过定义一套统一的规则来描述模型,包括数据预处理、模型参数以及输入输出格式等。目前PMML已支持包括逻辑回归、树模型、神经网络(目前多用ONNX 部署) 等多种常见的数据挖掘和机器学习模型。
在信贷风控领域,PMML被广泛使用来部署信用评分模型,并将其集成到线下和线上的贷款申请审核流程中。本文将探讨如何利用 IntelliJ IDEA 和 Maven 搭建一个简单的 PMML 测试环境。通过这个环境,我们可以方便地加载、验证和测试各种 PMML 模型,确保它们在部署前能够正确执行并满足业务需求。
PMML 文件主要组成部分
PMML 文件包含以下几个主要部分:
- Header:包含模型的一般信息,如版权、描述及生成模型的应用程序名称和版本。
- Data Dictionary:定义模型使用的所有可能字段,包括字段类型(连续的、分类的、序数的)和数据类型(如字符串或双精度浮点数)。
- Data Transformations:定义数据转换操作,包括规范化、离散化和值映射等,以适应挖掘模型的需求。
- Model:描述数据挖掘模型的具体信息,如模型名称、函数名称、算法名称及激活函数等。
- Mining Schema:列出模型中使用的所有字段,并包含每个字段的具体信息,如使用类型和缺失值处理策略。
- Output:定义模型输出字段,用于后处理预测值,如转换或应用概率分布等。
在风控模型的开发与测试中,利用PMML(Predictive Model Markup Language)进行模型部署与验证是一种高效且常用的方法。今天,我们将探讨如何通过PMML来测试预测模型,同时也分享一些实用的代码片段,帮助你更好地理解与应用。
Maven 依赖配置
在pom.xml
文件中配置所需的依赖,确保PMML-Evaluator能够被正确加载。下面是一个简单的示例,展示了如何配置这些依赖:
<dependencies>
<dependency>
<groupId>org.jpmml</groupId>
<artifactId>pmml-evaluator</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
</dependencies>
模型加载与评估
通过PMML模型进行评估前,需要先加载PMML文件。
public static Evaluator loadPmmlEvaluator(String modelPath) throws Exception {
File modelFile = new File(modelPath);
try (InputStream modelInputStream = new FileInputStream(modelFile)) {
PMML pmmlModel = org.jpmml.model.PMMLUtil.unmarshal(modelInputStream);
ModelEvaluatorFactory evaluatorFactory = ModelEvaluatorFactory.newInstance();
ModelEvaluatorBuilder evaluatorBuilder = new ModelEvaluatorBuilder(pmmlModel)
.setModelEvaluatorFactory(evaluatorFactory);
return evaluatorBuilder.build();
}
}
测试数据的生成
生成合适的测试数据是模型验证的关键。以下代码片段可以直接通过加载的 PMML 文件中的字段,来生成一份测试数据,用于模型的快速验证:
public static Map<String, Double> createTestInputData(Evaluator evaluator) {
List<InputField> inputFields = evaluator.getInputFields();
Map<String, Double> inputData = new HashMap<>();
Random randomGenerator = new Random();
for (InputField field : inputFields) {
FieldName fieldName = field.getName();
inputData.put(fieldName.getValue(), randomGenerator.nextDouble() * 200000);
}
return inputData;
}
执行模型预测
最后一步是使用前面生成的测试数据来执行模型预测。
public static void executeModelPrediction(Evaluator evaluator, Map<String, Double> inputData) throws Exception {
Map<FieldName, FieldValue> preparedInputs = new LinkedHashMap<>();
for (InputField field : evaluator.getInputFields()) {
FieldName fieldName = field.getName();
Object rawValue = inputData.get(fieldName.getValue());
FieldValue preparedValue = field.prepare(rawValue);
preparedInputs.put(fieldName, preparedValue);
}
Map<FieldName, ?> predictionResults = evaluator.evaluate(preparedInputs);
for (TargetField targetField : evaluator.getTargetFields()) {
FieldName fieldName = targetField.getName();
Object fieldValue = predictionResults.get(fieldName);
System.err.println("Target: " + fieldName.getValue() + " Value: " + fieldValue);
}
}
通过正确配置 PMML 模型文件路径,可以快速对自动生成的测试样本打分测试,输出格式如下:
通过以上步骤,我们搭建了一个快速对 PMML 模型文件进行本地测试的简易环境,可以有效地加载、执行PMML模型,进行必要的测试。