spark ML第二篇_ML流程

 

使用一个小型的合成数据集来帮助使用ML。
数据集解释:

数据集包括了有两个值(bad、good)的分类标签,以及【其实应该说是哑变量】分类变量(颜色)、两个数值变量。

虽然数据是合成的,但让我们假设这个数据集代表了公司的客户健康状况。“颜色”列表示客户服务代表做出的某种分类健康评级。“lab”列表示真实的客户健康状况。其他两个值是应用程序内活动的一些数值度量(例如,在站点上花费的分钟和购买)。假设我们想要训练一个分类模型,在这个模型中,我们希望从其他值预测一个二元变量——标签。

1.读取数据

df = spark.read.json("/root/jupyterData/jupyterNotePerject/spark总结/Spark_The_Definitive_Guide-master/data/simple-ml")
df.orderBy("value2").show(10) #对df按照value2的值排序并打印
type(df)

 

结果:
在这里插入图片描述
小插曲: 除了JSON,还有一些特定的数据格式通常用于监督学习,包括LIBSVM。以下是LIBSVM数据格式的读取方式:

spark.read.format("libsvm").load("/data/sample_libsvm_data.txt")

 

2.转换器(Transformers)–特征工程

说白了,转换器就是进行特征工程(实现特征的转换)
将数据转换成最终喂入机器学习模型的格式数据集,该输入数据集必须是 由类型Double(用于标签)和VectorDouble组成。此外,该过程可能进行了归一化、去噪声等等操作。

如前所述,转换器帮助我们以某种方式操纵当前的列。操作这些列通常是为了构建特征(我们将输入到模型中)。转换器的存在是为了减少特征的数量,添加更多的特征,操作当前的特征,或者只是帮助我们正确格式化数据。转换器向数据流添加新列。当我们使用MLlib时,Spark中机器学习算法的所有输入(后面几章中讨论了几个例外)必须由类型Double(用于标签)和VectorDouble组成。当前数据集不满足这个要求,因此我们需要将其转换为适当的格式。如果还是不太清晰,可以参考这篇文章

为了在我们的示例中实现这一点,我们将指定一个RFormula。这是一种用于指定机器学习转换的声明性语言,一旦您理解了语法,就很容易使用。RFormula支持在实践中对简单模型和操作非常有效的有限的R操作符子集(我们将在第25章中演示手动解决此问题的方法)。基本的RFormula运算符是:

  • ~ 分割符号,分割标签变量y 和 数据x
  • + 合并项;截距项,(例如:+0 表示截距项为0、删除截距项)
  • - 删除项; “-1"表示移除截距(这意味着我们拟合的直线的y轴截距为0,这与”+0"相同的。
  • : 交互(数值的乘法,或二值化的范畴值),例如 变量1:变量2 则表示这两个变量之间的关系
  • . 除目标/因变量外的所有列

为了使用这种语法指定转换,我们需要导入相关的类。然后我们来定义我们的公式【相当于构建一个特征转换的公式】。在这种情况下,我们希望使用所有可用的变量(.),并添加value1和color 和 value2和color之间的相互作用,作为新的特征:
使用RFormula进行定义特征转换的公式(RFormula模型):

from pyspark.ml.feature import RFormula
supervised = RFormula(formula="lab ~ . + color:value1 +color:value1")

 

根据RFormula模型进行特征工程训练;目的得到输入机器学习模型的最终特征数据:
注意:这里的训练不是进行目标机器学习模型的训练,而是对原始数据集进行一个特征的转换。

fittedRF = supervised.fit(df)
preparedDF = fittedRF.transform(df)
preparedDF.show(10,False)#左对齐

 


# 以下是训练(这里的训练指的是按照特征公式训练特征、得出的是特征工程之后的特征)和转换过程的输出:

原始数据集进行转换器流程结果:
在这里插入图片描述
解释: 在输出中,我们可以看到转换的结果,这是一个名为features的列,其中包含以前的原始数据。幕后发生的事情其实很简单。RFormula在fit调用期间检查数据并输出一个对象,该对象将根据指定的公式(称为RFormula模型)转换数据。这个“训练”的转换器总是在类型签名中包含单词模型。当我们使用这个转换器时,Spark会自动将我们的分类变量转换为双精度,这样我们就可以将它输入到(尚未指定的)机器学习模型中。特别地,它为每个可能的颜色类别分配一个数值,为颜色和value1/value2之间的交互变量创建额外的特征,并将它们全部放入单个向量中。然后对该对象调用transform,以便将输入数据转换为预期的输出数据。

