Spark中ml和mllib的区别
转载自:https://vimsky.com/article/3403.html
Spark中ml和mllib的主要区别和联系如下:
- ml和mllib都是Spark中的机器学习库,目前常用的机器学习功能2个库都能满足需求。
- spark官方推荐使用ml, 因为ml功能更全面更灵活,未来会主要支持ml,mllib很有可能会被废弃(据说可能是在spark3.0中deprecated)。
- ml主要操作的是DataFrame, 而mllib操作的是RDD,也就是说二者面向的数据集不一样。相比于mllib在RDD提供的基础操作,ml在DataFrame上的抽象级别更高,数据和操作耦合度更低。
- DataFrame和RDD什么关系?DataFrame是Dataset的子集,也就是Dataset[Row], 而DataSet是对RDD的封装,对SQL之类的操作做了很多优化。
- 相比于mllib在RDD提供的基础操作,ml在DataFrame上的抽象级别更高,数据和操作耦合度更低。
- ml中的操作可以使用pipeline, 跟sklearn一样,可以把很多操作(算法/特征提取/特征转换)以管道的形式串起来,然后让数据在这个管道中流动。大家可以脑补一下Linux管道在做任务组合时有多么方便。
- ml中无论是什么模型,都提供了统一的算法操作接口,比如模型训练都是
fit;不像mllib中不同模型会有各种各样的trainXXX。 - mllib在spark2.0之后进入
维护状态, 这个状态通常只修复BUG不增加新功能。
以上就是ml和mllib的主要异同点。下面是ml和mllib逻辑回归的例子,可以对比看一下, 虽然都是模型训练和预测,但是画风很不一样。
mllib中逻辑回归的例子
sparse_data = [
LabeledPoint(0.0, SparseVector(, {: 0.0})),
LabeledPoint(1.0, SparseVector(, {: 1.0})),
LabeledPoint(0.0, SparseVector(, {: 1.0})),
LabeledPoint(1.0, SparseVector(, {: 2.0}))
]
lrm = LogisticRegressionWithSGD.train(sc.parallelize(sparse_data), iterations=)
lrm.predict(array([0.0, 1.0])) lrm.predict(array([1.0, 0.0])) lrm.predict(SparseVector(, {: 1.0})) lrm.predict(SparseVector(, {: 1.0})) import os, tempfile
path = tempfile.mkdtemp()
lrm.save(sc, path)
sameModel = LogisticRegressionModel.load(sc, path)
sameModel.predict(array([0.0, 1.0])) sameModel.predict(SparseVector(, {: 1.0})) from shutil import rmtree
try:
rmtree(path)
except:
pass
multi_class_data = [
LabeledPoint(0.0, [0.0, 1.0, 0.0]),
LabeledPoint(1.0, [1.0, 0.0, 0.0]),
LabeledPoint(2.0, [0.0, 0.0, 1.0])
]
data = sc.parallelize(multi_class_data)
mcm = LogisticRegressionWithLBFGS.train(data, iterations=, numClasses=)
mcm.predict([0.0, 0.5, 0.0]) mcm.predict([0.8, 0.0, 0.0]) mcm.predict([0.0, 0.0, 0.3])
ml中的逻辑回归的例子
from pyspark.sql import Row
from pyspark.ml.linalg import Vectors
bdf = sc.parallelize([
Row(label=1.0, weight=2.0, features=Vectors.dense(1.0)),
Row(label=0.0, weight=2.0, features=Vectors.sparse(, [], []))]).toDF()
blor = LogisticRegression(maxIter=, regParam=0.01, weightCol="weight")
blorModel = blor.fit(bdf)
blorModel.coefficients
DenseVector([5.5 ])
blorModel.intercept
-2.68
mdf = sc.parallelize([
Row(label=1.0, weight=2.0, features=Vectors.dense(1.0)),
Row(label=0.0, weight=2.0, features=Vectors.sparse(, [], [])),
Row(label=2.0, weight=2.0, features=Vectors.dense(3.0))]).toDF()
mlor = LogisticRegression(maxIter=, regParam=0.01, weightCol="weight",
family="multinomial")
mlorModel = mlor.fit(mdf)
print(mlorModel.coefficientMatrix)
DenseMatrix([[-2.3 ],
[ 0.2 ],
[ 2.1 ]])
mlorModel.interceptVector
DenseVector([2.0 , 0.8 , -2.8 ])
test0 = sc.parallelize([Row(features=Vectors.dense(-1.0))]).toDF()
result = blorModel.transform(test0).head()
result.prediction
0.0
result.probability
DenseVector([0.99 , 0.00 ])
result.rawPrediction
DenseVector([8.22 , -8.22 ])
test1 = sc.parallelize([Row(features=Vectors.sparse(, [], [1.0]))]).toDF()
blorModel.transform(test1).head().prediction
1.0
blor.setParams("vector")
Traceback (most recent call last): TypeError: Method setParams forces keyword arguments.
lr_path = temp_path + "/lr"
blor.save(lr_path)
lr2 = LogisticRegression.load(lr_path)
lr2.getMaxIter() model_path = temp_path + "/lr_model"
blorModel.save(model_path)
model2 = LogisticRegressionModel.load(model_path)
blorModel.coefficients[] == model2.coefficients[]
True
blorModel.intercept == model2.intercept
True
Spark中ml和mllib的区别的更多相关文章
- spark:ML和MLlib的区别
ML和MLlib的区别如下: ML是升级版的MLlib,最新的Spark版本优先支持ML. ML支持DataFrame数据结构和Pipelines,而MLlib仅支持RDD数据结构. ML明确区分了分 ...
- Spark机器学习中ml和mllib中矩阵、向量
1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...
- spark的ML和MLLib两个包区别和联系?
原文链接:https://www.zhihu.com/question/35225203/answer/123986969 1. 技术角度上,面向的数据集类型不一样:ML的API是面向Dataset的 ...
- spark中map与flatMap的区别
作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...
- Spark中cache和persist的区别
cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间. cache和persist的区别 基于Spark 1.6.1 的源码,可 ...
- Spark中repartition和partitionBy的区别
repartition 和 partitionBy 都是对数据进行重新分区,默认都是使用 HashPartitioner,区别在于partitionBy 只能用于 PairRDD,但是当它们同时都用于 ...
- Spark中groupBy groupByKey reduceByKey的区别
groupBy 和SQL中groupby一样,只是后面必须结合聚合函数使用才可以. 例如: hour.filter($"version".isin(version: _*)).gr ...
- spark中map与mapPartitions区别
在spark中,map与mapPartitions两个函数都是比较常用,这里使用代码来解释一下两者区别 import org.apache.spark.{SparkConf, SparkContext ...
- 大数据学习day19-----spark02-------0 零碎知识点(分区,分区和分区器的区别) 1. RDD的使用(RDD的概念,特点,创建rdd的方式以及常见rdd的算子) 2.Spark中的一些重要概念
0. 零碎概念 (1) 这个有点疑惑,有可能是错误的. (2) 此处就算地址写错了也不会报错,因为此操作只是读取数据的操作(元数据),表示从此地址读取数据但并没有进行读取数据的操作 (3)分区(有时间 ...
随机推荐
- javascript在字符串中提取网址并替换成超链接
var str = " http://wasmip.baidu.com.cn/mip/km/archives/km_archives_main/kmArchivesMain.do?metho ...
- html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一
一 什么是有限状态机 FSM (finite-state machine),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.他对于逻辑以及 ...
- Quartz是一个完全由java编写的开源作业调度框架
http://www.quartz-scheduler.org/ 找个时间研究一下
- 在linux中添加环境变量
首先用命令查看配置了哪些环境变量 env命令查看 编辑环境变量命令 vim ~/.bash_profile Counter_HOME=/home/test/Counterexport Counter ...
- 【RF库Collections测试】Set To Dictionary
Name:Set To DictionarySource:Collections <test library>Arguments:[ dictionary | *key_value_pai ...
- ubuntu的安装方法
Ubuntu 是一个启动速度超快.界面友好.安全性好的开源操作系统,它由全球顶尖开源软件专家开发,适用于桌面电脑.笔记本电脑.服务器以及上网本等,并且它可以永久免费使用.如果你厌倦了Windows,如 ...
- 关于js中定时器的返回值问题
在js中,我们常常会用到定时器来处理各种各样的问题,当我们需要清除定时器的时候,我们常常会定义一个值来接受定时器的返回值,然后再把定义好的这个值写到清除定时器的括弧后面,如: var times = ...
- 安装postgresql之后为什么找不到postgresql service
没有正常启动 postgresql service.可以 在运行里面 输入 services.msc 找到 postgresql 的服务.启动他.或者也可以用postgres 自带的 工具pg_ctl ...
- EF更新的时候出错
错误提示: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectStateManager 项. 说明: 执行当前 Web 请求期间,出现未经处理的异常. ...
- Deploying Cloud Foundry on OpenStack Juno and XenServer (Part I)
link http://rabbitstack.github.io/deploying-cloud-foundry-on-openstack-juno-and-xenserver-part-i/ Cl ...