技术好文:Spark机器学习笔记一

简介: 技术好文:Spark机器学习笔记一

Spark机器学习库现支持两种接口的API:RDD-based和DataFrame-based,Spark官方网站上说,RDD-based APIs在2.0后进入维护//代码效果参考:http://hnjlyzjd.com/xl/wz_25104.html

模式,主要的机器学习API是spark-ml包中的DataFrame-based API,并将在3.0后完全移除RDD-based API。

在学习了两周Spark MLlib后,准备转向DataFrame-based接口。由于现有的文档资料均是RDD-based接口,于是便去看了看Spark MLlib的源码。DataFrame-based API 包含在org.apache.spark.ml包中,其中主要的类结构如下:


咱先看一个线性回归的例子examples/ml/LinearRegressionExample.scala,其首先定义了一个LinearRegression的对象:


val lir = new LinearRegression()


.setFeaturesCol("features")


.setLabelCol("label")


.setRegParam(params.regParam)


.setElasticNetParam(params.elasticNetParam)


.setMaxIter(params.maxIter)


.setTol(params.tol)


然后,调用fit方法训练数据,得到一个训练好的模型lirModel,它是一个LinearRegressionModel类的对象。


val lirModel = lir.fit(training)


现在,我们大概可以理清MLlib机器学习的流程,和很多单机机器学习库一样,先定义一个模型并设置好参数,然后训练数据,最后返回一个训练好了的模型。


我们现在在源码中去查看LinearRegression和LinearRegressionModel,其类的依赖关系如下:


LinearRegression是一个Predictor,LinearRegressionModel是一个Model,那么Predictor是学习算法,Model是训练得到的模型。除此之外,还有一类继承自Params的类,这是一个表示参数的类。Predictor 和Model 共享一套参数。


现在用Spark MLlib来完成第一个机器学习例子,数据是我之前放在txt文件里的回归数据,一共550多万条,共13列,第一列是Label,后面是Features。分别演示两种接口,先用旧的接口:


1.读取原始数据:


scala> import org.apache.spark.mllib.linalg.


import org.apache.spark.mllib.linalg.


scala

import org.apache.spark.mllib.regression._


scala

raw_data: org.apache.spark.rdd.RDD【String】 = data/my/y_x.txt MapPartitionsRDD【1】 at textFile at :30


2.转换格式,RDD-based接口以LabeledPoint为输入数据的格式:


scala> val data = rawdata.map{ line =>


| val arr = line.split(' ').map(.toDouble)


| val label = arr.head


| val features = Vectors.dense(arr.tail)| LabeledPoint(label,features)


| }


data: org.apache.spark.rdd.RDD【org.apache.spark.mllib.regression.LabeledPoint】 = MapPartitionsRDD【2】 at map at :32


3.划分train、test数据集:


scala> val splits = data.randomSplit(Array(0.8, 0.2))


splits: Array【org.apache.spark.rdd.RDD【org.apache.spark.mllib.regression.LabeledPoint】】 = Array(MapPartitionsRDD【3】 at randomSplit at :34, MapPartitionsRDD【4】 at randomSplit at :34)


scala

train_set: org.apache.spark.rdd.RDD【org.apache.spark.mllib.regression.LabeledPoint】 = MapPartitionsRDD【3】 at randomSplit at :34


scala

test_set: org.apache.spark.rdd.RDD【org.apache.spark.mllib.regression.LabeledPoint】 = MapPartitionsRDD【4】 at randomSplit at :34


4.使用LinearRegressionWithSGD.train训练模型:


scala> val lr = LinearRegressionWithSGD.train(train_set,100,0.0001)


warning: there was one deprecation warning; re-run with -deprecation for details


16/08/26 09:20:44 WARN Executor: 1 block locks were not released by TID = 0:


【rdd_3_0】


lr: org.apache.spark.mllib.regression.LinearRegressionModel = org.apache.spark.mllib.regression.LinearRegressionModel: intercept = 0.0, numFeatures = 12


5.模型评估:


scala> val pred_labels = test_set.map(lp => (lp.label, lr.predict(lp.features)))


predlabels: org.apache.spark.rdd.RDD【(Double, Double)】 = MapPartitionsRDD【17】 at map at :42


scala math.pow(p-v,2)}.mean


mse: Double = 0.05104150735910074


再用新的接口:


1.读取原始数据:


scala> import org.apache.spark.ml.linalg.


import org.apache.spark.ml.linalg.


scala</span] import org.apache.spark.ml.regression.


import org.apache.spark.ml.regression.


scala</span] import org.apache.spark.sql.


