Spark提供了常用机器学习算法的实现, 封装于spark.mlspark.mllib中.

spark.mllib是基于RDD的机器学习库, spark.ml是基于DataFrame的机器学习库.

相对于RDD, DataFrame拥有更丰富的操作API, 可以进行更灵活的操作. 目前, spark.mllib已经进入维护状态, 不再添加新特性.

本文将重点介绍pyspark.ml, 测试环境为Spark 2.1, Python API.

首先介绍pyspark.ml中的几个基类:

  • ML DataSet: 即为pyspark.sql.DataFrame作为数据集使用

  • pyspark.ml.Transformer: 代表将数据集转换到另一个数据集的算法

  • pyspark.ml.Estimator: 代表根据数据和参数创建模型的算法,包含方法

    • fit(dataset, params): 根据训练数据集和参数进行训练, 返回训练好的模型对象
  • pyspark.ml.Model: 代表训练好的模型的基类, 通常由Estimator.fit()创建. 包含的方法有:

    • transform(df): 将输入数据集代入模型变换为输出数据集
    • save(path): 保存训练好的模型
    • load(path): 从文件中加载模型
  • pyspark.ml.Pipeline: 用于将多个步骤组合为管道进行处理, 可以建立线性管道和有向无环图管道.

pyspark.ml下将不同算法封装到不同的包中:

  • pyspark.ml.linalg 线性代数工具包. 包括:

    • Vector
    • DenseVector
    • SparseVector
    • Matrix
    • DenseMatrix
    • SparseMatrix
  • pyspark.ml.feature特征和预处理算法包. 包括:
    • Tokenizer
    • Normalizer
    • StopWordsRemover
    • PCA
    • NGram
    • Word2Vec
  • pyspark.ml.classification分类算法包. 包括:
    • LogisticRegression
    • DecisionTreeClassifier
    • RandomForestClassifier
    • NaiveBayes
    • MultilayerPerceptronClassifier
    • OneVsRest
  • pyspark.ml.clustering 聚类算法包. 包括:
    • KMeans
    • LDA
  • pyspark.ml.regression回归算法包. 包括:
    • LinearRegression
    • GeneralizedLinearRegression
    • DecisionTreeRegressor
    • RandomForestRegressor
  • pyspark.ml.recommendation推荐系统算法包. 包括:
    • ALS
  • pyspark.ml.tuning 校验工具包
  • pyspark.ml.evaluation 评估工具包

pyspark.ml中的算法大多数为Estimator的派生类. 大多数算法类均拥有对应的Model类.

classification.NaiveBayesclassification.NaiveBayesModel. 算法类的fit方法可以生成对应的Model类.

应用示例

pyspark.ml使用了统一风格的接口,这里只展示部分算法.

首先用NaiveBayes分类器做一个二分类:

>>> from pyspark.sql import Row
>>> from pyspark.ml.linalg import Vectors
>>> df = spark.createDataFrame([
... Row(label=0.0, weight=0.1, features=Vectors.dense([0.0, 0.0])),
... Row(label=0.0, weight=0.5, features=Vectors.dense([0.0, 1.0])),
... Row(label=1.0, weight=1.0, features=Vectors.dense([1.0, 0.0]))])
>>> nb = NaiveBayes(smoothing=1.0, modelType="multinomial", weightCol="weight")
>>> model = nb.fit(df) # 构造模型
>>> test0 = sc.parallelize([Row(features=Vectors.dense([1.0, 0.0]))]).toDF()
>>> result = model.transform(test0).head() # 预测
>>> result.prediction
1.0
>>> result.probability
DenseVector([0.32..., 0.67...])
>>> result.rawPrediction
DenseVector([-1.72..., -0.99...])

model.transform将输入的一行(Row)作为一个样本,产生一行输出. 这里我们只输入了一个测试样本, 所以直接使用head()取出唯一一行输出.

使用LogisticRegression和OneVsRest做多分类:

>>> from pyspark.sql import Row
>>> from pyspark.ml.linalg import Vectors
>>> df = sc.parallelize([
... Row(label=0.0, features=Vectors.dense(1.0, 0.8)),
... Row(label=1.0, features=Vectors.sparse(2, [], [])),
... Row(label=2.0, features=Vectors.dense(0.5, 0.5))]).toDF()
>>> lr = LogisticRegression(maxIter=5, regParam=0.01)
>>> ovr = OneVsRest(classifier=lr)
>>> model = ovr.fit(df)
>>> # 进行预测
>>> test0 = sc.parallelize([Row(features=Vectors.dense(-1.0, 0.0))]).toDF()
>>> model.transform(test0).head().prediction
1.0
>>> test1 = sc.parallelize([Row(features=Vectors.sparse(2, [0], [1.0]))]).toDF()
>>> model.transform(test1).head().prediction
0.0
>>> test2 = sc.parallelize([Row(features=Vectors.dense(0.5, 0.4))]).toDF()
>>> model.transform(test2).head().prediction
2.0

使用PCA进行降维:

>>> from pyspark.ml.linalg import Vectors
>>> data = [(Vectors.sparse(5, [(1, 1.0), (3, 7.0)]),),
... (Vectors.dense([2.0, 0.0, 3.0, 4.0, 5.0]),),
... (Vectors.dense([4.0, 0.0, 0.0, 6.0, 7.0]),)]
>>> df = spark.createDataFrame(data,["features"])
>>> pca = PCA(k=2, inputCol="features", outputCol="pca_features")
>>> model = pca.fit(df)
>>> model.transform(df).head().pca_features
DenseVector([1.648..., -4.013...])

