spark-5 Spark ML

五、Spark ML

ML从功能上说与Scikit-Learn等机器学习库非常类似,但计算引擎采用的是Spark,即所有计算过程均实现了分布式,这也是它和其他机器学习库最大的不同。

在Spark ML模块中,主要分为两个包:spark.ml与spark.mllib,我们将前者称为Spark ML API,后者称为Spark MLlib API,MLlib与ML之间最大的区别在于,ML基于DataFrame,而MLlib API基于RDD,这与GraphX和GraphFrame之间的关系类似。在Spark 2.0后,基于RDD的API,也就是MLlib API,就已经进入了维护状态,而Spark MLlib首要的API为ML API。

Spark ML提供基于DataFrame API的原因有以下3点:
(1)提供跨语言的统一API;
(2)DataFrame易于使用ML Pipelines特性;
(3)提升性能。

5.1 Spark ML Pipelines

Spark ML API引入了Pipelines API(管道),这类似于Python机器学习库Scikit-Learn中的Pipeline,它采用了一系列API定义并标准化各个工作流,它包含了数据收集、预处理、特征抽取、特征选择、模型拟合、模型验证、模型评估等一系列阶段。例如,对文档进行分类也许会包含分词、特征抽取、训练分类模型以及调优等过程。大多数机器学习库不是为分布式计算而设计的,也不提供Pipeline的创建与调优,这就是Spark ML PipeLines与传统机器学习库的最大区别。

Spark ML Pipelines对分布式机器学习过程进行模块化的抽象,这样使得多个算法合并成一个Pipeline或者工作流变得更加容易。

5.1.1 关键概念:

(1)DataFrame:DataFrame与Spark SQL中用到的DataFrame一样,是Spark的基础数据结构,贯穿了整个Pipeline。它可以存储文本、特征向量、训练集以及测试集。除了常见的类型,DataFrame还支持Spark MLlib特有的Vector类型。

(2)Transformer:Transformer对应了数据转换的过程,它接收一个DataFrame,在它的作用下,会生成一个新的DataFrame。在机器学习中,在涉及特征转换的过程中经常会用到,另外还会用于训练出的模型将特征数据集转换为带有预测结果的数据集的过程,Transformer都必须实现transform()方法。

(3)Estimator:从上面 Transformer 的定义可以得知,训练完成好的模型也是一个Transformer,那么Estimator包含了一个可以让数据集拟合出一个Transformer的算法,Estimator必须实现fit()方法。

(4)Pipeline:一个Pipeline将多个Transformer和Estimator组装成一个特定的机器学习工作流。

(5)Parameter:所有的Estimator和Transformer共用一套通用的API来指定参数。

5.1.2 如何构建一个工作流

一个pipeline 在结构上会包含一个或多个Stage,每一个 Stage 都会完成一个任务,如数据集处理转化,模型训练,参数设置或数据预测等,定义 Pipeline 中的各个工作流阶段Pipeline Stage,然后按照具体的处理逻辑,有序的组织Pipeline Stages 并创建一个Pipeline。

pipeline =Pipeline(stages=[stage1,stage2,stage3])

以spark官网的文本分类为例,DataFrame存储的行形式的文本,首先经过Tokenizer的分词处理转化变成了词(Words),然后经HashingTF转化变成了特征(Feature vectors),特征经LR得到了回归模型。
在训练阶段, Pipeline如下:

在这里插入图片描述
图5.1 训练阶段的pipeline

测试阶段, Pipeline如下:

在这里插入图片描述
图5.2 测试阶段的pipeline

from pyspark.sql import SparkSession
from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import HashingTF,Tokenizer

spark = SparkSession.builder.master("local").appName("spark ML").getOrCreate()

#创建DataFrame训练集
#训练集包括字段id,text,label
df_train = spark.createDataFrame([
    (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)
], ["id", "text", "label"])

#构建转化器和评估器
#定义分词器,spark自带的Tokenizer以空格分词;inputCol为输入的列名,outputCol为转化输出的列名
tokenizer=Tokenizer(inputCol="text", outputCol="words")
hashTf=HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.001)
 
#创建训练管道
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])
 
#训练模型
model=pipeline.fit(df_train)

#测试DataFrame构建
df_test=spark.createDataFrame([
    (4, "spark i j k"),
    (5, "l m n"),
    (6, "spark hadoop spark"),
    (7, "apache hadoop")
], ["id", "text"])
 
#测试
predict=model.transform(df_test)
#显示预测结果id|text|words|features|rawPrediction|probability|prediction
predict.show()

5.2 典型的机器学习工作流

