Spark 多类分类示例

2023-11-23

你们知道在哪里可以找到 Spark 中多类分类的示例吗?我花了很多时间在书籍和网络上搜索,到目前为止我只知道根据文档的最新版本这是可能的。


ML

(Spark 2.0+ 推荐使用)

我们将使用与下面 MLlib 中相同的数据。有两个基本选项。如果Estimator支持开箱即用的多类分类(例如随机森林),您可以直接使用它:

val trainRawDf = trainRaw.toDF

import org.apache.spark.ml.feature.{Tokenizer, CountVectorizer, StringIndexer}
import org.apache.spark.ml.Pipeline

import org.apache.spark.ml.classification.RandomForestClassifier

val transformers = Array(
  new StringIndexer().setInputCol("group").setOutputCol("label"),
  new Tokenizer().setInputCol("text").setOutputCol("tokens"),
  new CountVectorizer().setInputCol("tokens").setOutputCol("features")
)


val rf = new RandomForestClassifier() 
  .setLabelCol("label")
  .setFeaturesCol("features")

val model = new Pipeline().setStages(transformers :+ rf).fit(trainRawDf)

model.transform(trainRawDf)

如果模型仅支持二元分类(逻辑回归)并扩展o.a.s.ml.classification.Classifier您可以使用一对一策略:

import org.apache.spark.ml.classification.OneVsRest
import org.apache.spark.ml.classification.LogisticRegression

val lr = new LogisticRegression() 
  .setLabelCol("label")
  .setFeaturesCol("features")

val ovr = new OneVsRest().setClassifier(lr)

val ovrModel = new Pipeline().setStages(transformers :+ ovr).fit(trainRawDf)

MLLib

根据官方文档目前(MLlib 1.6.0)以下方法支持多类分类:

  • 逻辑回归,
  • 决策树,
  • 随机森林,
  • 朴素贝叶斯

至少一些示例使用多类分类:

  • 朴素贝叶斯示例- 3 节课
  • 逻辑回归- 分类器有 10 个类别,尽管示例数据中只有 2 个类别

忽略方法特定参数的一般框架与 MLlib 中的所有其他方法几乎相同。您必须预处理输入以创建其中的列代表的数据框label and features:

root
 |-- label: double (nullable = true)
 |-- features: vector (nullable = true)

or RDD[LabeledPoint].

Spark 提供了广泛的有用工具来促进这一过程,包括特征提取器 and 特征转换器 and 管道.

您会在下面找到一个使用随机森林的相当幼稚的示例。

首先让我们导入所需的包并创建虚拟数据:

import sqlContext.implicits._
import org.apache.spark.ml.feature.{HashingTF, Tokenizer} 
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.ml.feature.StringIndexer
import org.apache.spark.mllib.tree.RandomForest
import org.apache.spark.mllib.tree.model.RandomForestModel
import org.apache.spark.mllib.linalg.{Vectors, Vector}
import org.apache.spark.mllib.evaluation.MulticlassMetrics
import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD

case class LabeledRecord(group: String, text: String)

val trainRaw = sc.parallelize(
    LabeledRecord("foo", "foo v a y b  foo") ::
    LabeledRecord("bar", "x bar y bar v") ::
    LabeledRecord("bar", "x a y bar z") ::
    LabeledRecord("foobar", "foo v b bar z") ::
    LabeledRecord("foo", "foo x") ::
    LabeledRecord("foobar", "z y x foo a b bar v") ::
    Nil
)

现在让我们定义所需的变压器和流程Dataset:

// Tokenizer to process text fields
val tokenizer = new Tokenizer()
    .setInputCol("text")
    .setOutputCol("words")

// HashingTF to convert tokens to the feature vector
val hashingTF = new HashingTF()
    .setInputCol("words")
    .setOutputCol("features")
    .setNumFeatures(10)

// Indexer to convert String labels to Double
val indexer = new StringIndexer()
    .setInputCol("group")
    .setOutputCol("label")
    .fit(trainRaw.toDF)


def transfom(rdd: RDD[LabeledRecord]) = {
    val tokenized = tokenizer.transform(rdd.toDF)
    val hashed = hashingTF.transform(tokenized)
    val indexed = indexer.transform(hashed)
    indexed
        .select($"label", $"features")
        .map{case Row(label: Double, features: Vector) =>
            LabeledPoint(label, features)}
}

val train: RDD[LabeledPoint] = transfom(trainRaw)

请注意indexer被“拟合”在列车数据上。它只是意味着用作标签的分类值被转换为doubles。要对新数据使用分类器,您必须首先使用此方法对其进行转换indexer.

接下来我们可以训练 RF 模型:

val numClasses = 3
val categoricalFeaturesInfo = Map[Int, Int]()
val numTrees = 10
val featureSubsetStrategy = "auto"
val impurity = "gini"
val maxDepth = 4
val maxBins = 16

val model = RandomForest.trainClassifier(
    train, numClasses, categoricalFeaturesInfo, 
    numTrees, featureSubsetStrategy, impurity,
    maxDepth, maxBins
)

最后测试一下:

val testRaw = sc.parallelize(
    LabeledRecord("foo", "foo  foo z z z") ::
    LabeledRecord("bar", "z bar y y v") ::
    LabeledRecord("bar", "a a  bar a z") ::
    LabeledRecord("foobar", "foo v b bar z") ::
    LabeledRecord("foobar", "a foo a bar") ::
    Nil
)

