Spark机器学习实例

标签: 算法  python  机器学习  大数据  java

2020/07/09 -

引言

《Learning Spark》过程中只是简单介绍了mllib中的东西,没有一个完整的实践过程,暂时还没有去找有没有专门做这种的书,好像我看《spark in action》是有这部分内容,后续在看。本篇文章就利用这个鸢尾花的数据集来简单说明一下spark机器学习的过程,只是简单打下一个轮廓,然后记录使用过程中遇到的问题以及解决方案。
在本文中,主要使用新版面向DataFrame的机器学习接口ml,有时候也会涉及老版借口mllib。

简单总结

这部分代码不算麻烦,但是主要存在一下几个问题。

  1. 没有看到交叉验证的东西,数据集的划分也是自己来划分的(是不是有接口?)
  2. 中间提到了LabeledPoint在ml中没有找到,是不是说有更好的处理办法,就是面向df的方式
  3. spark的算法没有办法处理字符串性质的东西?如果是某个特征是字符串,那我转换成向量,里面是数值的,这样不就他会使用回归的方式来使用数据吗?
  4. 注意,这里的整个流程都是我自己来弄的, 最开始是参考文章[1],然后适配了自己的场景;但是可以看出,他最后使用的评估方式是spark自带的,我当时使用了一下,感觉有点费劲,就采用了sklearn的方式。

主要流程

列举一下机器学习的主要流程,这个算是老生长谈了,对于无需解释的部分,直接就在这里插入代码了。

  1. 加载数据,使用DataFrame的方式
    这里数据已经被加载到了hdfs的相应路径
iris_data = spark.read.options(inferschema='true').csv("/VChao/mllib_test/iris.data")
iris_data.printSchema()
数据类型
  1. 预处理
    这里的预处理不是针对数据内容的预处理,将数据格式转化为spark能够处理的。
  2. 选择算法
    这里算法选择随机森林。
  3. 学习过程,性能评估
    这部分的接口跟sklearn这种还不太一样,需要稍微调整。

预处理部分

(这里按照书《Learning Spark》上的说法,输入的变量应该是LabeledPoint形式,但是我看ml中没有这个东西,我才是不是他改变了一些处理方式,这里先不管,还是使用之前的方式)
预处理部分需要将DataFrame格式的数据转化为vector形式,首先要处理的就是,数据的类别是字符串,但LabeledPoint的label必须是浮点型,所以只能进行转换,其实,我感觉是不是这里不太对啊,按说机器学习的算法应该支持这种形式,还是说,sklearn只是帮我把这个工作给做了。

from pyspark.ml.feature import StringIndexer

class_label = StringIndexer(inputCol="_c4", outputCol="class")
index_model = class_label.fit(iris_data)
iris_data = index_model.transform(iris_data)
iris_data = iris_data.drop("_c4").cache()

此时的iris_data其中的类别已经是浮点类型的数据了,可以后续转化为LabelPointed形式。

转化为LabeledPoint

from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.linalg import Vectors

data = iris_data.rdd.map(lambda row: LabeledPoint(row[-1], Vectors.dense(row[:-1])))

切分数据

train_ratio = 0.8
splits =[train_ratio, 1 - train_ratio]
train_data,test_data = data.randomSplit(splits)

选择算法并训练

from pyspark.mllib.tree import RandomForest
rf_model =RandomForest.trainClassifier(train_data,numClasses=3,numTrees=10, \
                                       categoricalFeaturesInfo={},featureSubsetStrategy='auto',impurity="gini")

从这里可以看出,直接就是一个训练过程,是不是我没有选对?

测试数据

predictions = rf_model.predict(test_data.map(lambda x:x.features))

import numpy as np
pre = predictions.collect()
np_pre = np.array(pre)
labels = test_data.map(lambda x:x.label).collect()
np_labels = np.array(labels)

利用sklearn来显示性能

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

print confusion_matrix(np_labels, np_pre)
print classification_report(np_labels, np_pre,target_names=index_model.labels)
性能结果

整体代码已经上传至githubspark-machine-learning

参考文章

Spark实战:基于Spark的随机森林分类算法分析

版权声明:本文为u011698800原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011698800/article/details/107607272

智能推荐

26_Python基础_继承

面向对象三大特性: 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用, 相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,  产生不同的执行结果,  增加代码的灵活度 1.  单继承 1.1 概念 继承的概念:&...

循环

与任何程序设计语言一样Java利用条件语句与循环结构确定流程控制,一下总结一下Java中的循环语句: while do while for switch 对于golang来说: switch非常灵活。从第一个expr为true的case开始执行,如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的expr,如果之后的case都有fallthrough,d...

1638 统计只差一个字符的子串数目(动态规划)

1. 问题描述: 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。比方说, "computer" 和 "computation"...

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

猜你喜欢

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...