Spark MLlib学习(二)——分类和回归

2023-05-16

MLlib支持多种分类方法,如二分类、多分类和回归分析等。

问题类型 支持的方法
二分类 线性SVM, 逻辑回归,决策树,随机森林,GBDT,朴素贝叶斯
多分类 决策树,随机森林,朴素贝叶斯
回归 线性最小二乘法,Lasso, 岭回归,决策树,随机森林,GBDT,保序回归

1、线性模型

  • 分类(SVMs,逻辑回归)
  • 线性回归(最小二乘法、Lasso,岭回归)
    (1)分类
    Mlib提供两种分类方法:逻辑回归和线性支持向量机SVM。SVM只支持二分类,而逻辑回归既支持二分类又支持多分类。训练集数据用RDD[LabeledPoint]表示,label是分类的索引,从0开始。

  • 线性支持向量机SNMs

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.util.MLUtils

val data = MLUtils.loadLibSVMFile(sc, "file:///home/hdfs/data_mllib/sample_libsvm_data.txt")
val splits = data.randomSplit(Array(0.6,0.4),seed = 11L)
val training = splits(0).cache()
val test = splits(1)

val numIterations = 100
val model = SVMWithSGD.train(training,numIterations)
model.clearThreshold()

val scoreAndLabels = test.map{point =>
    val score = model.predict(point.features)
    (score,point.label)
}
scoreAndLabels.take(5)

val metrics = new BinaryClassificationMetrics(scoreAndLabels)
val auROC = metrics.areaUnderROC()
println("Area under ROC = " + auROC)

model.save(sc, "myModelPath")    //save and load model
val sameModel = SVMModel.load(sc, "myModelPath")
  • 逻辑回归 Logistic regression

L-BFGS支持二分逻辑回归和多项式逻辑回归,SGD只支持二分逻辑回归。L-BFGS不支持L1正则化,SGD版本支持L1正则化。当L1不是必须时,推荐使用L-BFGS版本,它通过拟牛顿近似Heaaian矩阵收敛的更快更准。

import org.apache.spark.SparkContext
import org.apache.spark.mllib.classification.{LogisticRegressionWithLBFGS, LogisticRegressionModel}
import org.apache.spark.mllib.evaluation.MulticlassMetrics
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils

val data = MLUtils.loadLibSVMFile(sc, "file:///home/hdfs/data_mllib/sample_libsvm_data.txt")

val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0).cache()
val test = splits(1)

val model = new LogisticRegressionWithLBFGS().setNumClasses(10).run(training)

val predictionAndLabels = test.map { case LabeledPoint(label, features) =>
  val prediction = model.predict(features)
  (prediction, label)
}  

val metrics = new MulticlassMetrics(predictionAndLabels)
val precision = metrics.precision 
println("precision = "+ precision)

model.save(sc, "myModelPath")
val sameModel = LogisticRegressionModel.load(sc, "myModelPath")

(2)回归

import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.regression.LinearRegressionModel
import org.apache.spark.mllib.regression.LinearRegressionWithSGD
import org.apache.spark.mllib.linalg.Vectors

val data = sc.textFile("file:///home/hdfs/data_mllib/lpsa.data")
val parsedData = data.map{ line =>
    val parts = line.split(',')
    LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(' ').map(_.toDouble)))
}.cache()

val numIterations = 100
val stepSize = 0.00000001
val model = LinearRegressionWithSGD.train(parsedData, numIterations, stepSize)

val valuesAndPreds = parsedData.map{point =>
    val prediction = model.predict(point.features)
    (point.label,prediction)
}

val MSE = valuesAndPreds.map{case(v, p) => math.pow((v - p), 2)}.mean()
println("training Mean Squared Error = " + MSE)

model.save(sc, "myModelPath")
val sameModel = LinearRegressionModel.load(sc, "myModelPath")