EstimatorTransformer均为PipelineStage的派生类,pipeline由一系列Stage组成.调用pipeline对象的fit方法, 将会依次执行Stage并生成一个最终模型.

>>>from pyspark.ml import Pipeline
>>>from pyspark.ml.classification import LogisticRegression
>>>from pyspark.ml.feature import HashingTF, Tokenizer
>>> data = [
(0, "a b c d e spark", 1.0),
(1, "b d", 0.0),
(2, "spark f g h", 1.0),
(3, "hadoop mapreduce", 0.0) ]
>>> df = spark.createDataFrame(data, ["id", "text", "label"])
>>> # build pipeline
>>> tokenizer = Tokenizer(inputCol="text", outputCol="words")
>>> hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
>>> lr = LogisticRegression(maxIter=10, regParam=0.001)
>>> pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])
>>> # train
>>> model = pipeline.fit(df)
>>> data2 = [
(4, "spark i j k"),
(5, "l m n"),
(6, "spark hadoop spark"),
(7, "apache hadoop")
]
>>> test = spark.createDataFrame(data2, ["id", "text"])
>>> result = model.transform(test)
>>> result = result.select("id", "text", "probability", "prediction")
>>> result.collect()
[Row(id=4, text=u'spark i j k', probability=DenseVector([0.1596, 0.8404]), prediction=1.0),
Row(id=5, text=u'l m n', probability=DenseVector([0.8378, 0.1622]), prediction=0.0),
Row(id=6, text=u'spark hadoop spark', probability=DenseVector([0.0693, 0.9307]), prediction=1.0),
Row(id=7, text=u'apache hadoop', probability=DenseVector([0.9822, 0.0178]), prediction=0.0)]

本文示例来源于官方文档


更多内容请参考:

Spark ML机器学习的更多相关文章

  1. Spark ML机器学习库评估指标示例

    本文主要对 Spark ML库下模型评估指标的讲解,以下代码均以Jupyter Notebook进行讲解,Spark版本为2.4.5.模型评估指标位于包org.apache.spark.ml.eval ...

  2. 使用spark ml pipeline进行机器学习

    一.关于spark ml pipeline与机器学习 一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的 ...

  3. spark ml pipeline构建机器学习任务

    一.关于spark ml pipeline与机器学习一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的流 ...

  4. Spark ML下实现的多分类adaboost+naivebayes算法在文本分类上的应用

    1. Naive Bayes算法 朴素贝叶斯算法算是生成模型中一个最经典的分类算法之一了,常用的有Bernoulli和Multinomial两种.在文本分类上经常会用到这两种方法.在词袋模型中,对于一 ...

  5. Spark ML源码分析之一 设计框架解读

    本博客为作者原创,如需转载请注明参考           在深入理解Spark ML中的各类算法之前,先理一下整个库的设计框架,是非常有必要的,优秀的框架是对复杂问题的抽象和解剖,对这种抽象的学习本身 ...

  6. Spark ML源码分析之二 从单机到分布式

            前一节从宏观角度给大家介绍了Spark ML的设计框架(链接:http://www.cnblogs.com/jicanghai/p/8570805.html),本节我们将介绍,Spar ...

  7. Spark ML源码分析之四 树

            之前我们讲过,在Spark ML中所有的机器学习模型都是以参数作为划分的,树相关的参数定义在treeParams.scala这个文件中,这里构建一个关于树的体系结构.首先,以Decis ...

  8. Spark MLlib 机器学习

    本章导读 机器学习(machine learning, ML)是一门涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多领域的交叉学科.ML专注于研究计算机模拟或实现人类的学习行为,以获取新知识.新 ...

  9. Spark ML 几种 归一化(规范化)方法总结

    规范化,有关之前都是用 python写的,  偶然要用scala 进行写, 看到这位大神写的, 那个网页也不错,那个连接图做的还蛮不错的,那天也将自己的博客弄一下那个插件. 本文来源 原文地址:htt ...

随机推荐

  1. zeromq示例代码

    http://www.oschina.net/code/snippet_614253_55034 将zeromq代码使用vc集中到一个解决方案中 可编译可调调试 vc2015

  2. Monotonic Array LT896

    An array is monotonic if it is either monotone increasing or monotone decreasing. An array A is mono ...

  3. 【APP测试(Android)】--安全测试

  4. JavaScript:原生模拟$.ajax以及jsonp

    现实项目中,常常会用到请求,但是在考虑低版本的浏览器时,promise相关的axios,fetch这类第三方库的支持率就不那么好了,再考虑到最大的一个问题,跨域,更是让人头痛,虽然也有fetch-js ...

  5. Git使用方法(精心整理,绝对够用)转载

    Git使用方法(精心整理,绝对够用)   一.git客户端(本地仓库)的一些操作 1.设置账户(需要和github账户设置一致) git config --global user.name xxx g ...

  6. mysql data type <----> java data type (数值)

    https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +----------------------------+---- ...

  7. sublime将python的运行结果在命令行显示

    sublime将python的运行结果在命令行显示 为什么这么折腾? 因为每次查看输出结果都要上下拖动窗口,很烦. 将build system修改为 { "cmd": [" ...

  8. 提高Linux运维效率的命令行常用快捷键

    提高Linux运维效率的命令行常用快捷键 tab 命令或路径等的补全键,Linux最有用快捷键 Ctrl+a 光标回到命令行首 Ctrl+e 光标回到命令行尾 Ctrl+k 剪切(删除)光标处到行尾的 ...

  9. SDWebImage之UIView+WebCache

    UIView+WebCache是我们能很方便的使用sd_setImageWithURL:系列方法来加载图片的关键类.UIButton(WebCache).MKAnnotationView(WebCac ...

  10. ETL概念详解

    ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...