机器学习训练算法比较复杂,往往需要分布式进行,但是训练出来的模型进行预测相对简单很多,一般是单个节点装载整个模型,可以同时有多个预测节点,每个都装载整个模型,从而进行多路预测。很多不依赖模型的数据预处理算法也是这种模式,单个节点可以进行完整的操作,多个节点可以并行处理。
使用我们的算法组件直接对批式的数据或者流式的数据进行预测,用户也希望我们能提供SDK的方式,即,由参数或模型数据直接构建一个本地的java实例,我们称之为LocalPredictor,可以对单条数据进行预测。这样的话,预测不再必须由Flink任务完成,可以嵌入到提供RestAPI的预测服务系统,或者嵌入到用户的业务系统里。
本文将以中文情感分析场景为例,介绍Alink LocalPredictor的具体使用方法。关于如何建立Pipeline及训练出PipelineModel,读者可以参阅下面两篇文章:
Alink品数:Alink中文情感分析示例(Java版本)zhuanlan.zhihu.comAlink品数:Alink中文情感分析示例(Python版本)zhuanlan.zhihu.com
在上面的示例中,模型训练完成后直接用之进行预测,在一个任务中完成,没有进行模型保存。我们需要进行模型保存操作,以便在另一应用中的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<com.alibaba.alink.common.linalg.SparseVector>)
|-- 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 酒店位子不好找外,前台服务还需提高.其它还不错.