前面发表了一系列文章介绍如何使用Python进行Alink在线学习(Online Learning),有读者反馈需要Java版本的,虽然这两个版本在算法原理上是一样的,但是在使用的过程中还有很多差异,为了便于读者快速使用Java上手Alink在线学习,本文将以6个示例从Java的角度重写这一文章,希望对大家有所帮助。
大家在使用 Alink 过程中有任何问题可钉钉扫描下方二维码进群交流~
示例一
在线学习(Online Learning)是机器学习的一种模型训练方法,可以根据线上数据的变化,实时调整模型,是模型能够反映线上的变化,从而提高线上预测的准确率。
为了更好的理解在线学习(Online Learning)的概念,我们先介绍与之相对应的概念:批量训练(Batch Learning),先确定一个样本训练集,针对训练集的全体数据进行训练,一般需要使用迭代过程,重复使用数据集,不断调整参数。在线学习不需要要事先确定训练数据集,训练数据在训练过程中逐条到达的,每来一个训练样本,就会根据该样本产生的损失函数值、目标函数值及梯度,对模型进行一次迭代。
我们先关注FTRL在线预测组件及FTRL流式预测组件,如下图所示,它们之间通过模型数据流链接,即FtrlTrain不断产生新的模型,流式的传给FtrlPredict组件,每次当FtrlPredict组件接收到一个完整的模型,便会替换其旧的模型,切换成新的模型。对于在线学习FtrlTrain,需要两个输入,一个是初始的模型,避免系统冷启动;另一个便是流式的训练数据。FtrlTrain输出就是模型数据流。FtrlPredict组件同样需要初始模型,可以在FtrlTrain输出模型前,对已来到的数据进行预测。
介绍完核心的两个组件,我们再看看所需的初始模型、训练数据流和预测数据流是如何准备的。如下图所示,初始模型,是采用传统的离线训练方式,对批式的训练数据进行训练得到的。
FTRL算法是线性算法,其输入的数据必须都是数值型的,而原始的数据既有数值型的,也有离散型的,我们需要进行相应的特征工程操作,将原始特征数据变换为向量形式。
我们这里需要使用特征工程的组件,将批式原始训练数据转化为批式向量训练数据;将流式原始训练数据转化为流式向量训练数据;将流式原始预测数据转化为流式向量预测数据。
示例二
首先,我们需要一个Java的工程,配置好相关环境。最简单的办法是使用Alink的example工程,下载Alink git的代码,并用Jave IDE打开项目,如下图所示,可以看到三个已经写好的示例:ALSExample, GBDTExample, KMeansExample.
我们在com.alibaba.alink package下新建一个Java文件:
package com.alibaba.alink;
public class FTRLExample {
public static void main(String[] args) throws Exception {
}
}
本文的示例参考Alink的Python demo:
https://github.com/alibaba/Alink/blob/master/pyalink/ftrl_demo.ipynb
在网络广告中,点击率(CTR)是衡量广告效果的一个非常重要的指标。因此,点击预测系统在赞助搜索和实时竞价中具有重要的应用价值。该 Demo 使用 Ftrl 方法实时训练分类模型,并使用模型进行实时预测评估。
这里使用Kaggle比赛的CTR数据,链接为:https://www.kaggle.com/c/avazu-ctr-prediction/data 。由于是压缩数据,需要下载到本地,为了演示方便,我们直接使用oss上存储的一份采样数据。使用TextSourceBatchOp整行读取打印部分数据,脚本如下:
new TextSourceBatchOp()
.setFilePath("http://alink-release.oss-cn-beijing.aliyuncs.com/data-files/avazu-small.csv")
.firstN(10)
.print();
运行结果为:
我们看到每条数据包含多个数据项,是以逗号分隔。下面是各数据列的定义如下:
- id: ad identifier
- click: 0/1 for non-click/click
- hour: format is YYMMDDHH, so 14091123 means 23:00 on Sept. 11, 2014 UTC.
- C1 – anonymized categorical variable
- banner_pos
- site_id
- site_domain
- site_category
- app_id
- app_domain
- app_category
- device_id
- device_ip
- device_model
- device_type
- device_conn_type
- C14-C21 – anonymized categorical variables
我们根据各列的定义,组装schemaStr如下:
String schemaStr
= "id string, click string, dt string, C1 string, banner_pos int, site_id string, site_domain string, "
+ "site_category string, app_id string, app_domain string, app_category string, device_id string, "
+ "device_ip string, device_model string, device_type string, device_conn_type string, C14 int, C15 int, "
+ "C16 int, C17 int, C18 int, C19 int, C20 int, C21 int";
有了schema的定义,我们可以通过CsvSourceBatchOp读取显示数据,脚本如下:
CsvSourceBatchOp trainBatchData = new CsvSourceBatchOp()
.setFilePath("http://alink-release.oss-cn-beijing.aliyuncs.com/data-files/avazu-small.csv")
.setSchemaStr(schemaStr