在这里插入图片描述
图5.3 典型机器学习建模流程

一个典型的机器学习应用程序涉及从输入、处理到输出的几个步骤,形成一个科学的工作流程,如图6-1所示。典型的机器学习应用程序涉及以下步骤:

(1)数据处理:加载样本数据、将数据解析为算法所需的格式、预处理数据并处理缺失值、划分训练集和测试集。
(2)特征工程:包括特征选择和特征提取两个部分。
(3)模型选择与训练:根据应用场景选择算法、构建并训练机器学习模型、用训练数据进行预测并观察结果、使用测试数据测试和评估模型,或者使用第三个数据集(称为验证数据集)运用交叉验证技术验证模型、调整模型以获得更好的性能和准确性、调整模型扩展性,以便将来能够处理大量的数据集。
(4)模型量化与部署模型。

5.3 机器学习算法介绍

5.3.1 数据处理

在真实的生产环境中,我们拿到的数据通常是不尽如人意的,例如存在大量的缺失值、特征的值是不同的量纲、有一些无关的特征、特征的值需要再次处理等情况,这样的数据无法直接训练,因此我们需要对这些数据进行预处理。数据预处理在机器学习中是非常重要的步骤,如果没有按照正确的方法对数据进行预处理,往往会得到错误的训练结果。下面介绍常见的预处理方法。

在这里插入图片描述

5.3.2 特征工程

特征工程:最大限度地从原始数据中提取特征(有用信息)的过程,并且利用特征建立的模型可在未知数据上的性能表现达到最优。一般包括两种处理手段:
(1)特征选择:是从原始特征数据集中选择出子集,是一种包含的关系,没有更改原始的特征空间。
特征选择主要包括四个过程:

  • 生成过程:生成候选的特征子集;
  • 评价函数:评价特征子集的好坏;
  • 停止条件:决定什么时候该停止;
  • 验证过程:特征子集是否有效。
    根据建模时与后续建模过程的相关程度,特征选择算法一般分为三大类:
  • 过滤式(filter):先进行特征选择,然后去训练学习器,所以特征选择的过程与学习器无关。相当于先对于特征进行过滤操作,然后用特征子集来训练分类器。对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。
  • 封装式(wrapper):直接把最后要使用的分类器作为特征选择的评价函数,对于特定的分类器选择最优的特征子集。将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个优化问题。
  • 嵌入式( embedding):把特征选择的过程与分类器学习的过程融合一起,在学习的过程中进行特征选择。其主要思想是:在模型既定的情况下学习出对提高模型准确性最好的属性。这句话并不是很好理解,其实是讲在确定模型的过程中,挑选出那些对模型的训练有重要意义的属性。

(2)特征提取:是通过属性间的关系,如组合不同的属性得到新的属性,这样就改变了原来的特征空间。特征提取需要实现的两个功能:

  • 降低数据维度;
  • 提取出的特征是有效的。

在这里插入图片描述

5.3.3 模型选择与建立

监督学习:可以由训练资料中学到或创建一个函数,并依此函数推测新的实例。训练资料是由数据和数据对应的标签所组成,包括学习和推理两个阶段。一般分为分类和回归两种类型。

无监督学习:只有数据而不知道数据的标签,需要根据数据本身的特性,从数据中根据某种度量学习出一些特性。通常指聚类。

强化学习:算法本身有一个状态(state),算法借助一个代理(agent)和环境(environment)交互,交互的结果以奖惩(reward)的形式返回并作用于算法本身,得到一个新的状态,并以此进行迭代,拥有与环境进行交互的能力。一般分为动作价值优先和策略价值优先。
当前Spark ML所支持的机器学习算法如表5.1所示。

表5.1 Spark ML支持的机器学习算法

类型Spark ML支持的算法
分类逻辑回归(Binomial logistic regression、Multinomial logistic regression), 决策树分类(Decision tree classifier)随机森林分类(Random forest classifier), 梯度提升决策树分类(Gradient-boosted tree classifier), 多层感知机分类(Multilayer perceptron classifier), 一对多法分类(One-vs-Rest classifier), 朴素贝叶斯(naive Bayes)
回归线性回归(Linear regression), 广义线性回归(Generalized linear regression), 决策树回归(Decision tree regression), 随机森林回归(Random forest regression), 梯度提升决策树回归(Gradient-boosted tree regression), 生存回归(Survival regression), 保序回归(Isotonic regression)
推荐协同过滤(Collaborative filtering)
聚类K-均值(k-means), 高斯混合(Gaussian Mixture Model), 主题模型(latent Dirichlet allocation(LDA) ), 二分K均值(bisecting k-means)

