当前位置:   article > 正文

机器学习介绍_setlabelcol

setlabelcol

机器学习

相关知识

发展历程

人类一直试图让机器具有智能,也就是人工智能(Artificial Intelligence)。从上世纪50年代,人工智能
的发展经历了“推理期”,通过赋予机器逻辑推理能力使机器获得智能,当时的AI程序能够证明一些著名的
数学定理,但由于机器缺乏知识,远不能实现真正的智能。因此,70年代,人工智能的发展进入“知识
期”,即将人类的知识总结出来教给机器,使机器获得智能。在这一时期,大量的专家系统问世,在很多
领域取得大量成果,但由于人类知识量巨大,故出现“知识工程瓶颈”
\quad无论是“推理期”还是“知识期”,机器都是按照人类设定的规则和总结的知识运作,永远无法超越其
创造者,其次人力成本太高。于是,一些学者就想到,如果机器能够自我学习问题不就迎刃而解了吗!
机器学习(Machine Learning)方法应运而生,人工智能进入“机器学习时期”。“机器学习时期”也分为
三个阶段,80年代,连接主义较为流行,代表工作有感知机(Perceptron)和神经网络(Neural
Network)。90年代,统计学习方法开始占据主流舞台,代表性方法有支持向量机(Support Vector
Machine),进入21世纪,深度神经网络被提出,连接主义卷土从来,随着数据量和计算能力的不断提
升,以深度学习(Deep Learning)为基础的诸多AI应用逐渐成熟

学习步骤

机器学习是一类算法的总称,这些算法企图从大量历史数据中挖掘出其中隐含的规律,并用于预测
或者分类,更具体的说,机器学习可以看作是寻找一个函数,输入是样本数据,输出是期望的结
果,只是这个函数过于复杂,以至于不太方便形式化表达。需要注意的是,机器学习的目标是使学
到的函数很好地适用于“新样本”,而不仅仅是在训练样本上表现很好。学到的函数适用于新样本的
能力,称为泛化(Generalization)能力
通常机器学习,目的是,找到一个函数,针对任何输入:语音,图片,文字,都能够自动输出正确
的结果

机器学习分类

  • 按照任务类型分

    • 回归模型【预测模型】
      • 输出的是一个不能被枚举的值
    • 分类模型【二分类模型、多分类模型】
      • 二分类模型区分是否垃圾邮件过滤
      • 多分类问题有文档自动分类
    • 结构化学习模型
      • 输出的不是一个固定长度的值,如图片语义分析,输出的是图片的文字描述
  • 从方法的角度来分类

    • 线性模型
      • 线性模型比较简单,但是作用不可忽略,线性模型是非线性模型的基础,很多非线性模型都是在线性模型上变换出来的
    • 非线性模型
      • 非线性模型又分为传统机器学习
      • 如SVM,KNN,决策树等,和深度学习模型
  • 按照学习理论分,机器学习模型可以分为有监督学习,半监督学习,无监督学习,迁移学习和强化学习

    • 当训练样本带有标签时是有监督学习;
    • 训练样本部分有标签,部分无标签时是半监督学习;
    • 训练样本全部无标签时是无监督学习。
    • 迁移学习就是就是把已经训练好的模型参数迁移到新的模型上以帮助新模型训练。
    • 强化学习是一个学习最优策略(policy),可以让本体(agent)在特定环境(environment)中,根据当前状态(state),做出行动(action),从而获得最大回报(reward)。强化学习和有监督学习最大的不同是,每次的决定没有对与错,而是希望获得最多的累计奖励

线性回归

回归的定义

回归的目的是通过几个已知的数据来预测另一个数值型数据的目标值,假设特征和结果满足线性关系,

即满足一个计算公式h(x),这个公式自变量就是已知的数据x,函数h(x)就是要预测的目标值,这一算法公式被称为回归方程式,得到这个方程就成为回归

多元线性回归

大多数现实世界的分析不止一个自变量,大多数情况下,很有可能使用多元线性回归

