Spark----管道的概念与例子
来源:互联网 发布:网络诈骗的危害性 编辑:程序博客网 时间:2024/05/29 20:00
一、管道的概念
学习来源:Spark官网对管道的描述
1、管道的几个基本概念:
(1)DataFrame:其实就是DataSet的集合,可以理解为,dataset为某张表里面的一行,那么行的集合就是一张表,所以dataFrame就是一张表,但是表的field比较丰富,可以有向量,在很多算法里面,向量的使用是必不可少的;
(2)Transformer:作用就是将DataFrame A 变成 DataFrame B,可以是增加一列或者是少了某些数据等的操作;
(3)Estimator:利用算法将DataFrame进行训练,得到模型的操作;
(4)Pipeline:包含一系列的有序的Transformer和Estimator 操作的工作流。
2、管道工作的流程
管道工作的流程由两个过程来组成,下面以文本分类处理的管道工作流程为例子,
(1)形成预测模型
如下图:蓝色为Transformer,红色为Estimator;
第一行,解释了文本分类在管道里的三个状态的转换。先经过Tokenizer 进行Transform,将得到的dataframe送入下一个操作进行hashingTF进行Transform,最终将输出的dataframe送到下个阶段来产生期望的预测算法
第二行,以数据流的角度解释了第一行。Tokenizer的Transform操作,其实就是将文本中的每一行变成我们想要的单词而已,接着hashingTF的Transform操作其实就是给每个单词赋予独一无二的特征向量,最后利用算法结合数据得到我们想要的预测模型。
(2)利用预测模型
如下图,蓝色为Transformer,红色为Estimator;
在管道的上一个阶段我们已经得到预测模型了,下一个阶段的目标自然是进行预言。
第一行,同样解释了管道的状态转换。对进来的文本进行转换的过程。
第二行,以数据流的角度解释。待检查的数据进来之后同样被转换成向量送进了模型中预测,最终生成dataframe。
需要注意的是,上面的例子是基于线性的状态,若是非线性的,还需要改天再研究下。
3、个人肤浅的问题
1、什么时候用到管道,因为从上面的解释来说,管道是比算法更上一层的抽象,平时直接用ml package和mllib package下的算法已经很方便了。我学习管道的原因是因为,在学习K-Means算法,ALS算法,TF-IDF算法,Word2Vec的时候没有发现demo用了管道,但是开始学Ramdom forest 的时候出现了管道。
2、怎么用管道
二、例子
随机森林的例子如下:
import org.apache.spark.ml.Pipeline;import org.apache.spark.ml.PipelineModel;import org.apache.spark.ml.PipelineStage;import org.apache.spark.ml.classification.RandomForestClassificationModel;import org.apache.spark.ml.classification.RandomForestClassifier;import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator;import org.apache.spark.ml.feature.*;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;// Load and parse the data file, converting it to a DataFrame.Dataset<Row> data = spark.read().format("libsvm").load("data/mllib/sample_libsvm_data.txt");// Index labels, adding metadata to the label column.// Fit on whole dataset to include all labels in index.StringIndexerModel labelIndexer = new StringIndexer() .setInputCol("label") .setOutputCol("indexedLabel") .fit(data);// Automatically identify categorical features, and index them.// Set maxCategories so features with > 4 distinct values are treated as continuous.VectorIndexerModel featureIndexer = new VectorIndexer() .setInputCol("features") .setOutputCol("indexedFeatures") .setMaxCategories(4) .fit(data);// Split the data into training and test sets (30% held out for testing)Dataset<Row>[] splits = data.randomSplit(new double[] {0.7, 0.3});Dataset<Row> trainingData = splits[0];Dataset<Row> testData = splits[1];// Train a RandomForest model.RandomForestClassifier rf = new RandomForestClassifier() .setLabelCol("indexedLabel") .setFeaturesCol("indexedFeatures");// Convert indexed labels back to original labels.IndexToString labelConverter = new IndexToString() .setInputCol("prediction") .setOutputCol("predictedLabel") .setLabels(labelIndexer.labels());// Chain indexers and forest in a PipelinePipeline pipeline = new Pipeline() .setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});// Train model. This also runs the indexers.PipelineModel model = pipeline.fit(trainingData);// Make predictions.Dataset<Row> predictions = model.transform(testData);// Select example rows to display.predictions.select("predictedLabel", "label", "features").show(5);// Select (prediction, true label) and compute test errorMulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator() .setLabelCol("indexedLabel") .setPredictionCol("prediction") .setMetricName("accuracy");double accuracy = evaluator.evaluate(predictions);System.out.println("Test Error = " + (1.0 - accuracy));RandomForestClassificationModel rfModel = (RandomForestClassificationModel)(model.stages()[2]);System.out.println("Learned classification forest model:\n" + rfModel.toDebugString());
使用ml工具时,数据会先经过清洗和转换,对于分类来说,将实验数据转化成 libsvm数据能极大的方便开发,因为格式本身已经固定好了。下面是关于libsvm的相关:
LIBSVM使用的数据格式
该软件使用的训练数据和检验数据文件格式如下:
- Spark----管道的概念与例子
- 无名管道和有名管道的概念与实现
- 管道的概念
- MongoDB 管道的概念
- popen 使用例子 c与sh,管道的结合使用
- Spark的核心概念
- 一个管道的应用例子
- 管道流的简单例子
- Spark SQL的例子
- Spark SQL的例子
- RabbitMQ 概念与Java例子
- 一个例子与InnoDB索引的几个概念
- 管道例子
- 管道例子
- Powershell一些概念的理解:管道符
- Spark的概念和特征
- Spark的WorkCount的例子
- 命名管道的一个简单例子
- 1、jmeter配置(Error: Unable to access jarfile ApacheJMeter.jar)
- Spring学习(6)--Spring中bean的生命周期
- JavaWeb基础--ContentType
- 软件测试的定义
- Eclipse利用Maven的插件部署web项目到远程tomcat服务器
- Spark----管道的概念与例子
- java菜鸟学习日记2 class文件检验器
- creating server tcp listening socket 127.0.0.1:6379: bind No error
- Python学习笔记(0):开发环境配置
- shell 中 if判断语句
- awk使用
- Windows程序设计:矩形
- Mybatis知识点总结
- 20171211