机器学习训练算法比较复杂,往往需要分布式进行,但是训练出来的模型进行预测相对简单很多,一般是单个节点装载整个模型,可以同时有多个预测节点,每个都装载整个模型,从而进行多路预测。很多不依赖模型的数据预处理算法也是这种模式,单个节点可以进行完整的操作,多个节点可以并行处理。
使用我们的算法组件直接对批式的数据或者流式的数据进行预测,用户也希望我们能提供 SDK 的方式,即,由参数或模型数据直接构建一个本地的 java 实例,我们称之为 LocalPredictor,可以对单条数据进行预测。这样的话,预测不再必须由 Flink 任务完成,可以嵌入到提供 RestAPI 的预测服务系统,或者嵌入到用户的业务系统里。
本文将以中文情感分析场景为例,介绍 Alink LocalPredictor 的具体使用方法。关于如何建立 Pipeline 及训练出 PipelineModel,读者可以参阅下面这篇文章:
在上面的示例中,模型训练完成后直接用之进行预测,在一个任务中完成,没有进行模型保存。我们需要进行模型保存操作,以便在另一应用中的 LocalPredictor 加载此模型。Alink PipelineModel 提供了简单的保存方法,提供文件路径,运行 save 方法即可。注意,save 方法是将模型连接到了 sink 组件,还需要等到 BatchOperator.execute(),才会真正写出模型。
Java 代码如下:
model.save("/Users/yangxu/alink/temp/sentiment_hotel_model.csv");
BatchOperator.execute();
Python 代码如下:
model.save("/Users/yangxu/alink/temp/sentiment_hotel_model.csv")
BatchOperator.execute()
有了存储好的模型,下面进入本文的主题,如何构建 LocalPredictor?
通过 PipelineModel 的 load 方法,加载模型数据,得到 loadedModel,然后,调用 getLocalPredictor 方法得到 LocalPredictor 的实例。
PipelineModel loadedModel = PipelineModel.load("/Users/yangxu/alink/temp/sentiment_hotel_model.csv");
LocalPredictor localPredictor = loadedModel.getLocalPredictor("review string");
注意:由于待预测的数据也是 Row 类型,还需要说明数据列的 schema 情况,即输入一个 Alink Schema String 格式的参数。这里的参数为"review string"。
至此,已经构建了 LocalPredictor。在介绍如何用其进行预测前,在深入了解一下 LocalPredictor,其输入的数据是 Row 格式,其输出结果也是 Row 格式,即,会包含多列的信息。使用 getOutputSchema() 方法,可以得到预测结果的 schema 信息。对于我们刚构建的 localPredictor,使用该方法并打印显示。
System.out.print(localPredictor.getOutputSchema());
运行结果为:
root
|-- review: STRING
|-- featureText: STRING
|-- featureVector: LEGACY(GenericType)
|-- pred: INT
可以看出,其预测输出共4列,最关键的分类预测结果列“pred”在最后。
localPredictor 使用 map() 方法用来进行预测,具体代码如下:
Row[] rows = new Row[] {
Row.of("不错,在同等档次酒店中应该是值得推荐的!"),
Row.of("房间感觉还可以,但是洗漱用的毛巾浴巾质量不好,感觉没有洗干净,房间隔音效果不好"),
Row.of("服务态度机械,表情僵硬,管理不人性化,晚退10分钟房就加收半天房费"),
Row.of("酒店位子不好找外,前台服务还需提高.其它还不错.")
};
for (Row row : rows) {
System.out.print(localPredictor.map(row).getField(3));
System.out.print("\t");
System.out.println(row);
}
计算结果为:
1 不错,在同等档次酒店中应该是值得推荐的!
0 房间感觉还可以,但是洗漱用的毛巾浴巾质量不好,感觉没有洗干净,房间隔音效果不好
0 服务态度机械,表情僵硬,管理不人性化,晚退10分钟房就加收半天房费
1 酒店位子不好找外,前台服务还需提高.其它还不错.
以上。Alink 是基于 Flink 的机器学习算法平台,欢迎访问 Alink 的 GitHub 获取下载链接及更多信息。也欢迎加入 Alink 开源用户群进行交流~
Alink GitHub 链接:
https://github.com/alibaba/Alink
▼ 钉钉扫码加入 Alink 技术交流群 ▼