参数说明

  • LinearRegression

    <1> setMaxIter():设置最大迭代次数
    <2> setRegParam(): 设置正则项的参数,控制损失函数与惩罚项的比例,防止整个训练过程过拟合
    <3>
    setElasticNetParam():使用L1范数还是L2范数
    setElasticNetParam=0.0 为L2正则化;
    setElasticNetParam=1.0 为L1正则化;
    setElasticNetParam=(0.0,1.0) 为L1,L2组合

    <4> setFeaturesCol():指定特征列的列名,传入Array类型
    <5>setLabelCol():指定标签列的列名,传入String类型
    <6>setPredictionCol():指定预测列的列名
    <7>setFitIntercept(value:Boolean):是否需要偏置,默认为true(即是否需要y=wx+b中的b)
    <8>setStandardization(value:Boolean):模型训练时,是否对各特征值进行标准化处理,默认为true
    <9>setSolver(value:String):设置用于优化求解器。线性回归支持的有l-bfgs(有限内存拟牛顿法),normal(加权最小二乘法)和auto(自动选择)。
    <10>setTol(value:Double):设置迭代的收敛公差。值越小准确性越高但是迭代成本增加。默认值为1E-6。(即损失函数)
    <11>setWeightCol(value:String):设置某特征列的权重值,如果不设置或者为空,默认所有实例的权重为1。
    <12>setAggregationDepth:建议深度大于或等于2,默认为2。如果特征维度较大或者数据的分区量大的时候,可以调大该值。
    <13>fit:基于训练街训练出模型
    <14>transform:基于训练出的模型对测试集进行预测

  • LinearRegressionModel

    • fit()用于使用给定输入训练模型.
    • predict()用于实际预测.它为输入样本生成输出预测.
    • evaluate()用于评估已经训练过的模型.返回损失值&模型的度量值

样例代码