5.3.4 模型评估

(1)二分类
二分类器用于将给定数据集的元素分为两个可能的组(例如欺诈或非欺诈)之一,这是多类分类的一种特殊情况。大多数二元分类指标可以概括为多类分类指标。

在这里插入图片描述
(2)多分类
多标签分类问题涉及将数据集中的每个样本映射到一组类标签。在这种类型的分类问题中,标签不是互斥的。因此预测和真实标签现在是标签集的向量,而不是标签的向量。因此,多标签度量将精度,召回率等基本概念扩展到集合操作上。

在这里插入图片描述
(3)回归

在这里插入图片描述
(4)排序算法(推荐算法)

排序算法(通常被认为是推荐系统)的作用是根据一些训练数据向用户返回一组相关项目或文档。相关性的定义可能会有所不同,并且通常是特定于应用程序的。排名系统指标旨在量化这些排名或建议在各种情况下的有效性。

在这里插入图片描述

5.4 代码示例

采用人工神经网络建立一个多分类模型,采用4层网络设计,隐藏层激活函数选用sigmoid,输出层采用softmax,损失函数采用交叉熵损失。

# -*- coding: utf-8 -*-

from __future__ import print_function
from pyspark.ml.classification import MultilayerPerceptronClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.sql import SparkSession