3.拆分数据集

  • 训练集:用来拟合模型;
  • 验证集:用来在拟合模型时或者之后进行一个模型的超参数调优、防止过拟合。
  • 测试集:用来对模型进行测试,测试其泛化能力。

到目前为止,(预先)处理了数据并在此过程中添加了一些特征。现在是在这个数据集上实际训练一个模型(或一组模型)的时候了。为此,首先需要准备一个测试集进行评估。

拥有一个好的测试集可能是能做的最重要的事情,以确保能训练出一个可以在现实世界中实际使用的模型(以一种可靠的方式)。不创建一个有代表性的测试集,或者使用测试集进行超参数调优,这些都是创建一个在真实场景中表现不佳的模型的方法。不要跳过创建一个测试集,这是一个需要知道你的模型实际上做得有多好。

train, test = preparedDF.randomSplit([0.7, 0.3])
train.show(5) #小数据集习惯性查看一下、我也不知道这习惯是好是坏

 

在这里插入图片描述

4.Estimators(估计器)–训练模型

允许用户从数据中训练模型的算法也称为估计器。

现在我们已经将数据转换为正确的格式并创建了一些有价值的特征,现在是时候实际地适合我们的模型了。在这种情况下,我们将使用一种称为逻辑回归的分类算法。为了创建分类器,我们使用默认配置或超参数实例化一个LogisticRegression实例。然后我们设置标签列和特征列;我们设置的标签和特征的列名实际上是Spark MLlib中所有估计器的默认标签:

(1) 实例化模型对象–返回一个未经训练的模型对象:

至于如何选择模型,这里就不多说了,我想已经在spark ML的你,也对机器学习有了一定的认识!
(关于逻辑回归的文章,我还没写上去,改天把原理推导和实战写上来)
下面选择了逻辑回归模型。

from pyspark.ml.classification import LogisticRegression
lr = LogisticRegression(labelCol="label",featuresCol="features")

 

在我们实际开始训练这个模型之前,让我们检查一下参数。这也是提醒您每个特定模型的可用选项的好方法:

print(lr.explainParams()) #查看模型的一些参数(包括默认参数以及一些在赋予的参数)

 

它显示了对所有参数的解释Spark逻辑回归的实现。explainParams方法存在于ML中所有可用的算法上,输出:
在这里插入图片描述

(2)拟合模型–返回已经训练的模型对象:

在实例化未经训练的算法之后,就需要将其与数据进行匹配拟合。在这种情况下,它会返回一个训练过数据的逻辑回归模型。pysark ML的训练模型与skearn类似。

这段代码将启动一个spark作业来训练模型。与在整本书中看到的转换不同,机器学习模型的拟合是迫切的,并且是立即执行的:

fittedLR = lr.fit(train)

5.使用训练好的模型去预测数据

模型训练一旦完成,可以使用该模型进行预测。从逻辑上讲,这意味着把特征转换成标签。我们用变换法进行预测。例如,我们可以转换我们的训练数据集,以查看我们的模型为训练数据分配了什么标签,以及这些标签如何与真实输出进行比较。这也是我们可以操作的另一个数据流。让我们使用下面的代码片段来执行这个预测:

# 之前已经使用训练集进行了训练模型,再次使用训练集去进行预测,查看模型对训练集的预测,以及原来的标签是怎么样的。
fittedLR.transform(test).select("label", "prediction").show(30) #如果需要预测测试集或者其它数据,只需把test换掉即可

 

预测结果:
在这里插入图片描述

下一步是手动评估这个模型,并计算性能指标,如真阳性率、假阴性率等。然后,我们可以转而尝试一组不同的参数,看看它们是否表现得更好。然而,虽然这是一个有用的过程,但也可能相当乏味。Spark允许您将工作负载指定为包含所有转换和调优超参数的声明性工作管道,从而帮助您避免手动尝试不同的模型和评估标准。

 

posted @ 2020-01-09 16:29  Tony学长  阅读(134)  评论(0编辑  收藏  举报