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. deug的使用经验

    最基本的操作是: 1, 首先在一个java文件中设断点,然后运行,当程序走到断点处就会转到debug视图下, 2, F5键与F6键均为单步调试,F5是step into,也就是进入本行代码中执行,F6 ...

  2. [c#.net]未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件

    问题是这样嘀: 项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这个项目也是采用分布式的数据库,目前只有三个数据库,主要出于提高访问性能考虑. 原来是按照网上对PetShop的介绍来给 ...

  3. xbee/xbeeRPOS1、xbee/xbeePROS2C802.15.4/Digimesh功能方法

    Digi XBee 802.15.4的第一个版本也称为S1,是基于Freescale的无线收发器片子设计的.最新的802.15.4模块(内部称号S1B)采用和Digi ZigBee模块相同SOC芯片设 ...

  4. ios下面的按钮和inout框

    在ios系统中,按钮和输入框,会默认给你加一个圆角和阴影,可以用css去掉这个自带的属性 input[type=button], input[type=submit], input[type=file ...

  5. 20175316盛茂淞 迭代和JDB

    迭代和JDB 题目 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图(至少三张:正常如c( ...

  6. kbmmw中向服务器端传递对象的一种简单方式

    运行环境:delphi 10.2+kbmmw 5.6.20 在kbmmw 的老版本中,要向服务器传送一个本地的对象,一般都需要进行一些转换,例如通过序列化的方式. 在新版的kbmmw中这一切都变的很简 ...

  7. mui.init方法配置

    mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括: 创建子页面. 关闭页面. ...

  8. Hibernate配置文件的书写

    Hibernate主要配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibern ...

  9. Codeforces Round #486 (Div. 3) A. Diverse Team

    Codeforces Round #486 (Div. 3) A. Diverse Team 题目连接: http://codeforces.com/contest/988/problem/A Des ...

  10. Vuejs——(6)Vuejs与form元素

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   资料来于官方文档: http://cn.vuejs.org/guide/forms.html 本 ...