文章目录

  • 第1关:Iris 分类
    • 任务描述
    • 相关知识
      • 1:观察数据集
      • 2:RFormula 特征提取
      • 3:pandas 的 concat 函数
    • 编程要求
  • 代码实现
  • ————————————————————————————————————————
  • 第2关:图片识别 - 坦克类型分类
    • 任务描述
    • 相关知识
      • 1:数据集介绍
      • 2:加载图片数据集
      • 3:将一维数组转换成 Spark 中的向量
      • 4:将向量与标签进行绑定并将其转换成Dataframe
      • 5:Spark 加载数据集
      • 6:将数据集拆分训练集和测试集
      • 7:创建LR分类器
      • 8:训练模型
    • 编程要求
    • 测试说明
  • 代码实现

第1关:Iris 分类

任务描述

本关任务:使用 pyspark ml 的LogisticRegression分类器完成 Iris 分类任务。

相关知识

1:观察数据集

我们本次使用的数据集是sklearn自带的数据集Iris。

接下来,我们来了解下Iris数据集的数据吧!

示例代码:

iris = load_iris()
features = pandas.DataFrame(iris.data, columns=iris.feature_names)
target = pandas.DataFrame(iris.target, columns=['label'])
print(features.head())
print(target.head())

打印结果:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                5.1               3.5                1.4               0.2
1                4.9               3.0                1.4               0.2
2                4.7               3.2                1.3               0.2
3                4.6               3.1                1.5               0.2
4                5.0               3.6                1.4               0.2label
0      0
1      0
2      0
3      0
4      0

简单来说明下数据集,我们第一个打印输出的结果集是Iris的特征,第二个打印输出的结果集是Iris的标签,也就是说我们接下来就是通过这些特征来训练模型,再通过模型预期一些没有标签的特征数据的标签。

2:RFormula 特征提取

RFormula 借鉴了 R 语言的 R model formula 进行特征选择。

RFormula 仅支持部分 R 操作,包括:

  1. ~ 分隔因变量(LHS 左侧)和自变量(RHS 右侧);
  2. + 合并变量,+0 意为移除截距;
  3. - 移除变量,-1 意为移除截距;
  4. : 变量相交,(数字型值相乘,类别型值二值化);
  5. . 除了因变量的所有变量。

上面的介绍是否有点抽象?

接下来,我们看下面的例子进行案例讲解吧!

假设有一个4列的dataframe:

id country hour clicked
7 “US” 18 1.0
8 “CA” 12 0.0
9 “NZ” 15 0.0

如果使用RFormula,并且构建公式: clicked ~ country + hour,它表示通过country,hour这两个特征去预测clicked这个因变量。于是我们会得到以下dataframe:

id country hour clicked features label
7 “US” 18 1.0 [0.0, 0.0, 18.0] 1.0
8 “CA” 12 0.0 [0.0, 1.0, 12.0] 0.0
9 “NZ” 15 0.0 [1.0, 0.0, 15.0] 0.0

features列为转换后的特征表示,因为country是字符串类型的类编变量,故进行one-hot编码变成了两列, hour是数值型的,故转换成double类型。label列是因变量click列,双精度的类型保持不变。

示例:

from pyspark.sql import SparkSession
from pyspark.ml.feature import RFormula
if __name__ == '__main__':spark = SparkSession.builder.appName("demo").master("local[*]").getOrCreate()df = spark.createDataFrame(((7, "US", 18, 1.0),(8, "CA", 12, 0.0),(9, "NZ", 15, 0.0))).toDF("id", "country", "hour", "clicked")df.show()formula = RFormula(formula="clicked ~ country + hour")formula.fit(df).transform(df).show()

打印结果:

+---+-------+----+-------+--------------+-----+
|id |country|hour|clicked|feature       |label|
+---+-------+----+-------+--------------+-----+
|7  |US     |18  |1.0    |[0.0,0.0,18.0]|1.0  |
|8  |CA     |12  |0.0    |[1.0,0.0,12.0]|0.0  |
|9  |NZ     |15  |0.0    |[0.0,1.0,15.0]|0.0  |
+---+-------+----+-------+--------------+-----+
+--------------+-----+
|feature       |label|
+--------------+-----+
|[0.0,0.0,18.0]|1.0  |
|[1.0,0.0,12.0]|0.0  |
|[0.0,1.0,15.0]|0.0  |
+--------------+-----+