4 1:1 2:1 3:1
7 1:2 2:2 3:2
11 1:3 2:3 3:3
14 1:4 2:4 3:4
16 1:5 2:5 3:5
19 1:6 2:6 3:6
22 1:7 2:7 3:7
26 1:8 2:8 3:8
29 1:9 2:9 3:9
31 1:10 2:10 3:10
34 1:11 2:11 3:11
37 1:12 2:12 3:12
41 1:13 2:13 3:13
44 1:14 2:14 3:14
46 1:15 2:15 3:15
49 1:16 2:16 3:16
53 1:17 2:17 3:17
55 1:18 2:18 3:18
59 1:19 2:19 3:19
62 1:20 2:20 3:20
64 1:21 2:21 3:21
68 1:22 2:22 3:22
71 1:23 2:23 3:23
73 1:24 2:24 3:24
76 1:25 2:25 3:25
79 1:26 2:26 3:26
83 1:27 2:27 3:27
85 1:28 2:28 3:28
89 1:29 2:29 3:29
92 1:30 2:30 3:30
95 1:31 2:31 3:31
98 1:32 2:32 3:32
101 1:33 2:33 3:33
104 1:34 2:34 3:34
107 1:35 2:35 3:35
110 1:36 2:36 3:36
112 1:37 2:37 3:37
115 1:38 2:38 3:38
119 1:39 2:39 3:39
122 1:40 2:40 3:40
124 1:41 2:41 3:41
127 1:42 2:42 3:42
131 1:43 2:43 3:43
134 1:44 2:44 3:44
136 1:45 2:45 3:45
140 1:46 2:46 3:46
142 1:47 2:47 3:47
146 1:48 2:48 3:48
148 1:49 2:49 3:49
151 1:50 2:50 3:50
155 1:51 2:51 3:51
157 1:52 2:52 3:52
160 1:53 2:53 3:53
164 1:54 2:54 3:54
167 1:55 2:55 3:55
169 1:56 2:56 3:56
172 1:57 2:57 3:57
176 1:58 2:58 3:58
178 1:59 2:59 3:59
182 1:60 2:60 3:60
185 1:61 2:61 3:61
187 1:62 2:62 3:62
191 1:63 2:63 3:63
193 1:64 2:64 3:64
196 1:65 2:65 3:65
200 1:66 2:66 3:66
202 1:67 2:67 3:67
205 1:68 2:68 3:68
208 1:69 2:69 3:69
211 1:70 2:70 3:70
215 1:71 2:71 3:71
218 1:72 2:72 3:72
221 1:73 2:73 3:73
223 1:74 2:74 3:74
226 1:75 2:75 3:75
230 1:76 2:76 3:76
232 1:77 2:77 3:77
235 1:78 2:78 3:78
238 1:79 2:79 3:79
242 1:80 2:80 3:80
244 1:81 2:81 3:81
247 1:82 2:82 3:82
250 1:83 2:83 3:83
254 1:84 2:84 3:84
257 1:85 2:85 3:85
260 1:86 2:86 3:86
263 1:87 2:87 3:87
265 1:88 2:88 3:88
269 1:89 2:89 3:89
272 1:90 2:90 3:90
274 1:91 2:91 3:91
278 1:92 2:92 3:92
280 1:93 2:93 3:93
284 1:94 2:94 3:94
286 1:95 2:95 3:95
289 1:96 2:96 3:96
292 1:97 2:97 3:97
295 1:98 2:98 3:98
299 1:99 2:99 3:99
301 1:100 2:100 3:100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
object Hello05Number {
  def main(args: Array[String]): Unit = {
    //创建SparkSession
    val sparkSession = SparkSession.builder().master("local").appName("Hello05Number").getOrCreate()
    //开始读取数据,format("libsvm")默认读取数据格式
    val dataFrame = sparkSession.read.format("libsvm").load("src/main/data/sample_number.txt")
    //将数据分为训练数据和测试数据
    val Array(trainingData, testData) = dataFrame.randomSplit(Array(0.7, 0.3))
    //创建线性回归
    val linearRegression = new LinearRegression()
      .setMaxIter(10)
      .setRegParam(0.3)
      .setElasticNetParam(0.8)
      .setFitIntercept(true)
    //开始适配模型
    val model = linearRegression.fit(trainingData)
    println("线性回归系数:" + model.coefficients)
    println("线性回归截断值:" + model.intercept)
    //获取模型的综合评估信息
    val summary = model.summary
    println("根据训练用例" + summary.rootMeanSquaredError)
    //预估值,调用方式进行对数据预测
    println("计算向量(2,2,2)的预估值" + model.predict(Vectors.dense(2, 2, 2)))
    println("计算向量(3,3,3)的预估值" + model.predict(Vectors.dense(3, 3, 3)))
    //根据测试数据获取模型的评估值
    val regressionSummary = model.evaluate(testData)
    println("根据测试用例获取:" + regressionSummary.rootMeanSquaredError)
    //保存模型
    model.save("models/number_" + UUID.randomUUID())
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

贝叶斯定理

  • 贝叶斯是机器学习的核心方法之一

    托马斯·贝叶斯(Thomas Bayes)
    贝叶斯方法源于他生前为解决一个“逆概”问题写的一篇文章,而这篇文章是在他死后才由他的一位
    朋友发表出来的。
    在贝叶斯写这篇文章之前,人们已经能够计算“正向概率”,如“假设袋子里面有N个白球,M个黑
    球,你伸手进去摸一把,摸出黑球的概率是多大”。
    而一个自然而然的问题是反过来:“如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛
    摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白
    球的比例作出什么样的推测”。
    这个问题,就是所谓的逆概问题

拼写纠正

  • 用户输入了一个不在字典中的单词,我们需要去猜测:“这个家伙到底真正想输入的单词是什么?
    • tha --> than thaw thank that ?
  • P(我们猜测他想输入的单词 | 他实际输入的单词)
    • P(than | tha )
    • P(thaw | tha )
    • P(thank | tha )
    • P(that | tha )
    • P( h | D) h–>hypothesis[猜测] d–>Data[即观测数据]
    • P(h | D) = P(h) * P(D | h) / P(D)
    • P(h | D) ∝ P(h) * P(D | h)
  • P(H)是先验概率,P(D | H)是似然概率
  • 猜测给定观测数据是好是坏,取决于“这个猜测本身独立的可能性大小(先验概率,Prior )”和“这个猜测生成我们观测到的数据的可能性大小”(似然概率,Likelihood )的乘积。具体到我们的那个 thaw 例子上,含义就是,用户实际是想输入 the 的可能性大小取决于 the 本身在词汇表中被使用的可能性(频繁程度)大小(先验概率)和 想打 tha 却打成 than 的可能性大小(似然)的乘积。

拉普拉斯估计

  • 我们进行了n次独立试验,其中有r次成功。其余的试验(n-r)失败。

  • 三种方法:相对频率,拉普拉斯平滑定理和M-估计

    • 相对频率
      • 有时也称相对概率为极大似然估计。下次试验成功的概率按照以下公式计算:P=r/n
    • 拉普拉斯平滑定理
      • 为了缓解这种零概率估计,修改该后的方案是:P = (r+1)/(n+2)
      • 分子加1和分母加2背后的基本原理是这样的:在执行实际的试验之前,我们假设已经有两次试验,一次成功和一次失败。
    • M-估计
      • 首先假定先验概率分布。然后,根据已有的证据,更新先验分布为后验分布,其预期可以被视为p的一个点估计。
      • P=(r + Pam)/(n + m)

代码案例

yes,亚瑟	廉颇	牛魔	太乙真人	程咬金	廉颇	葫芦娃
no,张飞	程咬金	牛魔	张飞	吕布	程咬金
yes,吕布	东皇太一	程咬金	钟无艳	吕布	吕布
yes,东皇太一	芈月	牛魔	亚瑟	东皇太一	廉颇
no,吕布	钟无艳	芈月	太乙真人	庄周	廉颇
no,亚瑟	牛魔	牛魔	廉颇	钟无艳	亚瑟
no,吕布	程咬金	东皇太一	庄周	亚瑟	钟无艳
no,芈月	吕布	庄周	吕布	吕布	廉颇
yes,亚瑟	张飞	廉颇	张飞	东皇太一	程咬金
yes,亚瑟	牛魔	太乙真人	太乙真人	亚瑟	东皇太一
no,庄周	吕布	钟无艳	东皇太一	牛魔	牛魔	蛇精
yes,吕布	太乙真人	钟无艳	芈月	芈月	钟无艳
yes,东皇太一	张飞	程咬金	张飞	廉颇	程咬金
yes,亚瑟	廉颇	廉颇	芈月	钟无艳	东皇太一
yes,牛魔	张飞	庄周	芈月	吕布	廉颇
yes,芈月	庄周	钟无艳	芈月	东皇太一	牛魔
yes,太乙真人	芈月	芈月	牛魔	牛魔	程咬金
no,太乙真人	钟无艳	亚瑟	芈月	亚瑟	东皇太一	蛇精
no,张飞	庄周	张飞	程咬金	芈月	程咬金
yes,东皇太一	钟无艳	亚瑟	牛魔	吕布	牛魔
yes,张飞	庄周	吕布	廉颇	牛魔	钟无艳
no,太乙真人	牛魔	芈月	钟无艳	太乙真人	吕布
yes,东皇太一	东皇太一	庄周	张飞	牛魔	牛魔
no,廉颇	程咬金	廉颇	庄周	廉颇	钟无艳
yes,钟无艳	程咬金	程咬金	程咬金	太乙真人	芈月
yes,程咬金	东皇太一	钟无艳	张飞	庄周	吕布	葫芦娃
yes,廉颇	牛魔	芈月	程咬金	庄周	庄周
yes,东皇太一	牛魔	东皇太一	牛魔	程咬金	廉颇
yes,钟无艳	吕布	太乙真人	芈月	东皇太一	庄周
yes,程咬金	廉颇	廉颇	庄周	东皇太一	亚瑟
yes,廉颇	程咬金	钟无艳	张飞	亚瑟	庄周
yes,牛魔	张飞	廉颇	太乙真人	东皇太一	芈月
no,钟无艳	牛魔	庄周	程咬金	吕布	庄周
yes,芈月	亚瑟	庄周	张飞	程咬金	芈月
no,张飞	钟无艳	庄周	牛魔	东皇太一	太乙真人
yes,牛魔	廉颇	牛魔	太乙真人	程咬金	吕布
yes,吕布	东皇太一	亚瑟	太乙真人	程咬金	庄周
no,亚瑟	程咬金	太乙真人	庄周	芈月	东皇太一	蛇精
no,钟无艳	东皇太一	太乙真人	芈月	张飞	太乙真人
no,钟无艳	庄周	牛魔	张飞	芈月	芈月
yes,程咬金	亚瑟	亚瑟	东皇太一	牛魔	东皇太一
yes,芈月	太乙真人	亚瑟	钟无艳	吕布	钟无艳
yes,吕布	太乙真人	廉颇	太乙真人	张飞	东皇太一
yes,牛魔	钟无艳	程咬金	庄周	牛魔	张飞
no,张飞	芈月	吕布	张飞	廉颇	牛魔
yes,钟无艳	程咬金	程咬金	芈月	芈月	庄周
no,芈月	亚瑟	亚瑟	牛魔	钟无艳	廉颇	蛇精
no,亚瑟	钟无艳	廉颇	程咬金	廉颇	张飞
yes,钟无艳	吕布	吕布	吕布	程咬金	亚瑟
yes,吕布	庄周	太乙真人	亚瑟	庄周	程咬金
yes,芈月	程咬金	钟无艳	亚瑟	吕布	吕布
no,吕布	张飞	吕布	庄周	吕布	廉颇
yes,太乙真人	芈月	廉颇	庄周	廉颇	东皇太一
no,太乙真人	芈月	芈月	亚瑟	程咬金	亚瑟
yes,东皇太一	太乙真人	钟无艳	东皇太一	程咬金	牛魔
yes,亚瑟	钟无艳	程咬金	张飞	太乙真人	廉颇
yes,钟无艳	程咬金	东皇太一	廉颇	廉颇	牛魔
yes,张飞	廉颇	吕布	芈月	廉颇	东皇太一
yes,钟无艳	吕布	亚瑟	芈月	庄周	吕布
no,亚瑟	牛魔	张飞	牛魔	庄周	太乙真人
yes,吕布	亚瑟	程咬金	亚瑟	钟无艳	太乙真人
no,东皇太一	东皇太一	张飞	亚瑟	亚瑟	廉颇
yes,牛魔	牛魔	廉颇	亚瑟	程咬金	牛魔	葫芦娃
no,亚瑟	程咬金	吕布	太乙真人	东皇太一	亚瑟	蛇精
yes,亚瑟	东皇太一	牛魔	庄周	吕布	张飞
no,程咬金	牛魔	程咬金	牛魔	钟无艳	牛魔
no,芈月	张飞	芈月	张飞	太乙真人	牛魔
yes,廉颇	东皇太一	庄周	吕布	庄周	吕布
yes,牛魔	钟无艳	钟无艳	牛魔	庄周	庄周
yes,钟无艳	牛魔	亚瑟	东皇太一	东皇太一	太乙真人	葫芦娃
yes,钟无艳	程咬金	东皇太一	程咬金	程咬金	钟无艳
no,钟无艳	吕布	芈月	亚瑟	张飞	庄周
no,牛魔	庄周	廉颇	东皇太一	程咬金	吕布	蛇精
yes,吕布	牛魔	程咬金	庄周	牛魔	张飞
yes,程咬金	亚瑟	吕布	吕布	牛魔	亚瑟
no,庄周	廉颇	太乙真人	太乙真人	庄周	东皇太一
no,廉颇	庄周	庄周	吕布	张飞	程咬金
no,吕布	东皇太一	钟无艳	张飞	东皇太一	钟无艳
yes,庄周	张飞	牛魔	张飞	芈月	东皇太一
yes,钟无艳	吕布	程咬金	芈月	吕布	吕布
no,庄周	吕布	庄周	廉颇	廉颇	牛魔
no,庄周	牛魔	廉颇	东皇太一	太乙真人	亚瑟
no,牛魔	太乙真人	芈月	东皇太一	廉颇	程咬金
no,吕布	张飞	东皇太一	东皇太一	廉颇	程咬金
yes,廉颇	钟无艳	庄周	廉颇	牛魔	亚瑟
no,庄周	东皇太一	吕布	张飞	牛魔	芈月
no,太乙真人	张飞	张飞	芈月	钟无艳	程咬金
no,吕布	芈月	庄周	钟无艳	亚瑟	吕布
yes,东皇太一	庄周	牛魔	亚瑟	钟无艳	牛魔
no,程咬金	亚瑟	东皇太一	钟无艳	吕布	廉颇
no,太乙真人	庄周	东皇太一	亚瑟	庄周	牛魔
no,吕布	东皇太一	庄周	牛魔	吕布	张飞	蛇精
yes,廉颇	张飞	芈月	吕布	东皇太一	吕布
yes,廉颇	张飞	吕布	亚瑟	吕布	芈月
no,廉颇	张飞	吕布	芈月	太乙真人	太乙真人
no,太乙真人	钟无艳	钟无艳	钟无艳	庄周	吕布
no,钟无艳	东皇太一	牛魔	廉颇	吕布	东皇太一
yes,芈月	太乙真人	芈月	张飞	廉颇	庄周
yes,蛇精,葫芦娃
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
/**
 * 1:创建环境
 * 2:读取数据
 * 3:转换为dataFrame
 */
object Hello06NaiveBayes {
  def main(args: Array[String]): Unit = {
    //创建环境
    val sparkSession = SparkSession.builder().master("local").appName("Hello06NaiveBayes").getOrCreate()
    import sparkSession.implicits._
    //读取数据
    val lineRDD = sparkSession.read.textFile("src/main/data/sample_string.txt").rdd
    //转成LabeledPoint
    val dataRDD = lineRDD.map(line => {
      var label = 0;
      if ("yes".equals(line.split(",")(0))) {
        label = 1;
      }
      var words = line.split(",")(1).split("\t").filter(_.length > 0)
      Row(label, words)
    })
    //构建类型,将dataSet转换为dataFrame
    val schema = StructType(List(
      StructField("label", IntegerType, nullable = false),
      StructField("words", ArrayType(StringType, true), nullable = false),
    ))
    //转成DataFrame
    val lineFrame = sparkSession.createDataFrame(dataRDD, schema)

    //转换 将array<String>转成 array<double>
    val countVectorizer = new CountVectorizer()
    countVectorizer.setInputCol("words").setOutputCol("features")
    val vectorizerModel = countVectorizer.fit(lineFrame)
    val dataFrame = vectorizerModel.transform(lineFrame)

    //    dataFrame.foreach(w=>println(w))
    //    dataFrame.printSchema()
    //拆分数据
    val Array(trainingData, testData) = dataFrame.randomSplit(Array(1.0, 0.1))
    //开始进行计算
    val model = new NaiveBayes().fit(trainingData)
    //转换数据
    val predictions = model.transform(testData)
    predictions.foreach(w => println(w))
    //对算法的准确性进行判定
    val evaluator = new MulticlassClassificationEvaluator()
      .setLabelCol("label")
      .setPredictionCol("prediction")
      .setMetricName("accuracy")

    val accuracy = evaluator.evaluate(predictions)
    println(s"Test set accuracy = $accuracy")
    sparkSession.stop();
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

Kmeans聚类算法

聚类

  • 给事物打标签,寻找同一组内的个体之间的一些潜在的相似模式。力图找到数据的自然分组kmeans。

  • 聚类是一种无监督的机器学习任务,它可以自动将数据划分成类cluster。因此聚类分组不需要提前被告知所划分的组应该是什么样的。因为我们甚至可能都不知道我们在寻找什么,所以聚类是用于知识发现而不是预测

  • 聚类原则是一个组内的记录彼此必须非常相似,而与该组之外的记录截然不同。所有聚类做的就是
    遍历所有数据然后找到这些相似性

算法思想

  • 以空间中K个点为中心进行聚类,对最靠近他们的对象归类,通过迭代的方法,逐次更新各聚类中心的值,直到得到最好的聚类结果

关联规则

市场购物篮分析的结果是一组指定商品之间关系模式的关联规则
一个典型的规则可以表述为: {花生酱,果酱} –> {面包}
这个关联规则用通俗易懂的语言来表达就是:如果购买了花生酱和果酱,
那么也很有可能会购买面包。
更加典型的还有一个 啤酒—尿布 的例子

支持度和置信度

一个项集或者规则度量法的支持度是指在数据中出现的频率

置信度是指改规则的预测能力或者准确度的度量

决策树/随机森林

决策树和随机森林都是一种非线性有监督分类模型,非线性不存在不可分问题

决策树分裂原则

决策树的生成,数据不断分裂的递归过程,每一次分裂,尽可能让类别一样的数据在树的一边,当树的叶子节点的数据都是一类的时候,则停止分类。(类比if else语句。)

混淆矩阵+ROC&AUC

混淆矩阵

对于决策树的预判准确性,通过混淆矩阵来进行计算可用性

针对二分类问题来看,要么预测正确要么预测失败。
从结果正确存在两种可能:原本对的预测为对,原本错的预测为错;
结果错误也存在两种可能:原本对的预测为错,原本错的预测为对

  • precision(精确率)含义是:预测为对的当中,原本为对的比例(越大越好,1为理想状态)
  • recall(召回率)的含义是:原本为对的当中,预测为对的比例(越大越好,1为理想状态)

ROC和AUC

ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the Curve)值常被用来评价一个二值分类器(binary classifier)的优劣

  • ROC图表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P11Mnjg-1655256599504)(C:\Users\wangyuan\AppData\Roaming\Typora\typora-user-images\1655256377531.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P824Ak2u-1655256599506)(C:\Users\wangyuan\AppData\Roaming\Typora\typora-user-images\1655256383544.png)]