val test: RDD[LabeledPoint] = transfom(testRaw)

val predsAndLabs = test.map(lp => (model.predict(lp.features), lp.label))
val metrics = new MulticlassMetrics(predsAndLabs)

metrics.precision
metrics.recall
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark 多类分类示例 的相关文章

随机推荐

  • Varchar(max) 列不允许作为 SQL Server 中的主键

    Varchar max 列不允许作为 SQL Server 中的主键 可以作为主键的 varchar 类型的最大长度是多少 这可能是一个不好的做法 但遇到了这种情况 900 字节是主键的最大长度 在我看来这是一个坏主意 为什么不使用代理键呢
  • 获取python程序的退出代码

    我正在 WindowsXP 上运行 python 程序 程序结束后如何获取退出代码 从 Windows 命令行 您可以使用 echo ERRORLEVEL 例如 C work gt python helloworld py Hello Wo
  • flutter 异步验证表单

    new TextFormField validator value async if value isEmpty return Username is required if await checkUser return Username
  • Angular-CLI 代理到后端不起作用

    https github com angular angular cli proxy to backend这是如何对后端进行代理的说明 我一步一步完成了所有操作 但请求仍然没有被代理 8080 我的 Express 后端 4200 我的 A
  • 无法自动装配服务

    我正在尝试从 FOSUserBundle Symfony3 4 实现 UserManager 服务 注册 php
  • 可在网络上打印的大型 PDF

    问题 我有一个 35mb 的 PDF 文件 共 130 页 我需要将其放到网上 以便人们每周可以打印其中的不同部分 我现在在 Amazon S3 上托管 PDF 文件 并被告知用户不喜欢在选择要打印的页面之前等待整个文件下载 我想我必须发挥
  • WPF:如何禁用选项卡导航而不同时禁用箭头键导航?

    我已经设定IsTabStop在我的窗口中的所有控件上设置为 false 这样当我按 Tab 键时 焦点不会移动 我需要 Tab 键来执行其他操作 但是这样做会破坏箭头键导航 我单击 a 中的一个项目ListView然后按向上 向下不会再更改
  • Git 贡献未显示在 GitHub 上

    我浏览了你的以下文章https help github com articles why are my contributions not showing up on my profile 因为贡献没有显示在我的个人资料上 至少可以说 我正
  • Java List 到 Map 转换

    我想转换一个Map
  • 为 C++ 库制作 Objective-C 包装器

    我正在尝试用 Objective C 制作一个包装器 这样我就不必在库类之外编写 C 了 库的主文件是LLAHProcessor h cpp 我的包装是LLAHProcessorWrapper h mm 它编译得很好 但是当我添加LLAHP
  • html/templates - 用
    替换换行符

    我正在加载一个包含换行符的文本文件 并将其传递给html templates 替换为 n with br 在加载的字符串中 它们被模板转义为 html lt br gt 并显示在浏览器中 而不是导致行返回 我怎样才能改变这种行为而不切换到t
  • Placeholder_2:0 既被馈送又被提取

    当我运行这段代码时 x tf placeholder tf int32 shape None 3 with tf Session as sess feed dict dict feed dict x np array 1 2 3 4 5 6
  • 如何将 GestureDetector 附加到 ListPreference?

    附加一个的挑战手势检测器 to a 列表首选项是 2 倍 获取仅在preferences xml中定义的ListPreference的句柄 即未在Java代码中实例化 ListPreference 既不是 View 也不是 Activity
  • GLFW3 - 对 XRR 的未定义引用

    我正在尝试编译一个非常简单的OpenGL程序使用 GLFW3 尽管链接了我认为必要的所有内容 但我还是收到了大量未定义的引用 usr local lib libglfw3 a x11 gamma c o In function glfwIn
  • 使用虚拟继承的地址未对齐

    以下明显有效的代码使用 UndefinedBehaviorSanitizer 清理程序产生未对齐的地址运行时错误 include
  • TSQL:FOR XML PATH('') 无法分组

    我正在尝试使用特定列对列值进行分组FOR XML PATH 在 TSQL 中 这是两种情况的结果 请注意 没有 XML 代码 即 SELECT FROM xml 与 XML 代码相同 Class Animals Asteroidea Sta
  • 如何获取用户的交互式输入并在输入时能够使用箭头键?

    当我执行 raw input 并输入值时 我无法使用箭头键来更改内容 有什么方法可以做到这一点吗 感谢 readline 模块有助于行编辑功能 如何使用readline模块 只需导入 readline 模块即可 尝试加载 readline
  • 如何在QScrollArea中隐藏滚动条?

    如何隐藏滚动条QScrollArea 目前我使用的是hide 返回的滚动条上的方法QScrollArea horizontalScrollBar and QScrollArea verticalScrollBar 但为滚动条保留的空间仍然存
  • 错误 MSB3147:找不到所需的文件“setup.bin”发布到本地失败

    在网上搜索并讨论这个问题之后在这里聊天 我终于对一个旧错误提出了一个新问题 我在 Windows 10 上使用 Visual Studio Enterprise 2015 有关此问题的问题和答案来自 2011 年MSBuild 错误 MSB
  • Spark 多类分类示例

    你们知道在哪里可以找到 Spark 中多类分类的示例吗 我花了很多时间在书籍和网络上搜索 到目前为止我只知道根据文档的最新版本这是可能的 ML Spark 2 0 推荐使用 我们将使用与下面 MLlib 中相同的数据 有两个基本选项 如果E