一、什么是 Alink?
Alink 是阿里巴巴计算平台事业部PAI团队从 2017 年开始基于实时计算引擎 Flink 研发的新一代机器学习算法平台,提供丰富的算法组件库和便捷的操作框架,开发者可以一键搭建覆盖数据处理、特征工程、模型训练、模型预测的算法模型开发全流程。
借助Flink在批流一体化方面的优势,Alink能够为批流任务提供一致性的操作。在实践过程中,Flink原有的机器学习库FlinkML的局限性显露出来(仅支持10余种算法,支持的数据结构也不够通用),但我们看重Flink底层引擎的优秀性能,于是基于Flink重新设计研发了机器学习算法库,于2018年在阿里集团内部上线,随后不断改进完善,在阿里内部错综复杂的业务场景中锻炼成长。
二、FlinkML 和 Alink 的关系
FlinkML 是 Flink 社区现存的一套机器学习算法库,这一套算法库已经存在很久而且更新比较缓慢。Alink 是基于新一代的 Flink,完全重新写了一套,跟 FlinkML 没有代码上的关系。Alink 由阿里巴巴计算平台事业部PAI团队研发,开发出来以后在阿里巴巴内部也用了,然后现在正式开源出来。
三、Alin机器学习案例
案例1:
准备环境
from pyalink.alink import *
resetEnv()
useLocalEnv(1, config=None)
Use one of the following commands to start using PyAlink:
- useLocalEnv(parallelism, flinkHome=None, config=None)
- useRemoteEnv(host, port, parallelism, flinkHome=None, localIp=“localhost”, config=None)
Call resetEnv() to reset environment and switch to another.
JVM listening on 127.0.0.1:50568
MLEnv(benv=JavaObject id=o2, btenv=JavaObject id=o5, senv=JavaObject id=o3, stenv=JavaObject id=o6)
数据准备
## read data
URL = "https://alink-release.oss-cn-beijing.aliyuncs.com/data-files/review_rating_train.csv"
SCHEMA_STR = "review_id bigint, rating5 bigint, rating3 bigint, review_context string"
LABEL_COL = "rating5"
TEXT_COL = "review_context"
VECTOR_COL = "vec"
PRED_COL = "pred"
PRED_DETAIL_COL = "predDetail"
source = CsvSourceBatchOp() \
.setFilePath(URL)\
.setSchemaStr(SCHEMA_STR)\
.setFieldDelimiter("_alink_")\
.setQuoteChar(None)
## Split data for train and test
trainData = SplitBatchOp().setFraction(0.9).linkFrom(source)
testData = trainData.getSideOutput(0)
特征工程
pipeline = (
Pipeline()
.add(
Segment()
.setSelectedCol(TEXT_COL)
)
.add(
StopWordsRemover()
.setSelectedCol(TEXT_COL)
).add(
DocHashCountVectorizer()
.setFeatureType("WORD_COUNT")
.setSelectedCol(TEXT_COL)
.setOutputCol(VECTOR_COL)
)
)
模型训练
## naiveBayes model
naiveBayes = (
NaiveBayesTextClassifier()
.setVectorCol(VECTOR_COL)
.setLabelCol(LABEL_COL)
.setPredictionCol(PRED_COL)
.setPredictionDetailCol(PRED_DETAIL_COL)
)
%timeit model = pipeline.add(naiveBayes).fit(trainData)
473 ms ± 160 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
数据预测评估
## evaluation
predict = model.transform(testData)
metrics = (
EvalMultiClassBatchOp()
.setLabelCol(LABEL_COL)
.setPredictionDetailCol(PRED_DETAIL_COL)
.linkFrom(predict)
.collectMetrics()
)
打印评估结果
print("ConfusionMatrix:", metrics.getConfusionMatrix())
print("LabelArray:", metrics.getLabelArray())
print("LogLoss:", metrics.getLogLoss())
print("Accuracy:", metrics.getAccuracy())
print("Kappa:", metrics.getKappa())
print("MacroF1:", metrics.getMacroF1())
print("Label 1 Accuracy:", metrics.getAccuracy("1"))
print("Label 1 Kappa:", metrics.getKappa("1"))
print("Label 1 Precision:", metrics.getPrecision("1"))
ConfusionMatrix: [[4987, 327, 229, 204, 292], [28, 1223, 164, 147, 108], [1, 1, 269, 10, 11], [0, 0, 0, 10, 0], [0, 2, 1, 2, 83]]
LabelArray: [‘5’, ‘4’, ‘3’, ‘2’, ‘1’]
LogLoss: 2.330945631084851
Accuracy: 0.8114582047166317
Kappa: 0.6190950197563011
MacroF1: 0.5123859853163818
Label 1 Accuracy: 0.9486356340288925
Label 1 Kappa: 0.27179135595030096
Label 1 Precision: 0.9431818181818182
案例2:
环境准备
# set env
from pyalink.alink import *
import sys, os
resetEnv()
useLocalEnv(2)
Use one of the following command to start using pyalink:
使用以下一条命令来开始使用 pyalink:
- useLocalEnv(parallelism, flinkHome=None, config=None)
- useRemoteEnv(host, port, parallelism, flinkHome=None, localIp=“localhost”, config=None)
Call resetEnv() to reset environment and switch to another.
使用 resetEnv() 来重置运行环境,并切换到另一个。
JVM listening on 127.0.0.1:51134
JavaObject id=o6
数据准备
# schema of train data
schemaStr = "id string