  • AUC计算公式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VMD7Vf1x-1655256599506)(C:\Users\wangyuan\AppData\Roaming\Typora\typora-user-images\1655256473943.png)]

AUC值介于0到1之间,关于AUC值的判断说明如下:
AUC<0.5:不符合实际情况, 预测诊断比随机性猜测还差,实际情况中不应该出现;
AUC=0.5:说明完全无预测诊断价值,预测准确率和猜测效果一样;
0.5< AUC <0.7:预测诊断价值很低,此种情况相对较常见;
0.7<=AUC<0.9:预测诊断价值高,此种情况较常见;
AUC>=0.9:说明预测诊断价值高,此种情况较好;
原本为对的当中,预测为对的比例(越大越好,1为理想状态)

ROC和AUC

ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the Curve)值常被用来评价一个二值分类器(binary classifier)的优劣

  • ROC图表

在这里插入图片描述
在这里插入图片描述

  • AUC计算公式

在这里插入图片描述

AUC值介于0到1之间,关于AUC值的判断说明如下:
AUC<0.5:不符合实际情况, 预测诊断比随机性猜测还差,实际情况中不应该出现;
AUC=0.5:说明完全无预测诊断价值,预测准确率和猜测效果一样;
0.5< AUC <0.7:预测诊断价值很低,此种情况相对较常见;
0.7<=AUC<0.9:预测诊断价值高,此种情况较常见;
AUC>=0.9:说明预测诊断价值高,此种情况较好;
AUC = 1,是完美预测没有瑕疵,绝大多数情况下,不存在完美的预测诊断(过拟合情况)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/547166
推荐阅读
相关标签
  

闽ICP备14008679号