Spark 2.0 机器学习实践:Iris 数据分类

之前尝试使用Spark MLlib 做机器学习,发现不是非常方便,也可能是在使用习惯上面不太适应(相对 python sklearn).

今天尝试使用Spark MLlib 针对Iris数据做一次实践,之后会尝试写一个包装类,将这些步骤简化。

 

0. 数据准备:

原始的数据以及相应的说明可以到[这里] 下载。 我在这基础之上,增加了header信息。 下载:https://pan.baidu.com/s/1c2d0hpA

如果是可以直接从NFS或者HDFS之类的文件服务里面读csv,会比较方便, 参考下面的python代码:

在我的环境之中,如果你跟我一样只能从本地读取,就比较麻烦了。 可以参考下面的Java代码:

 

df.show() 的结果如下所示:

 

1. 使用StringIndexer将字符型的label变成index

这就是Spark第一个不太方便的地方:不能直接处理String类型的label

处理完成之后,show的结果如下:

如果需要将Index变回来,那么需要用到IndexToString:

 

2. 数据模型的创建与验证

在Spark的机器学习之中,有一个很容易让初学者混淆的问题:ml跟mllib有什么区别

简单的说:

  • spark.mllib中的算法接口是基于RDDs的
  • spark.ml中的算法接口是基于DataFrames / Dataset 的

但是根据作者自己的经验,如果你处理的是CSV格式的数据,除非你现行转换成Libsvm的格式,否则后期处理非常非常的麻烦。具体的处理方式将在后续的文章之中尝试,敬请关注。

 

尝试使用RDD的方式(mllib)进行分类

使用RDD-based API, 核心就是整合出一个LabeledPoint.

当你整合出这个LabeledPoint RDD之后,就直接copy官网代码即可。

就不在这里贴代码了。 比如,如果你采用的是RandomForest, 可以请参考:https://spark.apache.org/docs/2.0.2/mllib-ensembles.html#random-forests

比如在喂给RandomForest的时候,我们需要设置好几个参数:

  1. numClasses
    需要提前设置好有那几个类
  2. numTrees
    有几棵树。
  3. categoricalFeaturesInfo
    每一个feature有几个类别?
  4. featureSubsetStrategy
    auto: 默认参数。让算法自己决定,每颗树使用几条数据
  5. impurity / maxDepth / maxBins / seed

 

3.  检查预测结果

官网使用的是比较简单粗暴的比较方式:

这样确实能看到结果,但是如果想查看比如classification_report等等,Spark自带的类能提供一些比较方便的东西。

 

在之前官网的基础之上,需要修改predictionAndLabel的数据类型:

有两个要注意的地方:

  1. 类型需要是Object, 之前的Double不行
  2. 从之前的JavaPairRDD 变成 JavaRDD<Tuple2>

 

做好这个准备之后,我们就可以调用Metrics相关的工具类了:

一些简单实用的Sample:

 

 

至此,一个基本的流程算是走通了,但是我们可以看到,在这整个过程之中有一些很不方便的事情:

  1. 读取本地的CSV非常不方便
  2. 不支持String类型的label,需要使用StringIndexer
    即使读取原始数据是数值类型,也需要使用StringIndexer, 因为除非使用spark-csv并且设置了inferSchema=true, 否则也自动被认为是String类型的值
  3. 在使用RandomForest的时候,好几个参数需要设置
    我感觉有的是应该可以自动设置的。比如:numClasses 、 categoricalFeaturesInfo
  4. 在最后检查结果的时候,比较麻烦:
    1. 需要自己选择是multi-class or binary-class.
    2. 混淆矩阵缺少label
    3. 缺少类似sklearn.classification_report 那种简单明了的report

 

后面会陆续针对这些问题,做一些wrapper

 

本文为原创文章,转载请注明出处
原文链接:http://www.flyml.net/2017/01/09/spark-2-0-ml-practice-iris-test/

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注