import org.apache.spark.sql._


scala

raw_data: org.apache.spark.sql.DataFrame = 【value: string】


2.转换数据


scala> val data = rawdata.rdd.map { case Row(line:String) =>


| val arr = line.split(' ').map(.toDouble)


| val label = arr.head


| val features = Vectors.dense(arr.tail)


| (label,features)


| }


data: org.apache.spark.rdd.RDD【(Double, org.apache.spark.ml.linalg.Vector)】 = MapPartitionsRDD【4】 at map at :34


3.划分数据集


scala> val splits = data.randomSplit(Array(0.8, 0.2))


splits: Array【org.apache.spark.rdd.RDD【(Double, org.apache.spark.ml.linalg.Vector)】】 = Array(MapPartitionsRDD【5】 at randomSplit at :36, MapPartitionsRDD【6】 at randomSplit at :36)


scala

train_set: org.apache.spark.sql.Dataset【(Double, org.apache.spark.ml.linalg.Vector)】 = 【_1: double, _2: vector】


scala

test_set: org.apache.spark.sql.Dataset【(Double, org.apache.spark.ml.linalg.Vector)】 = 【_1: double, _2: vector】


4.创建LinearRegression对象,并设置模型参数。这里设置类LabelCol和FeaturesCol列,默认为“label”和“features”,而我们的数据是"_1"和”_2“。


scala> val lir = new LinearRegression


lir: org.apache.spark.ml.regression.LinearRegression = linReg_c4e70a01bcd3


scala

res0: org.apache.spark.ml.regression.LinearRegression = linReg_c4e70a01bcd3


scala

res1: org.apache.spark.ml.regression.LinearRegression = linReg_c4e70a01bcd3


5.训练模型


val model = lir.fit(train_set)


16/08/26 09:45:16 WARN Executor: 1 block locks were not released by TID = 0:


【rdd_9_0】


16/08/26 09:45:16 WARN WeightedLeastSquares: regParam is zero, which might cause numerical instability and overfitting.


model: org.apache.spark.ml.regression.LinearRegressionModel = linReg_c4e70a01bcd3


6.模型评估


scala> val res = model.transform(test_set)


res: org.apache.spark.sql.DataFrame = 【_1: double, 2: vector ... 1 more field】


scala</span] import org.apache.spark.ml.evaluation.


import //代码效果参考:http://hnjlyzjd.com/xl/wz_25102.html

org.apache.spark.ml.evaluation._

scala

eva: org.apache.spark.ml.evaluation.RegressionEvaluator = regEval_8fc6cce63aa9


scala

res6: eva.type = regEval_8fc6cce63aa9


scala

res7: eva.type = regEval_8fc6cce63aa9


scala

res8: Double = 0.027933653533088666

相关文章
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与机器学习:探索未来的技术边界
【10月更文挑战第18天】 在这篇文章中,我们将深入探讨人工智能(AI)和机器学习(ML)的基础知识、应用领域以及未来趋势。通过对比分析,我们将揭示这些技术如何改变我们的生活和工作方式,并预测它们在未来可能带来的影响。文章旨在为读者提供一个全面而深入的理解,帮助他们更好地把握这一领域的发展趋势。
|
27天前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
66 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
29天前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
2月前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
73 6
|
2月前
|
机器学习/深度学习 搜索推荐 算法
在数字化时代,推荐系统成为互联网应用的重要组成部分,通过机器学习技术根据用户兴趣和行为提供个性化推荐,提升用户体验
在数字化时代,推荐系统成为互联网应用的重要组成部分,通过机器学习技术根据用户兴趣和行为提供个性化推荐,提升用户体验。本文探讨了推荐系统的基本原理、常用算法、实现步骤及Python应用,介绍了如何克服数据稀疏性、冷启动等问题,强调了合理选择算法和持续优化的重要性。
81 4
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
探索机器学习中的自然语言处理技术
【10月更文挑战第38天】在本文中,我们将深入探讨自然语言处理(NLP)技术及其在机器学习领域的应用。通过浅显易懂的语言和生动的比喻,我们将揭示NLP技术的奥秘,包括其工作原理、主要任务以及面临的挑战。此外,我们还将分享一些实用的代码示例,帮助您更好地理解和掌握这一技术。无论您是初学者还是有经验的开发者,相信您都能从本文中获得宝贵的知识和启示。
46 3
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
133 11
|
2月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
145 2
|
2月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
117 1
|
2月前
|
机器学习/深度学习 数据可视化 算法
机器学习中的特征选择与降维技术
机器学习中的特征选择与降维技术
93 0