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)分区(有时间 ...
随机推荐
- 如何使用matlab中的胞元数组
胞元数组(cell Arry)的基本组分是胞元(cell),每个胞元本身在数组中是平等的,只能以下标区分.胞元可以存放任何类型.任何大小的数组,如任意维数值数组.字符串数组.符号对象等,而且同一个胞元 ...
- Linux select 机制深入分析
Linux select 机制深入分析 作为IO复用的实现方式.select是提高了抽象和batch处理的级别,不是传统方式那样堵塞在真正IO读写的系统调用上.而是堵塞在sele ...
- Java集合----Map集合
Map Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value Map 中的 key 和 value 都 ...
- swift - 移除界面上的所有元素
下面代码可以遍历移除页面视图上的所有元件: //清空所有子视图 func clearViews() { for v in self.view.subviews as [UIView] { v.remo ...
- cocos2d-x游戏引擎核心之三——主循环和定时器
一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...
- LeetCode - Delete Duplicate Emails
Discription:Write a SQL query to delete all duplicate email entries in a table named Person, keeping ...
- MongoDB复制集原理
版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...
- http://www.xuexi111.com/
http://www.xuexi111.com/ http://www.minxue.net/ 拼吾爱
- javascript字符串函数
substring() 从字符串中提取一些字符 <script type="text/javascript"> var str="Hello world!&q ...
- 【Android】ImageMap,图片地图
https://github.com/CFutureTeam/android-image-map package com.*.imagemap; import *.imagemap.ImageMap; ...