热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hadoop基础学习三十四(mllib、机器学习、文本分类、分词器)

文章目录一、机器学习机器学习的过程二、代码演示1.向量2.libsvm3.模型评估4.imagetrain5.module三、分词器一、机器学习Mllib:(machinelea


文章目录

  • 一、机器学习
    • 机器学习的过程
  • 二、代码演示
    • 1.向量
    • 2.libsvm
    • 3.模型评估
    • 4.imagetrain
    • 5.module
  • 三、分词器


一、机器学习


  • Mllib:(machine learning library ) 是 Spark 的机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模
  • MLlib 由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道 API。
  • MLlib 由 4 部分组成:数据类型,数学统计计算库,算法评测和机器学习算法。
    在这里插入图片描述

机器学习的过程

原始数据=》数据特征工程(训练数据和测试数据)=》模型=》模型评估=》判断模型是否合格=》模型应用
在这里插入图片描述


二、代码演示


1.向量


  • Spark mlib的本地向量有两种:
    DenseVctor :稠密向量 其创建方式 Vector.dense(数据)
    SparseVector :稀疏向量 其创建方式有两种:
    • 方法一:Vector.sparse(向量长度,索引数组,与索引数组所对应的数值数组)
    • Vector.sparse(向量长度,(索引,数值),(索引,数值),(索引,数值),…(索引,数值)

加入依赖

<dependency><groupId>org.apache.spark</groupId><artifactId>spark-mllib_2.11</artifactId><version>2.4.5</version></dependency>

在这里插入图片描述

package com.mllib
import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.linalg
import org.apache.spark.ml.linalg.Vectorsobject Demo1_Vector {def main(args: Array[String]): Unit &#61; {/*** 稠密向量* 主要用于保存数据特征&#xff0c;*///代表一行数据的特征val vector: linalg.Vector &#61; Vectors.dense(Array(0.0,0.1,0.2,0.3,0.0,0.4,0.0))println(vector)/*** 稀疏向量* 如果数据中0比较多&#xff0c;可以节省资源,前面表示索引为几的地方后面表示对应的值*/val vector1: linalg.Vector &#61; Vectors.sparse(11, Array(1, 2, 5, 9), Array(0.1, 0.2, 0.2, 0.2))println(vector1)/*** 可以通过to相互转换*/println("转为稀疏向量"&#43;vector.toSparse)println("转为稠密向量"&#43;vector1.toDense)/*** labeledPoint:代表一条特征训练集* 由 y 和多个x 组成* 前面为标签&#xff0c;后面为该特征向量*/val pos: LabeledPoint &#61; LabeledPoint(1.0,Vectors.dense(0.0,2.0,0.0,0.3,0.4))println(pos)}}

在这里插入图片描述


2.libsvm


  • libsvm用于训练数据和检验数据

  • 训练和测试数据的格式必须相同&#xff0c;测试数据中的目标值是为了计算误差用
    在这里插入图片描述
    在这里插入图片描述

  • label 目标值&#xff0c;就是说class&#xff08;属于哪一类&#xff09;&#xff0c;就是你要分类的种类&#xff0c;通常是一些整数。

  • index 是有顺序的索引&#xff0c;通常是连续的整数。就是指特征编号&#xff0c;必须按照升序排列

  • value 就是特征值&#xff0c;用来train的数据&#xff0c;通常是一堆实数组成

读取libsvm数据

package com.mllibimport org.apache.spark.sql.{DataFrame, SparkSession}object Demo2_libsvm {def main(args: Array[String]): Unit &#61; {val spark&#61;SparkSession.builder().master("local").appName("libsvm").config("spark.sql.shuffle.partitions",2).getOrCreate()val df: DataFrame &#61;spark.read.format("libsvm").load("spark/data/人体指标.txt")//默认如果列太长&#xff0c;会不展示全部&#xff0c;设置为false可以展示全部df.show(false)}}

在这里插入图片描述


3.模型评估

package com.mllib
import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}/*** 机器学习过程* 1 特征工程* 2 将数据切分成训练集和测试集* 3 将训练集带入算法,训练模型 ( spark 迭代计算 )* 4 模型评估, 是用测试集评估模型* 5 保存模型* 6 模型使用**/
object Demo2_libsvm {def main(args: Array[String]): Unit &#61; {val spark&#61;SparkSession.builder().master("local").appName("libsvm").config("spark.sql.shuffle.partitions",2).getOrCreate()val df: DataFrame &#61;spark.read.format("libsvm").load("spark/data/人体指标.txt")//切分训练集和测试集val array: Array[Dataset[Row]] &#61; df.randomSplit(Array(0.7,0.3))//训练集val train: Dataset[Row] &#61; array(0)//测试集val test: Dataset[Row] &#61; array(1)/**** 选择算法*///逻辑回归val regression: LogisticRegression &#61; new LogisticRegression()/*** 训练模型&#xff0c;spark 迭代计算&#xff0c;收敛*/val model: LogisticRegressionModel &#61; regression.fit(train)/**** 模型评估*/val frame: DataFrame &#61; model.transform(test)/*** 计算准确率* 正确的数量/总数* prediction*/frame.show()import spark.implicits._import org.apache.spark.sql.functions._val result&#61;frame.select(sum(when($"label"&#61;&#61;&#61;$"prediction",1).otherwise(0))/ count($"label") as "p")result.show()/*** 保存模型**/model.save("spark/data/model")/*** 在其他地方加载模型,使用模型**///val model1: LogisticRegressionModel &#61; LogisticRegressionModel.load("spark/data/model")}}

模型评估的表结构
在这里插入图片描述
评估的结果&#xff0c;准确率
在这里插入图片描述


4.imagetrain

package com.shujia.spark.mllibimport org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.ml.linalg
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}object Demo5ImageTrain {def main(args: Array[String]): Unit &#61; {val spark: SparkSession &#61; SparkSession.builder().master("local[8]").appName("mllib").config("spark.sql.shuffle.partitions", 2).getOrCreate()import spark.implicits._import org.apache.spark.sql.functions._//单独下去数据val data: DataFrame &#61; spark.read.format("libsvm").load("spark/data/image/train")data.printSchema()val newdata: DataFrame &#61; data.as[(Double, linalg.Vector)].map(kv &#61;> {val label: Double &#61; kv._1val features: linalg.Vector &#61; kv._2val array: Array[Double] &#61; features.toArray.map(i &#61;> {if (i < 0) {1.0} else if (i > 1) {1.0} else {0.0}})(label, Vectors.dense(array))}).toDF("label", "features")//切分训练集和测试集val array: Array[Dataset[Row]] &#61; newdata.randomSplit(Array(0.7, 0.3))//训练集val train: Dataset[Row] &#61; array(0)//测试集val test: Dataset[Row] &#61; array(1)//构建算法val logisticRegression: LogisticRegression &#61; new LogisticRegression()//训练模型val model: LogisticRegressionModel &#61; logisticRegression.fit(train)///测试模型val frame: DataFrame &#61; model.transform(test)val result: DataFrame &#61; frame.select(sum(when($"label" &#61;&#61;&#61; $"prediction", 1).otherwise(0)) / count($"label") as "p")result.show()model.save("spark/data/image/model")}
}

5.module

package com.mllibimport org.apache.spark.ml.classification.LogisticRegressionModel
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.sql.{DataFrame, SparkSession}object Demo6_Modelus {def main(args: Array[String]): Unit &#61; {val spark&#61;SparkSession.builder().master("local[8]").appName("mllib").config("spark.sql.shuffle.partitions",2).getOrCreate()import spark.implicits._import org.apache.spark.sql.functions._//加载模型val model: LogisticRegressionModel &#61; LogisticRegressionModel.load("spark/data/image/model")//读取图片val df&#61;spark.read.format("image").load("spark/data/image/10.jpg")val test: DataFrame &#61; df.select($"image.data").as[Array[Byte]].map(data&#61;>{val features&#61;data.map(byte&#61;>{val int: Int &#61; byte.toIntif(int&#61;&#61;0){0.0}else {1.0}})(1,Vectors.dense(features))}).toDF("label","features")//预测val frame: DataFrame &#61; model.transform(test)frame.show(false)}}

三、分词器

package com.mllibimport java.io.StringReaderimport org.wltea.analyzer.core.{IKSegmenter, Lexeme}import scala.collection.mutable.ListBufferobject Demo7_IK {def main(args: Array[String]): Unit &#61; {val text: String &#61; "你好&#xff0c;我是一名学生"println(fit(text))}import org.apache.spark.sql.functions._def fit(text:String):List[String]&#61;{val words: ListBuffer[String] &#61; new ListBuffer[String]val reader: StringReader &#61; new StringReader(text)val segmenter: IKSegmenter &#61; new IKSegmenter(reader,true)//取第一个var lexeme: Lexeme &#61; segmenter.next()while (lexeme!&#61;null){val word: String &#61; lexeme.getLexemeTextwords &#43;&#61; word//取下一个lexeme&#61;segmenter.next()}words.toList}}

在这里插入图片描述


import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel, NaiveBayes, NaiveBayesModel}
import org.apache.spark.ml.feature.{HashingTF, IDF, IDFModel, Tokenizer}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}object Demo8TextClaster {def main(args: Array[String]): Unit &#61; {/*** 文本分类**/val spark: SparkSession &#61; SparkSession.builder().master("local[8]").appName("mllib").config("spark.sql.shuffle.partitions", 8).getOrCreate()import spark.implicits._import org.apache.spark.sql.functions._val data: DataFrame &#61; spark.read.format("csv").option("sep", "\t").schema("label double, text string").load("spark/data/train.txt").repartition(8)//s使用ik分词器对数据进行分词val wordsData: DataFrame &#61; data.as[(Double, String)].map(kv &#61;> {//分词(kv._1, Demo7IK.fit(kv._2))}).filter(_._2.nonEmpty) //去掉空数据.map(kv &#61;> (kv._1, kv._2.mkString(" "))) //按空格拼接数据.toDF("label", "text")/*** 将数据转换成向量&#xff0c;加上tf-idf*///英文分词器&#xff0c;默认安装空格分割val tokenizer: Tokenizer &#61; new Tokenizer().setInputCol("text").setOutputCol("words")val tokenizerDF: DataFrame &#61; tokenizer.transform(wordsData)// 加上tf&#xff0c; 转换成一个稀疏向量val hashingTF: HashingTF &#61; new HashingTF().setInputCol("words").setOutputCol("rawFeatures")val hashingTFDF: DataFrame &#61; hashingTF.transform(tokenizerDF)/*** 增加idf**/val idf: IDF &#61; new IDF().setInputCol("rawFeatures").setOutputCol("features")//训练idf模型val idfModel: IDFModel &#61; idf.fit(hashingTFDF)//计算idfval idfDF: DataFrame &#61; idfModel.transform(hashingTFDF)//将数据切分成训练集和测试集val array: Array[Dataset[Row]] &#61; idfDF.randomSplit(Array(0.7, 0.3))val train: Dataset[Row] &#61; array(0)val test: Dataset[Row] &#61; array(1)/*** 贝叶斯分类* 适用于文本分类&#xff08;垃圾邮件分类&#xff09;**/val naiveBayes: NaiveBayes &#61; new NaiveBayes()//将数据带入算法训练模型val model: NaiveBayesModel &#61; naiveBayes.fit(train)// val logisticRegression: LogisticRegression &#61; new LogisticRegression()// val model: LogisticRegressionModel &#61; logisticRegression.fit(train)//模型评估val frame: DataFrame &#61; model.transform(test)frame.cache()frame.show(1000, false)//计算准确率val result: DataFrame &#61; frame.select(sum(when($"label" &#61;&#61;&#61; $"prediction", 1).otherwise(0)) / count($"label") as "p")result.show()//保存模型idfModel.save("spark/data/text/idfmodel")model.save("spark/data/text/model")}
}

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
author-avatar
拍友2502887597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有