为什么80%的码农都做不了架构师?>>>
本系列共6篇文章,会通过一些代码示例,讲解如何在Ignite中使用机器学习库,本文是本系列的第一篇。
从Ignite的2.4版本开始,机器学习就可以用于生产环境了。在这个版本中,进行了大量的开发和改进,其中包括对分区化数据集和遗传算法的支持,Ignite提供的很多机器学习示例也可以独立运行,这样就使入门变得很简单。并且在本系列的后面,还会使用Ignite支持的一些算法,对一些免费的数据集进行分析,进一步方便开发者学习。
介绍
本文中,先大概看一下机器学习网格,如图1所示: Ignite提供的机器学习能力,从设计上来说要求实用化,并且要求能够直接在Ignite中建立预测模型,这就使得用户在不需要进行昂贵的ETL或者数据转换的前提下,获得扩展性和性能的提升,下面稍微讨论下细节。
首先,在这之前,机器学习模型需要在不同的系统间进行训练和部署,比如,数据需要移出Ignite,然后使用其他的工具进行训练,最后再将模型重新部署进生产系统,这个方式有如下几个缺点:
- 昂贵的ETL处理过程,尤其对于大规模数据集,数据集的大小,可能是GB级甚至是TB级;
- 如果要进行ETL,实际上使用的是数据的一个快照,在ETL之后,线上的生产系统数据,可能已经改变,从而使训练系统使用的是过时的训练数据;
其次,现在许多系统可能需要处理大量数据,这些数据通常超过单个服务器的容量。虽然分布式计算提供了一种解决方案,但是有些平台不是为存储和操作数据而设计的,可能只适合于训练目的。因此,开发人员可能需要考虑在生产环境中部署更复杂的解决方案。
Ignite的机器学习能力有助于解决所有的这些问题,甚至更多:
- Ignite可以直接处理线上的生产数据,避免在不同系统间进行昂贵的ETL;
- 在数据的存储和维护上,Ignite可以提供分布式的计算能力;
- Ignite实现的机器学习算法,针对分布式计算进行了优化,因此可以利用Ignite并置处理的优势;
- Ignite可以作为流式数据的接收器,因此可以实时地进行机器学习;
- 机器学习通常是迭代式的处理,并且算法在执行过程中上下文可能发生变化,因此为了避免延迟以及丢失,Ignite支持容错的分区化的数据集。
分区化的数据集
Ignite目前支持分区化的数据集,这是一个介于机器学习算法和底层的存储和计算之间的抽象层,它为计算和缓存的备份使用了类似MapReduce的操作以支持容错。
在Ignite中,一个哈希算法会被应用于键值对(K-V)中的键部分,来确定值部分在集群中的存储位置。值部分实际是存储于分区中的,分区是原子化的。在图2中,可以看到两个节点的集群,有两个分区(P1和P2): 机器学习算法通常是迭代式的,并且需要上下文和数据,在图2中,如每个分区中对应的C和D所示。
如果一个节点故障,Ignite会恢复分区和上下文,如图3所示。比如,P1在节点2有一个备份(灰色所示),如果节点1故障,就可以从节点2恢复P1,数据可能从集群或者本地ETL(标记为D*)中恢复。
算法和适用领域
下面会看下Ignite支持的机器学习算法,下表会做个总结:
分类 | 回归 | 聚类 | 预处理 | |
---|---|---|---|---|
描述 | 根据一组训练数据确定新的标的属于哪一类 | 对因变量y和一个或多个自变量x之间的关系进行建模 | 对对象集进行分组,使得同一组内的对象和其他组中的每个对象相比具有更高的相似度 | 特征提取和规范化 |
适用领域 | 垃圾邮件检测、图像识别、信用评分、疾病识别 | 药物反应,股票价格,超市收入 | 客户细分、实验结果分组、购物项目分组 | 对比如文本这样的输入数据进行转换,以便用于机器学习算法,然后提取需要拟合的特征,对数据进行规范化 |
算法 | 支持向量机(SVM)、最近邻、决策树分类和神经网络 | 线性回归、决策树回归、最近邻和神经网络 | K均值 | 基于分区的数据集自定义预处理 |
机器学习库还带来了一组遗传算法,其在这里有详细描述。
总结
Ignite的最新版本提供了许多重要的特性和能力。分区化的数据集通过保存上下文,在节点故障时可以继续处理机器学习算法。机器学习算法支持广泛的使用案例,遗传算法的加入也为复杂数据的处理提供了新的机会。