2、决策树
贪婪算法,递归地对特征空间做分裂处理。MLlib支持使用决策树做二分类、多分类和回归,技能处理连续特征又能使用类别特征。MLlib为分类提供了两种不纯度衡量方法(gini不纯度和熵),为回归提供了一种不纯度衡量方法(方差)。
ps:使用信息增益的算法有ID3、C4.5。ID3使用的是信息增益,在分裂时可倾向于属性较多的节点;C4.5是ID3的改进版,使用的是信息增益率,另外还基于信息增益对连续特征进行离散化处理。CART使用gini不纯度进行度量。
随机森林和迭代决策树的集成树算法在分类回归中使用率也较高。

(1)分类

import org.apache.spark.mllib.tree.DecisionTree
import org.apache.spark.mllib.tree.model.DecisionTreeModel
import org.apache.spark.mllib.util.MLUtils

val data = MLUtils.loadLibSVMFile(sc,"file:///home/hdfs/data_mllib/sample_libsvm_data.txt")
val splits = data.randomSplit(Array(0.7,0.3))
val (trainData,testData) = (splits(0),splits(1))

val numClasses = 2
val categoricalFeaturesInfo = Map[Int, Int]()
val impurity = "gini"
val maxDepth = 5
val maxBins = 32

val model = DecisionTree.trainClassifier(trainData,numClasses,categoricalFeaturesInfo,impurity,maxDepth,maxBins)

val labelAndPreds = testData.map { point =>
    val prediction = model.predict(point.features)
    (point.label,prediction)
}

val testErr = labelAndPreds.filter(r => r._1 != r._2).count().toDouble /testData.count()
println("Test Error =" + testErr)
println("Learned classification tree model:\n" + model.toDebugString)

model.save(sc, "target/tmp/myDecisionTreeClassificationModel")
val sameModel = DecisionTreeModel.load(sc, "target/tmp/myDecisionTreeClassificationModel")

(2)回归
不纯度度量不同

val categoricalFeaturesInfo = Map[Int, Int]()
val impurity = "variance"
val maxDepth = 5
val maxBins = 32

val model = DecisionTree.trainRegressor(trainData, categoricalFeaturesInfo, impurity,
  maxDepth, maxBins)

val labelsAndPredictions = testData.map { point =>
  val prediction = model.predict(point.features)
  (point.label, prediction)
}
val testMSE = labelsAndPredictions.map{ case (v, p) => math.pow(v - p, 2) }.mean()
println("Test Mean Squared Error = " + testMSE)

3、树的集成

随机森林与GBTs对比:
- GBTS一次只训练一颗树,训练时间大于随机森林,随机森林可并行地训练多颗树。 GBTs训练较浅的树,花费的时间也少。
- 随机森林不易过拟合,训练更多的树减少了过拟合的可能性,GBTs中训练过多的树会增加过拟合的可能性。(随机森林通过多棵树减少variance方差,GBTs通过多棵树减少bias偏置)。
- 随机森林易调优,效果会随着数数量的增加单调提升。

(1)随机森林

两个主要可调节参数:

- numTrees:森林中树的数量。增加数量可减少预测的方差,提升模型测试的准确率。
- maxDepth:森林中每棵树的最大深度。增加深度可提升模型的表达能力,但是过大会导致过拟合。通常,随机森林可设置比单棵树更大的深度。
-
两个一般不需要调整的参数,但是调整可以加速训练过程:
- subsamplingRate:
这个参数指定了森林中每棵树训练的数据的大小,它是当前数据集大小占总数据大小的比例。推荐默认值1.0,减小这个值可以提升训练速度。
- featureSubsetStrategy:
每棵树中使用的特征数量。这个参数可用小数比例的形式指定,也可以是总特征数量的函数。减少这个值会加速训练,但是如果太小会影响效果。
(2)GBTs
MLlib支持GBTs作二分类和回归,能够处理连续和类别变量。目前不支持多分类,对于多分类可以采用决策树和随机森林。

  • 分类
import org.apache.spark.mllib.tree.GradientBoostedTrees
import org.apache.spark.mllib.tree.configuration.BoostingStrategy
import org.apache.spark.mllib.tree.model.GradientBoostedTreesModel
import org.apache.spark.mllib.util.MLUtils