if __name__ == "__main__":
    spark = SparkSession.builder.appName("multilayer_perceptron_classification_example").getOrCreate()

    data = spark.read.format("libsvm").load("../data/mllib/sample_multiclass_classification_data.txt")
    (train_data, test_data) = data.randomSplit([0.6, 0.4], seed=2019)

    # 输入层为features的大小(4),输出层为labels的大小(3)
    layers = [4, 5, 4, 3]

    # train
    trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers, blockSize=128, seed=2019)
    model = trainer.fit(train_data)

    # 计算在测试集上的准确率
    predictions = model.transform(test_data)
    predictions.select("prediction", "label", "features").show(5)
    evaluator = MulticlassClassificationEvaluator(labelCol="label", predictionCol="prediction", metricName="accuracy")
    accuracy = evaluator.evaluate(predictions)
    print("Test Error = %g" % (1.0 - accuracy))
    print(model)

    spark.stop()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的提问。关于数据挖掘工具Spark的使用练习,我可以给您一些简单的介绍。 Spark是一种基于内存的分布式计算框架,可以用于大规模数据处理和分析。它提供了许多机器学习算法的实现,包括分类、回归、聚类、推荐等。在使用Spark进行机器学习时,可以使用其机器学习库MLlib。 为了练习Spark的机器学习功能,您可以选择一些数据集进行实验。例如,可以使用UCI机器学习库中的数据集,如鸢尾花数据集、波士顿房价数据集等。您可以使用Spark的API来读取这些数据集,并使用MLlib中的算法进行训练和预测。 在使用Spark进行机器学习时,需要注意一些问题。首先,需要对数据进行预处理,包括数据清洗、特征选择、特征缩放等。其次,需要选择合适的算法和参数,以达到最好的性能。最后,需要进行模型评估和调优,以提高模型的准确性和泛化能力。 希望这些信息对您有所帮助。如果您有其他问题,欢迎随时联系我。 ### 回答2: Spark是目前最流行,也是最强大的开源大数据处理框架之一,其在数据挖掘、机器学习等应用领域也有广泛的应用。本篇文章将深入探讨Spark中的机器学习工具——mlmlSpark Machine Learning Library的简称,是Spark的核心机器学习API。它提供了一些基于分布式数据处理的机器学习算法,如线性回归、逻辑回归、决策树、随机森林、聚类等,以及各种数学工具和可视化工具。 首先我们需要了解一下Spark中机器学习的基本概念——管道。管道是一个机器学习工作流的逻辑组件,将数据流组装为一个完整的处理流程,并使得数据在流中顺序流动。Spark的管道API可以让机器学习工程师构建机器学习工作流的模型。同时,管道还具有容错性,可以在集群中处理海量数据,不容易出错。 首先我们来看一个管道的例子,该管道基于线性回归模型: 1.从数据源读入数据,如.csv、.parquet、.json文件或HDFS上的目录或数据源 2.对数据进行预处理,比如过滤、特征提取、缩放等 3.将预处理后的数据集拆分成训练、验证和测试三部分 4.使用管道API中提供的机器学习算法进行模型训练 5.使用验证集对模型进行验证 6.使用测试集对模型进行测试 7.对模型进行调优,提高其预测准确性 如果您对机器学习算法比较熟悉,那么通过Sparkml库能够更加方便地构建机器学习管道。在这里,我们将介绍几个ml库中的常用算法。 首先是线性回归算法。线性回归是一种用于建立两种或两种以上变量之间的关系的统计学方法。尤其是当数据集显然是线性的时,它是一种常用的建模方法。在Sparkml库中,线性回归可以通过LinearRegression类的方法进行训练和预测。例如: from pyspark.ml.regression import LinearRegression training = spark.read.format("libsvm").load("data/mllib/sample_linear_regression_data.txt") lr = LinearRegression(maxIter=10, regParam=0.3, elasticNetParam=0.6) # Fit the model lrModel = lr.fit(training) # Print the coefficients and intercept for linear regression print("Coefficients: %s" % str(lrModel.coefficients)) print("Intercept: %s" % str(lrModel.intercept)) 同样,逻辑回归是另一种常见的机器学习算法,其可用于二分类或多分类问题。在Sparkml库中,逻辑回归的实现可以通过LogisticRegression类。例如: from pyspark.ml.classification import LogisticRegression training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8) # Fit the model lrModel = lr.fit(training) # Print the coefficients and intercept for logistic regression print("Coefficients: %s" % str(lrModel.coefficients)) print("Intercept: %s" % str(lrModel.intercept)) 三、随机森林。随机森林是一个使用多个决策树进行分类或回归的集合算法。在Sparkml库中,随机森林的实现可以通过RandomForestClassifier和RandomForestRegressor类。例如: from pyspark.ml.classification import RandomForestClassifier training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") rf = RandomForestClassifier(numTrees=10, maxDepth=5, seed=42) model = rf.fit(training) 输入数据通常都是高维的,管道工具也提供了gemetries变换的API,其中包括提取特征和转换特征向量。这些工具可以很方便地将数据转换为矩阵进行机器学习。使用特征转换器,我们可以创建一个用于管道的PipelineModel,用于数据预处理之后的机器学习模型预测。例如: from pyspark.ml.feature import PCA, VectorAssembler from pyspark.ml import Pipeline assembler = VectorAssembler(inputCols=["pca_features"], outputCol="features") pca = PCA(k=2, inputCol="features", outputCol="pca_features") pipeline = Pipeline(stages=[assembler, pca]) model = pipeline.fit(df) result = model.transform(df) print(result.select("features", "pca_features").show()) 总之,在Spark ml库中,提供了多种机器学习算法的实现工具,让我们只需要通过API即可完成机器学习流程。此外,Spark提高了算法的预测速度和准确性,并支持在分布式集群上进行机器学习,适用于处理大规模的数据集,并有效地处理各种任务。 ### 回答3: Spark是一个开源的基于内存计算的大数据处理框架,在数据挖掘领域也有着广泛的应用。MLlib是Spark的机器学习库,提供了大量可扩展的机器学习算法和工具。本次数据挖掘工具--Spark使用练习--ML(二)主要涉及如下内容: 1. 数据预处理 在机器学习任务中,数据预处理是非常重要的一步。Spark提供了一系列的数据处理API,例如读取数据、数据清洗、数据转换等。本次实践选择了UCI机器学习库中的Iris数据集,并使用Spark的API对数据进行了清洗和转换。 2. 特征提取 在机器学习建模过程中,特征提取是非常重要的一步。特征提取可以将原始数据转换成适合机器学习算法处理的形式。Spark提供了多种特征提取方法,例如TF-IDF、Word2Vec、PCA等。本次实践选择了PCA对数据进行了特征提取。 3. 模型训练和验证 Spark提供了多种机器学习算法,在本次实践中使用了K-Means聚类算法。K-Means是一种无监督学习算法,用于将数据分成K个不同的组。聚类算法的评估通常使用轮廓系数(Silhouette Coefficient)进行评估,在本次实践中也使用了该指标进行了模型的评估。 4. 模型应用 本次实践使用K-Means算法对Iris数据集进行了聚类分析,并将聚类结果进行了可视化展示。该实践展示了如何使用Spark的机器学习库进行数据挖掘和分析。 总之,通过本次实践学习,我们可以更深入地理解和掌握Spark在数据挖掘领域的应用。在实践中需要注意的是,不同的机器学习算法适用于不同的数据集和问题,需要根据实际情况进行选择和应用。同时,也需要注意数据预处理和特征提取等环节对最终模型的影响。只有在充分理解和掌握这些基础知识的基础上,才能进行更加高效、准确和实用的数据挖掘工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值