暂无说说

构建一个机器学习工作流

pyspark jiajun 8个月前 (03-10) 854次浏览 0个评论 扫描二维码

工作流(ML Pipelines)例子

本节以逻辑斯蒂回归为例,构建一个典型的机器学习过程,来具体介绍一下工作流是如何应用的。我们的目的是查找出所有包含”spark”的句子,即将包含”spark”的句子的标签设为 1,没有”spark”的句子的标签设为 0。Spark2.0 起,SQLContext、HiveContext 已经不再推荐使用,改以 SparkSession 代之,故本文中不再使用 SQLContext 来进行相关的操作,关于 SparkSession 的具体详情,这里不再赘述,可以参看 Spark2.0 的官方文档

创建 SparkSession 对象

Spark2.0 以上版本的pyspark创建一个名为 spark 的 SparkSession 对象,当需要手工创建时,SparkSession 可以由其伴生对象的 builder()方法创建出来,如下代码段所示:

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

下文中,我们默认名为 spark 的 SparkSession 已经创建。pyspark.ml 依赖 numpy 包,本文使用 anconda 已经自带,如果没有,可使用 pip 安装

sudo pip3 install numpy

引包并构建训练数据集

from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import HashingTF, Tokenizer
 
# Prepare training documents from a list of (id, text, label) tuples.
training = 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"])

定义 PipelineStage

在这一步中我们要定义 Pipeline 中的各个工作流阶段 PipelineStage,包括转换器和评估器,具体的,包含 tokenizer, hashingTF 和 lr 三个步骤。

tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.001)

创建 Pipeline

pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

现在构建的 Pipeline 本质上是一个 Estimator,在它的 fit()方法运行之后,它将产生一个 PipelineModel,它是一个 Transformer。

model = pipeline.fit(training)
model

我们可以看到,model 的类型是一个 PipelineModel,这个管道模型将在测试数据的时候使用。接下来,我们先构建测试数据。

构建测试数据

test = spark.createDataFrame([
    (4, "spark i j k"),
    (5, "l m n"),
    (6, "spark hadoop spark"),
    (7, "apache hadoop")
], ["id", "text"])

然后,我们调用我们训练好的 PipelineModel 的 transform()方法,让测试数据按顺序通过拟合的工作流,生成我们所需要的预测结果。

prediction = model.transform(test)
selected = prediction.select("id", "text", "probability", "prediction")
for row in selected.collect():
    rid, text, prob, prediction = row
    print("(%d, %s) --> prob=%s, prediction=%f" % (rid, text, str(prob), prediction))

结果:

(4, spark i j k) --> prob=[0.155543713844,0.844456286156], prediction=1.000000
(5, l m n) --> prob=[0.830707735211,0.169292264789], prediction=0.000000
(6, spark hadoop spark) --> prob=[0.0696218406195,0.93037815938], prediction=1.000000
(7, apache hadoop) --> prob=[0.981518350351,0.018481649649], prediction=0.000000        

通过上述结果,我们可以看到,第 4 句和第 6 句中都包含”spark”,其中第六句的预测是 1,与我们希望的相符;而第 4 句虽然预测的依然是 0,但是通过概率我们可以看到,第 4 句有 46%的概率预测是 1,而第 5 句、第 7 句分别只有 7%和 2%的概率预测为 1,这是由于训练数据集较少,如果有更多的测试数据进行学习,预测的准确率将会有显著提升。

喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址