Spark MLlib学习
1. 机器学习
机器学习可以看做是一门人工智能的科学,该领域的主要研究对象是人工智能。机器学习利用数据或以往的经验,以此优化计算机程序的性能标准。
机器学习强调三个关键词:算法、经验、性能,其处理过程如上图所示。在数据的基础上,通过算法构建出模型并对模型进行评估。评估的性能如果达到要求,就用该模型来测试其他的数据;如果达不到要求,就要调整算法来重新建立模型,再次进行评估。如此循环往复,最终获得满意的经验来处理其他的数据。机器学习技术和方法已经被成功应用到多个领域,比如个性推荐系统,金融反欺诈,语音识别,自然语言处理和机器翻译,模式识别,智能控制等。
2. 基于大数据的机器学习
传统的机器学习算法,由于技术和单机存储的限制,只能在少量数据上使用。即以前的统计/机器学习依赖于数据抽样。但实际过程中样本往往很难做好随机,导致学习的模型不是很准确,在测试数据上的效果也可能不太好。随着 HDFS(Hadoop Distributed File System) 等分布式文件系统出现,存储海量数据已经成为可能。在全量数据上进行机器学习也成为了可能,这顺便也解决了统计随机性的问题。然而,由于 MapReduce 自身的限制,使得使用 MapReduce 来实现分布式机器学习算法非常耗时和消耗磁盘IO。因为通常情况下机器学习算法参数学习的过程都是迭代计算的,即本次计算的结果要作为下一次迭代的输入,这个过程中,如果使用 MapReduce,我们只能把中间结果存储磁盘,然后在下一次计算的时候从新读取,这对于迭代 频发的算法显然是致命的性能瓶颈。
在大数据上进行机器学习,需要处理全量数据并进行大量的迭代计算,这要求机器学习平台具备强大的处理能力。Spark 立足于内存计算,天然的适应于迭代式计算。即便如此,对于普通开发者来说,实现一个分布式机器学习算法仍然是一件极具挑战的事情。幸运的是,Spark提供了一个基于海量数据的机器学习库,它提供了常用机器学习算法的分布式实现,开发者只需要有 Spark 基础并且了解机器学习算法的原理,以及方法相关参数的含义,就可以轻松的通过调用相应的 API 来实现基于海量数据的机器学习过程。其次,Spark-Shell的即席查询也是一个关键。算法工程师可以边写代码边运行,边看结果。spark提供的各种高效的工具正使得机器学习过程更加直观便捷。比如通过sample函数,可以非常方便的进行抽样。当然,Spark发展到后面,拥有了实时批计算,批处理,算法库,SQL、流计算等模块等,基本可以看做是全平台的系统。把机器学习作为一个模块加入到Spark中,也是大势所趋。
3. Spark 机器学习库MLLib
MLlib是Spark的机器学习(Machine Learning)库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。MLlib由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道API。具体来说,其主要包括以下几方面的内容:
算法工具:常用的学习算法,如分类、回归、聚类和协同过滤;
特征化公交:特征提取、转化、降维,和选择公交;
管道(Pipeline):用于构建、评估和调整机器学习管道的工具;
持久性:保存和加载算法,模型和管道;
实用工具:线性代数,统计,数据处理等工具。
Spark 机器学习库从 1.2 版本以后被分为两个包:
spark.mllib包含基于RDD的原始算法API。Spark MLlib 历史比较长,在1.0 以前的版本即已经包含了,提供的算法实现都是基于原始的 RDD。
spark.ml 则提供了基于DataFrames 高层次的API,可以用来构建机器学习工作流(PipeLine)。ML Pipeline 弥补了原始 MLlib 库的不足,向用户提供了一个基于 DataFrame 的机器学习工作流式 API 套件。
使用 ML Pipeline API可以很方便的把数据处理,特征转换,正则化,以及多个机器学习算法联合起来,构建一个单一完整的机器学习流水线。这种方式给我们提供了更灵活的方法,更符合机器学习过程的特点,也更容易从其他语言迁移。Spark官方推荐使用spark.ml。如果新的算法能够适用于机器学习管道的概念,就应该将其放到spark.ml包中,如:特征提取器和转换器。开发者需要注意的是,从Spark2.0开始,基于RDD的API进入维护模式(即不增加任何新的特性),并预期于3.0版本的时候被移除出MLLib。
Spark在机器学习方面的发展非常快,目前已经支持了主流的统计和机器学习算法。纵观所有基于分布式架构的开源机器学习库,MLlib可以算是计算效率最高的。MLlib目前支持4种常见的机器学习问题: 分类、回归、聚类和协同过滤。下表列出了目前MLlib支持的主要的机器学习算法:
MLlib 是spark的可以扩展的机器学习库,由以下部分组成:通用的学习算法和工具类,包括分类,回归,聚类,协同过滤,降维,当然也包括调优的部分
- Data types
- Basic statistics (基本统计)
- summary statistics 概括统计
- correlations 相关性
- stratified sampling 分层取样
- hypothesis testing 假设检验
- random data generation 随机数生成
- Classification and regression (分类一般针对离散型数据而言的,回归是针对连续型数据的。本质上是一样的)
- linear models (SVMs, logistic regression, linear regression)线性模型(支持向量机,逻辑回归,线性回归)
- naive Bayes 贝叶斯算法
- decision trees 决策树
- ensembles of trees (Random Forests and Gradient-Boosted Trees)
多种树(随机森林和梯度增强树)
- Collaborative filtering 协同过滤
- alternating least squares (ALS) (交替最小二乘法(ALS) )
- Clustering 聚类
- k-means k均值算法
- Dimensionality reduction (降维)
- singular value decomposition (SVD) 奇异值分解
- principal component analysis (PCA) 主成分分析
- Feature extraction and transformation 特征提取和转化
- Optimization (developer) 优化部分
- stochastic gradient descent 随机梯度下降
- limited-memory BFGS (L-BFGS) 短时记忆的BFGS (拟牛顿法中的一种,解决非线性问题)
4. 线性回归实例
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaDoubleRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.mllib.evaluation.RegressionMetrics;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.regression.LabeledPoint;
import org.apache.spark.mllib.regression.LinearRegressionModel;
import org.apache.spark.mllib.regression.LinearRegressionWithSGD; import scala.Tuple2; public class SparkMLlibLinearRegression { public static void main(String[] args) { String path = "file:///data/hadoop/spark-2.0.0-bin-hadoop2.7/data/mllib/ridge-data/lpsa.data"; SparkConf conf = new SparkConf(); JavaSparkContext sc = new JavaSparkContext(args[0], "Spark", conf); JavaRDD<String> data = sc.textFile(path); JavaRDD<LabeledPoint> parsedData = data.map(new Function<String, LabeledPoint>() { @Override public LabeledPoint call(String line) throws Exception { String[] parts = line.split(","); String[] features = parts[1].split(" "); double[] v = new double[features.length]; for (int i = 0; i < v.length; i++) { v[i] = Double.parseDouble(features[i]); } return new LabeledPoint(Double.parseDouble(parts[0]), Vectors.dense(v)); } }); parsedData.cache(); // Building the model int numIterations = 100; double stepSize = 0.00000001; final LinearRegressionModel model = LinearRegressionWithSGD.train(JavaRDD.toRDD(parsedData), numIterations, stepSize); // Evaluate model on training examples and compute training error JavaRDD<Tuple2<Double, Double>> valuesAndPreds = parsedData.map(new Function<LabeledPoint, Tuple2<Double, Double>>(){ @Override public Tuple2<Double, Double> call(LabeledPoint point) throws Exception { double prediction = model.predict(point.features()); return new Tuple2<Double, Double>(prediction, point.label()); } }); double MSE = new JavaDoubleRDD(valuesAndPreds.map( new Function<Tuple2<Double, Double>, Object>() { public Object call(Tuple2<Double, Double> pair) { return Math.pow(pair._1() - pair._2(), 2.0); } } ).rdd()).mean(); System.out.println("training Mean Squared Error = " + MSE); //模型评测 JavaRDD<Tuple2<Object, Object>> valuesAndPreds2= parsedData.map(new Function<LabeledPoint, Tuple2<Object, Object>>(){ @Override public Tuple2<Object, Object> call(LabeledPoint point) throws Exception { double prediction = model.predict(point.features()); return new Tuple2<Object, Object>(prediction, point.label()); } }); RegressionMetrics metrics = new RegressionMetrics(JavaRDD.toRDD(valuesAndPreds2)); System.out.println("R2(决定系数)= "+metrics.r2()); System.out.println("MSE(均方差、方差) = "+metrics.meanSquaredError()); System.out.println("RMSE(均方根、标准差) "+metrics.rootMeanSquaredError()); System.out.println("MAE(平均绝对差值)= "+metrics.meanAbsoluteError()); // Save and load model model.save(sc.sc(), "target/tmp/javaLinearRegressionWithSGDModel"); LinearRegressionModel sameModel = LinearRegressionModel.load(sc.sc(), "target/tmp/javaLinearRegressionWithSGDModel"); double result = sameModel.predict(Vectors.dense(-0.132431544081234,2.68769877553723,1.09253092365124,1.53428167116843,-0.522940888712441,-0.442797990776478,0.342627053981254,-0.687186906466865)); System.out.println(sameModel.weights()); System.out.println("save predict result="+ result); result = model.predict(Vectors.dense(-0.132431544081234,2.68769877553723,1.09253092365124,1.53428167116843,-0.522940888712441,-0.442797990776478,0.342627053981254,-0.687186906466865)); System.out.println(model.weights()); System.out.println("predict result="+ result); } }
Spark MLlib学习相关推荐
- Spark MLlib学习笔记之二——Spark Mllib矩阵向量
Spark Mllib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/Matrix的实现以及相应计算的接口(Linalg).但是在MLlib里面同时也提供了Vector和L ...
- Spark MLlib学习笔记:构建一个机器学习工作流
文章目录 一.任务描述 二.实现步骤 (一)引入包并构建训练数据集 (二)定义工作流阶段 (三)创建工作流,训练出模型 (四)构建测试数据集 (五)利用模型做预测 一.任务描述 查出所有包含" ...
- 如何在Java应用里集成Spark MLlib训练好的模型做预测
前言 昨天媛媛说,你是不是很久没写博客了.我说上一篇1.26号,昨天3.26号,刚好两个月,心中也略微有些愧疚.今天正好有个好朋友问,怎么在Java应用里集成Spark MLlib训练好的模型.在St ...
- 学习笔记Spark(十)—— Spark MLlib应用(2)—— Spark MLlib应用
三.Spark MLlib应用 3.1.Spark ML线性模型 数据准备 基于Spark ML的线性模型需要DataFrame类型的模型数据,DataFrame需要包含:一列标签列,一列由多个特征合 ...
- 学习笔记Spark(九)—— Spark MLlib应用(1)—— 机器学习简介、Spark MLlib简介
一.机器学习简介 1.1.机器学习概念 机器学习就是让机器能像人一样有学习.理解.认识的能力. 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能. ...
- 机器学习_机器不学习:从Spark MLlib到美图机器学习框架实践
/ 机器学习简介 / 在深入介绍 Spark MLlib 之前先了解机器学习,根据维基百科的介绍,机器学习有下面几种定义: 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经 ...
- Spark学习之路——8.Spark MLlib
MLlib的官网文档: http://spark.apache.org/docs/latest/ml-guide.html 本节主要内容: 一.MLlib简述 二.基本数据类型 三.汇总统计 四.实例 ...
- Spark MLlib实现的中文文本分类–Naive Bayes
2019独角兽企业重金招聘Python工程师标准>>> 中文分词 对于中文文本分类而言,需要先对文章进行分词,我使用的是IKAnalyzer中文分析工具,其中自己可以配置扩展词库来使 ...
- Spark MLlib 机器学习
本章导读 机器学习(machine learning, ML)是一门涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多领域的交叉学科.ML专注于研究计算机模拟或实现人类的学习行为,以获取新知识.新 ...
最新文章
- (转)linux运行tomcat时JRE_HOME显示不对怎么办?
- Vue.js 组件注册
- PKG_CONFIG_PATH 、LD_LIBRARY_PATH、PATH三个的作用
- scala获得成员函数列表
- php实现mysql分表
- linux c 多文件编译,Linuxc - 多c文件程序编译执行
- AUTOSAR从入门到精通100讲(四十九)-AUTOSAR 通信服务Dcm篇-Dcm概念及DSL详解与实战案例
- Unity 实现物体破碎效果(转)
- pat-1136. A Delayed Palindrome (20) 模拟
- vscode无法识别constexpr
- 泸州市的电子计算机学校名称,泸州电子计算机机械学校2020年招生简介
- 一次线上OOM过程的排查
- 在CrossOver中设置代理实现与特殊网段的网络连接
- 计算机组装与维护5416答案,沈阳工业大学计算机科学与技术专业2016年在重庆理科高考录取最低分数线...
- CSITool的安装过程(参照官方教程进行细节处理)
- 彼得林奇+《称雄华尔街》
- Direct2D 介绍
- 写了四十篇办公自动化文章后,我整理了这十个常用操作,代码拿走就用!
- 与200位专家相约,看国内外最新研发经验
- 小笨狼的LLDB技巧:chisel
热门文章
- 关于DNS服务中查询域名的命令
- java开发爱恩斯坦棋,爱恩斯坦棋计算机博弈关键技术研究
- Linux Shell脚本 - 什么是Shell
- 计算机windows xp怎么操作,电脑密码怎么设置
- sql 临时表_原创 | SQL优化之合理使用临时表
- php no input file specified.,nginx+php出现No input file specified解决办法
- 客户端序列码生成_[基础]-序列化
- 计算机英语教学能力大赛,英语教学网络中心举办 “志勤杯”英语口语技能大赛 和“志勤杯”英语写作技能大赛...
- linux服务器 远程桌面,如何远程桌面Linux服务器
- 表格学生表html,HTML的嵌入式精美学生表格代码