如何构建一个flink sql平台
在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。
如果要找合适的数据集,会发现可用的有很多,但是对于线性回归来说,一个非常好的备选数据集就是房价,可以非常方便地从UCI网站获取合适的数据。
在本文中会训练一个线性回归模型,并且计算R2得分。
需要先准备一些数据,并且要将数据转换成Ignite支持的格式,这通常是数据科学家需要花时间做的事。
首先,需要获取原始数据并将其拆分成训练数据(80%)和测试数据(20%)。Ignite暂时还不支持专用的数据拆分,路线图中的未来版本会支持这个功能。但是就目前来说有许多可用的免费和开源工具可以执行这样的数据拆分,或者也可以用一种Ignite支持的编程语言自己编写这种代码。在本文中会使用下面自己编写的代码来实现此任务:
from sklearn import datasets
import pandas as pd
# Load Boston housing dataset.
boston_dataset = datasets.load_boston()
x = boston_dataset.data
y = boston_dataset.target
# Split it into train and test subsets.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=23)
# Save train set.
train_ds = pd.DataFrame(x_train, columns=boston_dataset.feature_names)
train_ds["TARGET"] = y_train
train_ds.to_csv("boston-housing-train.csv", index=False, header=None)
# Save test set.
test_ds = pd.DataFrame(x_test, columns=boston_dataset.feature_names)
test_ds["TARGET"] = y_test
test_ds.to_csv("boston-housing-test.csv", index=False, header=None)
# Train linear regression model.
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train, y_train)
# Score result model.
lr.score(x_test, y_test)
这段代码从UCI网站上获取可用的数据集,执行了数据的拆分,然后计算了R2得分。返回值为0.745021053016975,或者为74.5%,之后会将此值与Ignite的进行对比。
当训练和测试数据准备好之后,就可以写应用了,本文的算法是:
- 读取训练数据和测试数据;
- 在Ignite中保存训练数据和测试数据;
- 使用训练数据拟合线性回归模型;
- 将模型应用于测试数据;
- 确定模型的R2得分。
由于数据集非常小,可以将其加载到标准Java数据结构中,并直接从Java程序中运行线性回归。或者,也可以将数据加载到Ignite存储中,然后对存储的数据进行线性回归。使用Ignite存储的优点是数据将分布在整个集群中,因此将执行分布式训练。对于大规模数据集,使用Ignite存储就会有很大的好处。在本例中将把数据加载到Ignite存储中。
读取训练数据和测试数据
需要读取两个CSV文件,一个是训练数据,一个是测试数据。通过下面的代码,可以从CSV文件中读取数据:
private static void loadData(String fileName, IgniteCache<Integer, HouseObservation> cache)
throws FileNotFoundException {
Scanner scanner =www.mingcheng178.com new Scanner(new File(fileName));
int cnt = 0;
while (scanner.hasNextLine(www.furong157.com)) {
String row = scanner.nextLine();
String[] cells = row.split(",");
double[] features = new double[cells.length - 1];
for (int i = 0; i < cells.length - 1; i++)
features[i] = Double.valueOf(cells[i]);
double price = Double.valueOf(cells[cells.length - 1]);
cache.put(cnt++, new HouseObservation(features, price));
}
}
该代码简单地一行行的读取数据,然后对于每一行,使用CSV的分隔符拆分出字段,每个字段之后将转换成double类型并且存入Ignite。
将训练数据和测试数据存入Ignite
前面的代码将数据存入Ignite,要使用这个代码,首先要创建Ignite存储,如下:
IgniteCache<Integer, HouseObservation> trainData = ignite.createCache("BOSTON_HOUSING_TRAIN");
IgniteCache<Integer, HouseObservation> testData = ignite.createCache("BOSTON_HOUSING_TEST");
使用训练数据创建线性回归模型
数据存储之后,可以像下面这样创建训练器:
DatasetTrainer<LinearRegressionModel, Double> trainer = new LinearRegressionLSQRTrainer();
然后拟合训练数据,如下:
LinearRegressionModel mdl www.gcyL157.com= trainer.fit(
ignite,
trainData,
(k, v) -> v.getFeatures(www.leyouzaixian2.com),
// Feature extractor.
(k, v) -> v.getPrice(www.michenggw.com)
// Label extractor.
Ignite将数据保存为键-值(K-V)格式,因此上面的代码使用了值部分,目标值是Price,而特征位于其他列中。
将模型应用于测试数据
下一步,就可以用训练好的线性模型测试测试数据了,在Ignite的机器学习路线图中,有计划提供内置的得分计算器,但是就目前来说,可以这样做:
double meanPrice = getMeanPrice(testData);
double u = 0, v = 0;
try (QueryCursor<Cache.Entry<Integer, HouseObservation>> cursor = testData.query(new ScanQuery<>())) {
for (Cache.Entry<Integer, www.mcyllpt.com HouseObservation> testEntry : cursor) {
HouseObservation observation = testEntry.getValue();
double realPrice = observation.getPrice();
double predictedPrice = mdl.apply(new DenseLocalOnHeapVector(observation.getFeatures()));
u += Math.pow(realPrice - predictedPrice, 2);
v += Math.pow(realPrice - meanPrice, 2);
}
}
这里计算的是残差平方和(U)和总平方和(V)。
确定模型的R2得分
可以发现,R2的值为1 - u / v:
double score = 1 - u / v;
System.out.println(www.meiwanyule.cn"Score : " + score);
输出值为0.7450194305206714,或者74.5%,这与之前的值相同。
总结
Apache Ignite提供了一个机器学习算法库。通过线性回归示例,可以看到创建模型、测试模型和确定模型的R2得分的简单性,也可以用这个模型来做预测。
目前,可用的机器学习工具有很多,但它们不能多节点扩展,只能处理少量数据。相比之下,Ignite所带来的好处是它有能力扩展下面两种能力:
- 集群的大小(成百上千台机器)
- 存储的数据量(GB、TB甚至PB级数据)
因此,Ignite可以大规模地运行机器学习。它可以以分布式处理的方式,对大数据进行真正的机器学习管理。
在机器学习系列的下一篇中,将研究另一种机器学习算法。敬请期待!
如何构建一个flink sql平台的更多相关文章
- 构建一个flink程序,从kafka读取然后写入MYSQL
最近flink已经变得比较流行了,所以大家要了解flink并且使用flink.现在最流行的实时计算应该就是flink了,它具有了流计算和批处理功能.它可以处理有界数据和无界数据,也就是可以处理永远生产 ...
- Flink从入门到放弃(入门篇2)-本地环境搭建&构建第一个Flink应用
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)
基于flink1.14的源码做解析 公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今天同事突然问到我,Flink sql 是怎么实现topN的 ? 蒙圈了,这块源码没看过啊 , ...
- 从零构建Flink SQL计算平台 - 1平台搭建
一.理想与现实 Apache Flink 是一个分布式流批一体化的开源平台.Flink 的核心是一个提供数据分发.通信以及自动容错的流计算引擎.Flink 在流计算之上构建批处理,并且原生的支持迭代计 ...
- OPPO数据中台之基石:基于Flink SQL构建实数据仓库
小结: 1. OPPO数据中台之基石:基于Flink SQL构建实数据仓库 https://mp.weixin.qq.com/s/JsoMgIW6bKEFDGvq_KI6hg 作者 | 张俊编辑 | ...
- Demo:基于 Flink SQL 构建流式应用
Flink 1.10.0 于近期刚发布,释放了许多令人激动的新特性.尤其是 Flink SQL 模块,发展速度非常快,因此本文特意从实践的角度出发,带领大家一起探索使用 Flink SQL 如何快速构 ...
- 使用flink Table &Sql api来构建批量和流式应用(3)Flink Sql 使用
从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...
- 快速构建第一个Flink工程
本文简述通过maven和gradle快速构建的Flink工程.建议安装好Flink以后构建自己的Flink项目,安装与示例运行请查看:Flink快速入门--安装与示例运行. 在安装好Flink以后,只 ...
- 利用ELK构建一个小型的日志收集平台
利用ELK构建一个小型日志收集平台 伴随着应用以及集群的扩展,查看日志的方式总是不方便,我们希望可以有一个便于我们查询及提醒功能的平台:那么首先需要剖析有几步呢? 格式定义 --> 日志收集 - ...
随机推荐
- iOS 锁的常用方法
锁的用法在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安 ...
- [windows]桌面中添加我的电脑,我的文档和网上邻居图标
xp系统: 操作步骤:桌面任意位置--〉右键--〉属性--〉桌面选项卡--〉自定义桌面--〉常规:勾选相关图标确定即可. win7系统: 操作步骤:桌面任意位置--〉右键--〉个性化--〉(右侧)更改 ...
- 电脑公司最新稳定win7系统下载
系统来自系统妈:http://www.xitongma.com 系统概述 电脑公司ghost win7 x86(32位)万能装机版集成的软件符合电脑公司及电脑城装机绝大多数人要求及喜好,既大众,又时尚 ...
- 使用JDK自带的工具jstack找出造成运行程序死锁的原因
Java多线程编程也是Java面试中经常考察的内容.刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来.如何分析造成Java多线程的原因呢?很多时候我们在怀疑 ...
- 《算法图解》中涉及的算法的总结及java实现
该项目源代码已经放到Github上,有兴趣可以点击AlgorithmGraphExample 进行访问 项目启动,项目使用maven搭建,如果不使用maven导入,请保证有Junit4的jar包在工程 ...
- 树形dp——覆盖所有边的最少费用(Protecting Zonk)
一.问题描述 有一个n(n<=10000)个节点的无根树.有两种装置A,B,每种都有无限多个. 1.在某个节点X使用A装置需要C1(C1<=1000)的花费,并且此时与节点X相连的边都被覆 ...
- Linux命令基础操作--vim 归档 压缩 分区 格式化 挂载 Innode
1 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 使用 cat命令将查看的文件合并输出到/1.txt 这里的关键:定位到文件,如果后面加上/后被认为是目录 分为两步,先 ...
- Ubuntu下Hyperledger Fabric v0.6安装部署
系统环境:虚拟机VMware Workstation中的Ubuntu 16.04LTS 1.环境准备 1.1安装Docker Docker安装命令: curl –fsSL https://get.do ...
- django第10天(聚合查询,常用字段)
django第10天 聚合查询 聚合函数的使用场景 单独使用:不分组,只查聚合结果 分组使用:按字段分组,可查分组字段与聚合结果 导入聚合函数 from django.db.models import ...
- cs231n课程索引
课程资源 课程官网 课程视频-youtube 课程视频-字幕版 官方笔记 官方笔记-中文版 课程作业参考答案