val data = MLUtils.loadLibSVMFile(sc,"file:///home/hdfs/data_mllib/sample_libsvm_data.txt")
val splits = data.randomSplit(Array(0.7,0.3))
val (trainData,testData) = (splits(0),splits(1))

val boostingStrategy = BoostingStrategy.defaultParams("Classification")
boostingStrategy.numIterations = 3
boostingStrategy.treeStrategy.numClasses = 2
boostingStrategy.treeStrategy.maxDepth = 5
boostingStrategy.treeStrategy.categoricalFeaturesInfo = Map[Int,Int]()

val model = GradientBoostedTrees.train(trainData,boostingStrategy)

val labelAndPreds = testData.map { point =>
  val prediction = model.predict(point.features)
  (point.label, prediction)
}

val testErr = labelAndPreds.filter(r => r._1 != r._2).count.toDouble / testData.count()
println("Test Error = " + testErr)
println("Learned classification GBT model:\n" + model.toDebugString)
  • 回归(变化不大)
val boostingStrategy = BoostingStrategy.defaultParams("Regression")
boostingStrategy.numIterations = 3
boostingStrategy.treeStrategy.maxDepth = 5
boostingStrategy.treeStrategy.categoricalFeaturesInfo = Map[Int,Int]()

val model = GradientBoostedTrees.train(trainData,boostingStrategy)

val labelsAndPredictions = testData.map { point =>
  val prediction = model.predict(point.features)
  (point.label, prediction)
}
val testMSE = labelsAndPredictions.map{ case(v, p) => math.pow((v - p), 2)}.mean()
println("Test Mean Squared Error = " + testMSE)
println("Learned regression GBT model:\n" + model.toDebugString)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark MLlib学习(二)——分类和回归 的相关文章

