搭建一个简易的 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 模型文件路径,可以快速对自动生成的测试样本打分测试,输出格式如下:

image

通过以上步骤,我们搭建了一个快速对 PMML 模型文件进行本地测试的简易环境,可以有效地加载、执行PMML模型,进行必要的测试。

参考资料

Predictive Model Markup Language

PMML文档

posted @ 2024-04-21 23:37  AKA栗子  阅读(225)  评论(0编辑  收藏  举报