楼主: 时光永痕
743 0

[数据挖掘新闻] 在10分钟内实用Apache Spark。第4部分-MLlib [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

56%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在10分钟内实用Apache Spark。第4部分-MLlib
人工智能的巨大可能性在现代信息技术领域中越来越引起人们的兴趣。机器学习(ML)是其最有前途和不断发展的方向之一,它已成为我们生活各个方面的重要组成部分。ML已在自然语言处理,面部识别,自动驾驶,欺诈检测,机器视觉和许多其他领域中找到成功的应用程序。
机器学习利用数学算法,可以以类似于人脑的方式解决特定任务。根据神经网络训练方法的不同,机器学习算法可以分为有监督的(带有标记的数据),无监督的(带有无标记的数据),半监督的(在数据集中既有标记的数据也有无标记的数据)和强化(基于报酬的获得) )学习。解决最基本和最受欢迎的ML任务(例如分类和回归)主要基于监督学习算法。在各种现有的ML工具中,Spark MLlib是一个流行且易于启动的库,它可以训练神经网络来解决上述问题。
在本文中,我们将考虑分类任务。我们将根据鸢尾植物的萼片和花瓣的大小将其分为3类。此处提供具有虹膜分类的公共数据集。要继续前进,请将文件bezdekIris.data下载到工作文件夹中。
重要! 确保此文件将保存到Spark文件夹。文件夹名称将为spark-2.3.0-bin-hadoop2.7(取决于您下载的Spark版本)。
可以实现不同的ML算法来解决此任务。但是,由于我们需要多类分类,因此我们选择了以下三种机器学习算法:
决策树分类器
随机森林分类器
朴素贝叶斯
载入资料
在启动pyspark之前,您需要安装numpy模块:
点安装numpy
现在,您可以通过执行以下命令来启动pyspark:
./bin/pyspark
MLlib的主要API是基于DataFrame的。因此,我们需要将数据加载为数据框。它实际上是一个逗号分隔的文件,因此我们可以将其作为常规的csv加载。
df = spark.read.csv(“ bezdekIris.data”,inferSchema = True)\。toDF(“ sep_len”,“ sep_wid”,“ pet_len”,“ pet_wid”,“ label”)
获得的DataFrame如下所示:
df.show(5)
+ ------- + ------- + ------- + ------- + ----------- + | sep_len | sep_wid | pet_len | pet_wid | 标签| + ------- + ------- + ------- + ------- + ----------- +
| 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
| 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
| 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
| 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
| 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
+ ------- + ------- + ------- + ------- + ----------- +
仅显示前5行
我们必须执行一些转换,才能使用VectorAssembler将所有要素列连接到单个列中。为此,首先我们应该再进口两个:
从pyspark.ml.linalg导入矢量从pyspark.ml.feature导入VectorAssembler
要将4个要素列转换为具有要素向量的一列,请执行:
vector_assembler = VectorAssembler(\ inputCols = [“ sep_len”,“ sep_wid”,“ pet_len”,“ pet_wid”],\ outputCol =“功能”)
df_temp = vector_assembler.transform(df)
df_temp.show(3)
+ ------- + ------- + ------- + ------- + ----------- + ----- ------------ + | sep_len | sep_wid | pet_len | pet_wid | 标签| 功能| + ------- + ------- + ------- + ------- + ----------- + --- -------------- +
| 5.1 | 3.5 | 1.4 | 0.2 | set-Iris || [5.1
| 4.9 | 3.0 | 1.4 | 0.2 | set-Iris || [4.9
| 4.7 | 3.2 | 1.3 | 0.2 | set-Iris || [4.7
+ ------- + ------- + ------- + ------- + ----------- + ----- ------------ +
仅显示前三行
让我们删除不必要的列:
df = df_temp.drop('sep_len','sep_wid','pet_len','pet_wid')df.show(3)
+ ----------- + ----------------- + | 标签| 功能| + ----------- + ----------------- +
|鸢尾花| [5.1
|鸢尾花| [4.9
|鸢尾花| [4.7
+ ----------- + ----------------- +
仅显示前3行
至此,我们有了一个数据框,其中包含所有必要数据的适当格式。现在,我们应该为标签建立索引,即在StringIndexer的帮助下将文本表示形式转换为数字形式。为此,请执行以下命令:
从pyspark.ml.feature导入StringIndexerl_indexer = StringIndexer(inputCol =“ label”,outputCol =“ labelIndex”)df = l_indexer.fit(df).transform(df)
结果,我们又有了一个名为labelIndex的列:
df.show(3)
+ ----------- + ----------------- + ---------- + | 标签| 功能|标签索引| + ----------- + ----------------- + ---------- +
|鸢尾花| [5.1
|鸢尾花| [4.9
|鸢尾花| [4.7
+ ----------- + ----------------- + ---------- +
仅显示前3行
标签索引后,我们应该将数据分为训练集和测试集(保留30%用于测试):
(trainingData,testData)= df.randomSplit([0.7,0.3])
现在我们可以将其应用于本文开头选择的数据机器学习算法。让我们从决策树分类器开始。
决策树分类器
决策树分类器是机器学习中用于分类和回归任务的广泛使用且便捷的算法之一。
要开始使用此算法,我们需要进行一些新的导入:
从pyspark.ml.classification中导入DecisionTreeClassifier从pyspark.ml.evaluation中导入MulticlassClassificationEvaluator
导入后,我们将使用以下命令来训练DecisionTree模型:
dt = DecisionTreeClassifier(labelCol =“ labelIndex”,featuresCol =“ features”)模型= dt.fit(trainingData)
最后,我们可以使用训练有素的模型做出一些预测:
预测= model.transform(testData)
要查看结果,执行以下命令:
projections.select(“ prediction”,“ labelIndex”)。show(5)
+ ---------- + ---------- + |预测|标签索引| + ---------- + ---------- +
| 0.0 | 0.0 |
| 0.0 | 0.0 |
| 0.0 | 0.0 |
| 0.0 | 0.0 |
| 0.0 | 0.0 |
+ ---------- + ---------- +
仅显示前5行
为了估计预测的准确性,应该计算测试误差:
评估者= MulticlassClassificationEvaluator(\ labelCol =“ labelIndex”,projectionCol =“ prediction”,\ metricName =“ accuracy”)
精度= evaluator.evaluate(预测)
打印(“测试错误=%g”%(1.0-精度))
测试错误= 0.0392157
请注意,该数字可能会有所不同,并且您会看到不同的值,因为数据是随机拆分的。
现在我们可以打印一个小模型摘要:
打印(型号)
具有15个节点的深度5的DecisionTreeClassificationModel(uid = DecisionTreeClassifier_4924b7bce7df8343300e)
考虑了决策树分类模型后,可以得出结论,该模型做出了相当不错的预测。但是有一些基于决策树集成的算法更强大。其中之一是随机森林分类器。
随机森林分类器
决策树集成是用于分类任务的最受欢迎的算法之一。由于许多决策树的组合,随机森林分类器的过拟合风险较低。用于ML的基于DataFrame的API支持二进制和多类分类的随机森林。对于此算法,我们将使用与前一种情况相同的训练和测试数据。
从pyspark.ml.classification导入RandomForestClassifier
要训??练RandomForest模型,请执行以下命令:
rf = RandomForestClassifier(labelCol =“ labelIndex”,\ featuresCol =“ features”,numTrees = 10)模型= rf.fit(trainingData)
现在我们可以做出预测:
预测= model.transform(testData)
接下来,让我们看一下结果:
projections.select(“ prediction”,“ labelIndex”)。show(5)
+ ---------- + ---------- + |预测|标签索引| + ---------- + ---------- +
| 0.0 | 0.0 |
| 0.0 | 0.0 |
| 0.0 | 0.0 |
| 0.0 | 0.0 |
| 0.0 | 0.0 |
+ ---------- + ---------- +
仅显示前5行
现在,让我们通过计算测试误差来评估模型:
评估者= \ MulticlassClassificationEvaluator(labelCol =“ labelIndex”,\ predictionCol =“ prediction”,metricName =“ accuracy”)
精度= evaluator.evaluate(预测)
打印(“测试错误=%g”%(1.0-精度))
测试误差= 0.0196078
同样,号码可能会因其他用户而异。
并获取有关我们模型的一些信息:
打印(型号)
具有10棵树的RandomForestClassificationModel(uid = RandomForestClassifier_4eb29128b895e4d43d40)
如您所见,与决策树分类器相比,随机森林分类器可提供更准确的预测,而测试错误则减少2%。
朴素贝叶斯分类器
朴素贝叶斯分类器是最直接的多类分类算法之一,可以假设每对特征之间具有独立性,可以将其应用于多类分类任务。可以非常有效地对其进行培训。对于此算法,我们将使用与先前模型中相同的先前准备好的数据帧,但是我们将通过以下方式更改训练数据和测试数据之间的划分:
splits = df.randomSplit([0.6,0.4],1234)train = splits [0] test = splits [1]
现在我们可以导入NaiveBayes分类器并将其应用于我们的数据:
从pyspark.ml.classification导入NaiveBayesnb = NaiveBayes(labelCol =“ labelIndex”,\ featuresCol =“ features”,平滑= 1.0,\
modelType =“ multinomial”)
model = nb.fit(train)
要查看结果,请键入以下命令:
预测= model.transform(test)predictions.select(“ label”,“ labelIndex”,“概率”,“ prediction”)。show()
+ ------------------- + -------------- + -------------- ------------------ + -------------- + | 标签| labelIndex | 概率| 预测| + ------------------- + -------------- + ------------ -------------------- + -------------- +
| 鸢尾 2.0 | [0.13580212423762 ... | 2.0 |
| 鸢尾 2.0 | [0.17379314485086 ... | 2.0 |
| 鸢尾 2.0 | [0.17053629662469 ... | 2.0 |
| 鸢尾 2.0 | [0.14979468282946 ... | 2.0 |
| 鸢尾花| 2.0 | [0.27662546955194 ... | 2.0 |
| 鸢尾 2.0 | [0.15442195982198 ... | 2.0 |
| 鸢尾 2.0 | [0.22394913687574 ... | 2.0 |
| 鸢尾 2.0 | [0.12142905494265 ... | 2.0 |
| 鸢尾花| 2.0 | [0.21423626616978 ... | 2.0 |
| 鸢尾 2.0 | [0.20785600972126 ... | 2.0 |
| 鸢尾 2.0 | [0.15715991262556 ... | 2.0 |
| 鸢尾 2.0 | [0.15529802083444 ... | 2.0 |
| 鸢尾 2.0 | [0.19200947285222 ... | 2.0 |
| 鸢尾 2.0 | [0.21992593184552 ... | 2.0 |
| 鸢尾 2.0 | [0.16282845430368 ... | 2.0 |
| 鸢尾花| 2.0 | [0.19419596740610 ... | 2.0 |
| 鸢尾花| 2.0 | [0.17520043624921 ... | 2.0 |
| 鸢尾 2.0 | [0.26091120212901 ... | 2.0 |
| 鸢尾花| 0.0 | [0.49866824004739 ... | 0.0 |
| 鸢尾花| 0.0 | [0.50526788954798 ... | 0.0 |
+ ------------------ + --------------- + -------------- ------------------ + -------------- +
仅显示前20行
为了评估该分类器,让我们计算测试集的准确性:
评估者= \ MulticlassClassificationEvaluator(labelCol =“ labelIndex”,\ predictionCol =“ prediction”,metricName =“ accuracy”)
精度= evaluator.evaluate(预测)
print(“测试设置精度=” + str(精度))
测试仪精度= 0.9259259259259259
同样,结果可能会不时变化。
如我们所见,朴素贝叶斯分类器给出的结果可与其他方法媲美,但准确性较低。
结论
机器学习算法已广泛应用于我们生活的许多领域,例如图像识别,自然语言处理,欺诈检测等。机器学习算法实现的工具很多,其中Apache Spark是最受欢迎的工具之一。它具有一个特殊的MLib库,该库实现了一些机器学习方法。在这篇文章中,我们考虑了数据准备的主要阶段,以供MLib库进一步使用。将三种不同的ML算法应用于公开的Iris分类数据集,可以得出结论,所有这些算法均具有良好的准确性(超过90%)。但是有必要说,随机森林分类器提供了大约98%的最佳准确性。这可能是由于该算法结合了许多决策树以降低过度拟合的风险。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Apache Spark apache Spark Mllib Park

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 14:10