3:pandas 的 concat 函数

concat 函数是在pandas的方法,可以将数据根据不同的轴作简单的融合。

源码:

def concat(objs,axis = 0,join = "outer",join_axes = None,ignore_index = False,keys = None,levels = None,names = None,verify_integrity = False,sort = None,copy = True,
):# 省略

常用参数:

objs: series,dataframe 或者是 panel 构成的序列 lsit ;
axis: 需要合并链接的轴,0是行,1是列 ;
join:连接的方式 inner,或者 outer。

示例:

import pandas
df1 = pandas.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df2 = pandas.DataFrame([["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]])
df3 = pandas.concat([df1, df2], axis=1)
print(df3.head())
df4 = pandas.concat([df1, df2], axis=0)
print(df4.head())

打印结果:

   0  1  2  0  1  2
0  1  2  3  A  B  C
1  4  5  6  D  E  F
2  7  8  9  G  H  I0  1  2
0  1  2  3
1  4  5  6
2  7  8  9
0  A  B  C
1  D  E  F

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,实现Iris 种类分类的模型训练,具体需求如下:

1:利用pandas将原始数组转换成DataFrame矩阵;

2:利用concat将特征与目标矩阵按行连接;

3:利用SparkSession将本地的pandas.DataFrame上传到Spark集群中,变成了Spark中的分布式DataFrame;

4:利用RFormula将DataFrame中属于特征的列提取到features字段中,将目标提取到labal字段;

5:将数据随机切分成8:2的训练集与测试集;

6:利用spark的逻辑回归分类器进行分布式训练fit;

7:然后返回元组,元组构造为(模型、测试集)。

代码实现

————————————————————————————————————————

# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession
from sklearn.datasets import load_iris
import pandas
from pyspark.ml.classification import LogisticRegression
from pyspark.mllib.evaluation import BinaryClassificationMetrics
from pyspark.ml.feature import RFormula# 训练模型
def trainingModel(spark):# ********** Begin ********** ## 1.加载sklearn的训练数据iris = load_iris()# 2.特征矩阵features = pandas.DataFrame(iris.data, columns = iris.feature_names)# 3.目标矩阵targets = pandas.DataFrame(iris.target, columns = ['Species'])# 4.合并矩阵merged = pandas.concat([features, targets], axis = 1)# 5.创建spark DataFrameraw_df = spark.createDataFrame(merged)# 6.提取特征与目标fomula = RFormula(formula = 'Species ~ .')raw_df = fomula.fit(raw_df).transform(raw_df)# 7.拆分训练集和测试集train_df, test_df = raw_df.randomSplit([0.8, 0.2])# 8.创建LR分类器lr = LogisticRegression(family = "multinomial")# 9.训练model = lr.fit(train_df)# 10.返回(模型、测试集)return (model, test_df)# ********** End ********** #

第2关:图片识别 - 坦克类型分类

任务描述

本关任务:使用 pyspark ml 的LogisticRegression分类器完成 坦克类型分类任务。

相关知识

1:数据集介绍

三种坦克图片数据集,如下图所示:


以上有三种数据集,分别是以bmp-2开头的BMP-2步兵战车的图片、以btr-70开头的BTR-70装甲输送车的图片、以t-72开头的T-72主战坦克的图片。

2:加载图片数据集

我们可以使用opencv_python计算机视觉库来读取一幅图像。

在读取图像之前,我们需要对图像的构造有一定的理解,怎么理解呢?

简单来说图像就是一个矩阵,在OpenCV for Python中,图像就是NumPy中的数组!

我们知道图像就是一个矩阵了,之后我们通过代码来读取呢?

示例:

读入图像文件,返回numpy数组

img = cv2.imread('/root/1.jpg', cv2.IMREAD_GRAYSCALE)
rows, columns = img.shape

将二维数组转一维数组

img = img.reshape(rows*columns)

3:将一维数组转换成 Spark 中的向量

上一步我们将图片转换成一维的数组之后了,接下来我们将一维数组转换成 Spark 中的向量。

可能你会有疑问?为什么要将一维数组转换成 Spark 中的向量呢?

简单来说就是类型不匹配了。

示例:

import cv2
img = cv2.imread("testing2\\bmp-2-1.jpg", cv2.IMREAD_GRAYSCALE)
rows, columns = img.shape
img = img.reshape(rows * columns)
print(type(img))

结果如下:

<class 'numpy.ndarray'>

我们都知道numpy.ndarray是Python中的类型,Spark是由Scala编写的,它怎么可能识别的了numpy.ndarray类型呢?

那我们怎么将将一维数组转换成 Spark 中的向量呢?

很简单,直接使用from pyspark.ml.linalg import Vectors中的Vectors来进行转换即可!

在pyspark中,有两种向量,分别是稠密向量和稀疏向量。

DenseVector :稠密向量 其创建方式 Vector.dense(数据)

SparseVector :稀疏向量 其创建方式有两种:

方法一:Vector.sparse(向量长度,索引数组,与索引数组所对应的数值数组)

方法二:Vector.sparse(向量长度,(索引,数值),(索引,数值),(索引,数值),…(索引,数值))

比如向量(1,0,3,4)的创建有三种方法:

稠密向量:直接Vectors.dense(1,0,3,4)

稀疏向量:

方法一:Vector.sparse(4,(0,2,3),(1,3,4))

表示该向量的第0个,第2个,第3个位置,(1,3,4) 表示(0,2,3)位置对应的数值分别为1,3,4

方法二:Vector.sparse(4,(0,1),(2,3),(3,4))

(0,1)就是(索引,数值)的形式。位置0的数值为1, 位置2的数值为3,位置3的数值为4。

一般我们会直接将数组转换成稠密向量。

4:将向量与标签进行绑定并将其转换成Dataframe

上面的两步,我们已经加载了图片数据并将其转换成Spark中的向量了,但是这样还远远不够,为什么呢?

因为我将图片数据转换成向量之后,这样只能得出该图片的特征,但是我们还没有指定特征的标签。

我们回到最初加载图片数据那步,这里我们在读取图片数据的同时获取图片的文件名,我们通过文件名进行打标签,具体要求如下:

如果文件名包含 btr-70 ,label 设置为 0 ;

如果文件名包含 t-72 ,label 设置为 1;

其他的,label 设置为 2。

我们得到标签之后,我们将特征向量与该标签进行绑定,构建一个元组。

构建元组之后,我们使用pandas将元组数据加载成Dataframe并将特征向量列的列名设置为features,标签的列的列名设置为label。

为什么要这样做呢?

我们查看下LogisticRegression算法的源码

构造函数源码如下:

@keyword_onlydef __init__(self, featuresCol="features", labelCol="label", predictionCol="prediction",maxIter=100, regParam=0.0, elasticNetParam=0.0, tol=1e-6, fitIntercept=True,threshold=0.5, thresholds=None, probabilityCol="probability",rawPredictionCol="rawPrediction", standardization=True, weightCol=None,aggregationDepth=2, family="auto",lowerBoundsOnCoefficients=None, upperBoundsOnCoefficients=None,lowerBoundsOnIntercepts=None, upperBoundsOnIntercepts=None):super(LogisticRegression, self).__init__()self._java_obj = self._new_java_obj("org.apache.spark.ml.classification.LogisticRegression", self.uid)self._setDefault(maxIter=100, regParam=0.0, tol=1E-6, threshold=0.5, family="auto")kwargs = self._input_kwargsself.setParams(**kwargs)self._checkThresholdConsistency()

通过__init__函数中的参数,我们可以看到featuresCol的默认值为features,labelCol的默认值为label。

通过pandas构建了 Dataframe之后指定了列名这样做的话,就可以不用设置featuresCol、labelCol了,同时增强了代码可读性。

5:Spark 加载数据集

上面我们已经把数据集处理完毕之后,然后我们可以通过Spark来加载数据集。

spark = SparkSession.builder.master("local[*]").appName("demo").getOrCreate()
sparkDF = spark.createDataFrame(df) # df是我们通过pandas构建的Dataframe

6:将数据集拆分训练集和测试集

上面我们把图片数据集加载到Spark中了,之后我们要把数据集划分成两部分,一部分为训练集,另一部分为测试集。

简单来说,训练集就是用来训练模型的,测试集就是来评测这样模型的好与坏的。

关于训练集与测试集的比例问题,一般来说训练集越多越好,我们一般将训练集与测试集的比例调整为8:2或者7:3。

train_df, test_df = sparkDF.randomSplit([0.7, 0.3])

7:创建LR分类器

逻辑回归是一种用于预测分类响应的流行方法。这是广义线性模型的一种特殊情况,可以预测结果的可能性。在spark.ml逻辑回归中,可以通过使用二项式逻辑回归来预测二进制结果,或者在使用多项式逻辑回归时可以将其预测为多类结果。使用该family 参数在这两种算法之间进行选择,或者将其保留为未设置状态,Spark会推断出正确的变体。

通过将family参数设置为“多项式”,可以将多项式逻辑回归用于二进制分类。它将产生两组系数和两个截距。

当对具有恒定非零列的数据集进行LogisticRegressionModel拟合而没有截距时,Spark MLlib为恒定非零列输出零系数。

创建LR分类器用来训练模型:

lr = LogisticRegression(family="multinomial")

8:训练模型

上一步,我们已经把LR分类器构建好了并且我们把数据集划分成训练集与测试集了,接下来我们就是训练模型了。

model = lr.fit(train_df)

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,实现坦克种类分类的模型训练,具体需求如下:

1:补全 get_file_path函数,完成遍历目录获取图片路径列表功能;

2:补全img2vector函数,完成提取图片特征并将其转换成向量功能;

3:补全trainingModel函数,完成模型的训练,最后返回一个元组,元组构造为(测试集,模型)

测试说明

代码实现

平台会使用利用 Spark 的一个Metrics库对你训练的模型进行统计模型得分,如果模型的AUC值符合预期值,则通关。

import cv2
import os
import pandas as pd
from pyspark.mllib.evaluation import BinaryClassificationMetrics
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression, NaiveBayes, LinearSVC
from pyspark.ml.regression import LinearRegression# 获取目录的所有文件,返回图片路径列表
def get_file_path(root_path):# ********** Begin ********** #file_list = []dir_or_files = os.listdir(root_path)for dir_file in dir_or_files:dir_file_path = os.path.join(root_path, dir_file)file_list.append(dir_file_path)return file_list# ********** End ********** ## 提取图片特征并将其转换成向量,返回特征向量
def img2vector(imgfilename):# ********** Begin ********** #img = cv2.imread(imgfilename, cv2.IMREAD_GRAYSCALE)rows, columns = img.shapeimg = img.reshape(rows * columns)return Vectors.dense(img)# ********** End ********** ## 训练模型,返回元组(测试集,模型)
def trainingModel(spark,root_path):datas = []# ********** Begin ********** ## 1. 获取 root_path 下的所有图片文件fileList = get_file_path(root_path)# 2.1 遍历图片文件列表,根据文件名给数据打标签"""如果文件名包含 `btr-70` ,label 设置为 0 如果文件名包含 `t-72` ,label 设置为 1其他的,label 设置为 2"""# 2.2 调用img2vector函数,提取图片特征并将其转换成向量# 2.3 将向量与标签(label)构建成元组并存储到 datas 列表中for x in fileList:vector = img2vector(x)if "btr-70" in x:label = 0elif "t-72" in x:label = 1else:label = 2datas.append((vector, label))# 3. 利用 pandas 将 datas 转换成 DataFrame 并将包含向量的列的列名设置为 features,包含标签(label) 的列的列名设置为 labeldf = pd.DataFrame(datas, columns=['features', 'label'])# 4. 使用 spark 加载 pandas 转换后的数据集 sparkDF = spark.createDataFrame(df)# 5. 将数据集拆分训练集和测试集train_df, test_df = sparkDF.randomSplit([0.7, 0.3])# 6. 创建LR分类器lr = LogisticRegression(family="multinomial")# 7. 训练模型model = lr.fit(train_df)# 8.返回元组(测试集,模型)return (test_df,model)# ********** End ********** #

军用大数据 - Spark机器学习相关推荐

  1. 大数据Spark超经典视频链接全集

    论坛贴吧等信息发布参考模板 Scala.Spark史上最全面.最详细.最彻底的一整套视频全集(特别是机器学习.Spark Core解密.Spark性能优化.Spark面试宝典.Spark项目案例等). ...

  2. 2016年大数据Spark“蘑菇云”行动代码学习之AdClickedStreamingStats模块分析

    2016年大数据Spark"蘑菇云"行动代码学习之AdClickedStreamingStats模块分析     系统背景:用户使用终端设备(IPAD.手机.浏览器)等登录系统,系 ...

  3. 财务大数据比赛有python吗-Python大数据与机器学习之NumPy初体验

    本文是Python大数据与机器学习系列文章中的第6篇,将介绍学习Python大数据与机器学习所必须的NumPy库. 通过本文系列文章您将能够学到的知识如下: 应用Python进行大数据与机器学习 应用 ...

  4. 大数据与机器学习算法相关的电子书分享

    大数据与机器学习算法相关的电子书分享 近日,偶然看到一个帖子,上面有一些常用的机器学习常用的电子书下载路径,遂复制到这里,分享给大家,希望可以有你需要的- @ 欢迎关注微信公众号:算法全栈之路心智探奇 ...

  5. 大数据|Spark技术在京东智能供应链预测的应用案例深度剖析(一)

    大数据|Spark技术在京东智能供应链预测的应用案例深度剖析(一) 2017-03-27 11:58  浏览次数:148 1. 背景 前段时间京东公开了面向第二个十二年的战略规划,表示京东将全面走向技 ...

  6. 小草说----大数据和机器学习为什么这样火

    小草说--大数据和机器学习为什么这样火 标签(空格分隔): SPARK机器学习 欢迎关注小小草的微信号:大数据机器学习.日后不定期分享大数据,机器学习的学习资料与博文,希望与大家共同学习进步~ 很多年 ...

  7. 大数据Spark实战视频教程-张长志-专题视频课程

    大数据Spark实战视频教程-33364人已学习 课程介绍         大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装.Spark表配置.平台搭建.快学Scala入门.Sp ...

  8. 上海联通大数据与机器学习驱动的离网预测模型

    发表于2015-07-10 07:16|3049次阅读| 来源<程序员>电子刊|6 条评论| 作者沈可 刘志刚 姚健 袁明轩 曾嘉 大数据机器学习特征工程分类器离网预测模型上海联通 摘要: ...

  9. 大数据Spark企业级实战 PDF 下载 和目录

    大数据Spark企业级实战  PDF完整版 下载地址 http://download.csdn.net/detail/laoge/9504794 基本信息 书名:大数据Spark企业级实战 定价:12 ...

最新文章

  1. 如何入门生信Linux
  2. Java中Thread中的实例方法_Java多线程2:Thread中的实例方法
  3. sysbench压测Oracle
  4. C# 反射与dynamic最佳组合
  5. python解析xml文件elementtree_Python中使用ElementTree解析XML示例
  6. sklearn朴素贝叶斯分类器_python机器学习:方法链和朴素贝叶斯分类器
  7. office 转 pdf文件
  8. tree 树 搜索关键字
  9. 挣值最常用的计算公式
  10. 09年国内外免费杀毒软件大收罗
  11. Node学习 | Day04 数据库与身份验证(数据库的基本概念、安装并配置MySQL、MySQL的基本使用、在项目中操作MySQL、前后端的身份验证)
  12. 电磁场与电磁波-2-泊松方程、拉普拉斯方程的推导
  13. 网络协会评出十大流氓软件,3721位列榜首
  14. 正则表达式叠字,过滤重复字
  15. 【分治算法】大整数乘法
  16. XILINX FPGA OV5640 摄像头驱动(一)
  17. 定义一个类,并且在测试类中使用
  18. 股票证券名词解释汇总
  19. 机器人驻场富士康,流水线青年的自救
  20. 1、snaker笔记

热门文章

  1. Levenberg-Marquardt(列文伯格-马夸尔特)算法
  2. 猿创征文 | 基于Driveworksxpress的同步轮参数化设计
  3. 软件测试面试话术有哪些?一文告诉你,面试时该怎么做
  4. [ZT]:自己动手提高ubuntu性能
  5. 生信人的linux考试 题解
  6. 【业余无线电】Python程序模拟CW电报发报与译码(包含英文和中文,方便练习发报节奏和听音解码)
  7. AidLux智慧交通实战-车辆检测AI对抗攻防算法实现
  8. Neural Network and Deep Learning-Week1
  9. 《精彩绝伦的CSS》——提示(二)无单位的行高值
  10. 小型云台机械手的制作