随机推荐

  • SwiftUI 如何动态条件显示和隐藏 Toolbar 按钮且不做无谓刷新

    功能需求 在 SwiftUI 中我们可以非常容易的定制导航栏 Toolbar 中按钮的显示 包括折叠 分组和按条件动态显示和隐藏等 如上图所示 我们仅用寥寥几行代码就实现了 SwiftUI 导航栏 Toolbar 按钮的折叠 分组和按条件动
  • SwiftUI 极简实现文本摆动弹性动画

    概览 SwiftUI 为我们来了界面设计和调试上的便利 xff0c 只需几行代码我们就能实现一个不错的文本动画效果 xff1a 如上图所示 xff0c 我们在 SwiftUI 中基本还没发力 xff0c 就实现了文本摆动弹性动画 这究竟是怎
  • 美团后端笔试2022.08.13

    文章目录 昨天刚刚笔试结束 xff0c 然后今天抽空给大家整理一下 xff0c 然后简单说一下思路 整场笔试下来 xff0c 整体难度一般 xff0c 只不过在第三题扑克牌游戏的时候进行的不是很顺利 xff0c 附加题难度一般 xff0c
  • SwiftUI 如何让文本自动支持查找和替换功能?

    概览 有些情况下 xff0c 我们需要为文本编辑器实现文本的查找和替换功能 xff08 find amp replace xff09 xff0c 如果完全靠自已撸码还是比较棘手的 所幸的是 xff0c 从 SwiftUI 4 0 xff08
  • SwiftUI 新 Alert 弹出窗口圆你文本输入之梦

    概览 小伙伴们都知道 xff0c 弹出 Alert 不能包含文本输入框是 SwiftUI 的阿喀琉斯之踵 Achilles Heel 当然 xff0c 这说的有些夸张了 x1f609 不过 xff0c Alert 不能包含 TextFiel
  • SwiftUI 4.0 新 LabeledContent 视图帮您解决所有对齐烦恼

    概览 在用 SwiftUI Form 设计 App 界面时 xff0c 最头疼的就是内部视图对齐的问题了 好不容易适配了 iOS 中的布局 xff0c 到了 iPadOS 或 MacOS 上却变得一团糟 有没有一劳永逸 xff0c 简单方便
  • Xcode 使用 Instruments 无法找到代码中耗时挂起操作的解决

    问题现象 Instruments 是一套非常有用的代码分析和调试利器 我们经常用它来查找 App 中的性能瓶颈 不过 有时 Instruments 却无法捕获到系统明显挂起或长耗时的方法 这是怎么回事呢 如上图所示 App 运行中系统 Se
  • 用 DISM 命令备份与还原 Windows 系统

    一 初始备份 xff08 例如 xff1a 把 C 分区的系统备份到 D 分区的 Win8BF 文件夹中 xff0c 备份文件名为 Win8Pro wim xff09 xff1a Dism Capture Image ImageFile D
  • Unresolved reference: viewModels,viewModels()方法找不到

    遇到的问题 最近在学习LiveData和ViewModel xff0c 跟着官网敲 xff0c 碰到了以下情况 span class token keyword private span span class token keyword v
  • 天干地支计算

    年的干支 方法一 xff1a 首先要能记住十大天干和十二地支 xff0c 十天干 xff1a 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 xff1b 十二地支 xff1a 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 xff1b 天干地支纪年
  • 程序员们,AI来了,机会来了,危机也来了

    程序员们 xff0c AI来了 xff0c 机会来了 xff0c 危机也来了 1 人工智能真的来了 纵观古今 xff0c 很少有计算机技术能有较长的发展寿命 xff0c 大部分昙花一现 xff0c 比如 xff1a 昔日的DOS windo
  • 统信UOS 20 1050 记录一次openssl升级失败的排查过程

    目录 不能找到openssl最新版本的原因 fedora有相关module的介绍 一些yum module 常用的命令 xff1a 查看yum module 都有哪些 启用禁用module 总结 xff1a 后记 xff1a 通过yum l
  • iOS之富文本

    之前做项目时遇到一个问题 xff1a 使用UITextView显示一段电影的简介 xff0c 由于字数比较多 xff0c 所以字体设置的很小 xff0c 行间距和段间距也很小 xff0c 一大段文字挤在一起看起来很别扭 xff0c 想要把行
  • JetBrains IntelliJ IDEA 2022.2 使用 Java 17 运行时

    JetBrains 发布 了 IntelliJ IDEA 2022 2 xff0c 支持 Java 17 和最新的语言和框架 xff0c 如 Scala Kotlin Spring 6 和 Spring Boot 3 这个新版本使用了 Je
  • Linux生产者消费者模型实现

    转载请注明出处 xff1a https blog csdn net mymottoissh article details 84181224 任何语言提及到多线程同步都离不开生产者 消费者模型 这也是针对许多现实问题建模用到的基础模型 这一
  • 使用CMD启动JAR后,出现定时器不执行问题

    SpringBoot项目中 使用了 64 Scheduled注解开启一个定时任务 在windows系统启动时 开始输出正常 当执行到输出控制台日志时 有时候会直接卡住线程不执行了 查了一圈发现是CMD的快速编辑引起的线程阻塞 解决办法 1
  • Flink开发中遇到的问题及解法

    1 当Source是Kafka的时候 xff0c 如何设置Source Operator的并发度 xff1f 如果没有指定 xff0c Source Operator的个数与集群中的TaskManager的个数相等 如果手动设置 xff0c
  • vue初学者代码格式报错

    报错内容 xff1a Do not use built in or reserved HTML elements as component id header
  • Ubuntu 设置su密码

    在使用su命令获取超级权限的时候提示输入密码 xff0c 在安装ubuntu的时候只设置了用户密码 xff0c 没记得有其他密码 这里需要给root用户重新设置密码 xff1a sudo passwd 然后输入密码即可
  • Spark MLlib学习(二)——分类和回归

    MLlib支持多种分类方法 xff0c 如二分类 多分类和回归分析等 问题类型 支持的方法 二分类 线性SVM 逻辑回归 xff0c 决策树 xff0c 随机森林 xff0c GBDT xff0c 朴素贝叶斯 多分类 决策树 xff0c 随