1、分类、回归、聚类

分类回归是一种重要的机器学习和数据挖掘技术。分类的目的是根据数据集的特点构造一个分类函数或分类模型(也常常称作分类器),该模型能把未知类别的样本映射到给定类别中的一种技术。

即: 向量X=[x1,x2...xn]但标签C=[c1,c2...,ck]的映射F(W,X)=C

聚类是一种无监督学习的方法,将无标签数据聚类到不同的簇中

spark.ml支持的分类与回归算法

2、常见算法实例介绍

2.1、逻辑回归:

2.1.1、逻辑斯蒂分布

2.1.2、二项LR:

2.1.3、似然函数:

求极大值,得到w的估计值。求极值的方法可以是梯度下降法,梯度上升法等。

from pyspark.sql import SparkSession
from pyspark.sql import Row,functions
from pyspark.ml.linalg import Vector,Vectors
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml import Pipeline
from pyspark.ml.feature import IndexToString, StringIndexer, VectorIndexer,HashingTF, Tokenizer
from pyspark.ml.classification import LogisticRegression,LogisticRegressionModel,BinaryLogisticRegressionSummary, LogisticRegression
spark = SparkSession.builder.master("local").appName("spark ML").getOrCreate()def f(x):rel = {}rel['features'] = Vectors.dense(float(x[0]),float(x[1]),float(x[2]),float(x[3]))rel['label'] = str(x[4])return rel#读取数据集并转化为DataFrame
df= spark.sparkContext.textFile("file:///home/work/jiangshuangyan001/spark_test/iris.txt").map(lambda line: line.split(',')).map(lambda p: Row(**f(p))).toDF()#构建二分数据集
df.createOrReplaceTempView("iris")
df = spark.sql("select * from iris where label != 'Iris-setosa'")
rel = df.rdd.map(lambda t : str(t[1])+":"+str(t[0])).collect()
# for item in rel:
#     print(item)#构建ML的pipeline
labelIndexer = StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(df)
featureIndexer = VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").fit(df)
df.show()
df_train, df_test = df.randomSplit([0.7,0.3])
#用setter的方法设置logistic的参数
lr = LogisticRegression().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
#print("LogisticRegression parameters:\n" + lr.explainParams())labelConverter = IndexToString().setInputCol("prediction").setOutputCol("predictedLabel").setLabels(labelIndexer.labels)
lrPipeline =  Pipeline().setStages([labelIndexer, featureIndexer, lr, labelConverter])
lrPipelineModel = lrPipeline.fit(df_train)lrPredictions = lrPipelineModel.transform(df_test)#预测结果
preRel = lrPredictions.select("predictedLabel", "label", "features", "probability").collect()
for item in preRel:print(str(item['label'])+','+str(item['features'])+'-->prob='+str(item['probability'])+',predictedLabel'+str(item['predictedLabel']))#评估
evaluator = MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction")
lrAccuracy = evaluator.evaluate(lrPredictions)
print("Test Error = " , str(1.0 - lrAccuracy))

2.2、决策树

​ 决策树(decision tree)是一种基本的分类与回归方法,这里主要介绍用于分类的决策树。决策树模式呈树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。学习时利用训练数据,根据损失函数最小化的原则建立决策树模型;预测时,对新的数据,利用决策树模型进行分类。

​ 决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的剪枝。

2.2.1、特征选择

  • 信息增益(informational entropy)表示得知某一特征后使得信息的不确定性减少的程度。

  • 信息增益比: 为解决信息增益偏向值多的特征而提出

为特征A的熵值

  • 基尼指数:分类问题中,假设有K个类,样本点属于第K类的概率为

2.2.2、决策树的生成

从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点,再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增均很小或没有特征可以选择为止,最后得到一个决策树。

​ 决策树需要有停止条件来终止其生长的过程。一般来说最低的条件是:当该节点下面的所有记录都属于同一类,或者当所有的记录属性都具有相同的值时。这两种条件是停止决策树的必要条件,也是最低的条件。在实际运用中一般希望决策树提前停止生长,限定叶节点包含的最低数据量,以防止由于过度生长造成的过拟合问题。

2.2.3、决策树的剪枝

​ 决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,这个过程称为剪枝。

​ 决策树的剪枝往往通过极小化决策树整体的损失函数来实现。一般来说,损失函数可以进行如下的定义:

2.2.3、实例

#导入所需要的包
from pyspark.ml.classification import DecisionTreeClassificationModel,DecisionTreeClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
#训练决策树模型,这里我们可以通过setter的方法来设置决策树的参数,也可以用ParamMap来设置(具体的可以查看spark mllib的官网)。具体的可以设置的参数可以通过explainParams()来获取。
dtClassifier = DecisionTreeClassifier().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures")
#在pipeline中进行设置
pipelinedClassifier = Pipeline().setStages([labelIndexer, featureIndexer, dtClassifier, labelConverter])
#训练决策树模型
modelClassifier = pipelinedClassifier.fit(df_train)
#进行预测
predictionsClassifier = modelClassifier.transform(df_test)
#查看部分预测的结果
predictionsClassifier.select("predictedLabel", "label", "features").show(20)
evaluatorClassifier = MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction").setMetricName("accuracy")accuracy = evaluatorClassifier.evaluate(predictionsClassifier)print("Test Error = " + str(1.0 - accuracy))
treeModelClassifier = modelClassifier.stages[2]print("Learned classification tree model:\n" + str(treeModelClassifier.toDebugString))

2.3、聚类kmeans

1.根据给定的k值,选取k个样本点作为初始划分中心;

2.计算所有样本点到每一个划分中心的距离,并将所有样本点划分到距离最近的划分中心;

3.计算每个划分中样本点的平均值,将其作为新的中心;

from pyspark.sql import Row
from pyspark.ml.clustering import KMeans,KMeansModel
from pyspark.ml.linalg import Vectors
#ML包下的KMeans方法也有Seed(随机数种子)、Tol(收敛阈值)、K(簇个数)、MaxIter(最大迭代次数)、initMode(初始化方式)、initStep(KMeans||方法的步数)等参数可供设置
kmeansmodel = KMeans().setK(2).setFeaturesCol('features').setPredictionCol('prediction').fit(df)
kmeansmodel.transform(df).show()
results = kmeansmodel.transform(df).collect()
for item in results:print(str(item[0])+' is predcted as cluster'+ str(item[2]))#获取聚类中心的情况
#也可以通过KMeansModel类自带的clusterCenters属性获取到模型的所有聚类中心情况:
results2 = kmeansmodel.clusterCenters()
for item in results2:print(item)#与MLlib下的实现相同,KMeansModel类也提供了计算 集合内误差平方和(Within Set Sum of Squared Error, WSSSE) 的方法来度量聚类的有效性,在真实K值未知的情况下,该值的变化可以作为选取合适K值的一个重要参考:
kmeansmodel.computeCost(df)

spark之常见的机器学习算法相关推荐

  1. 机器学习:常见的机器学习算法归纳

    常见的机器学习算法归纳 1) .回归算法: 2) .基于实例的算法: 3) .决策树学习: 4) .贝叶斯方法: 5) .基于核的算法: 6) .聚类算法: 7) .降低维度算法: 8) .关联规则学 ...

  2. 一文简介常见的机器学习算法

    原文 joydeep bhattacharjee 千平 编译整理 量子位 出品 | 公众号 QbitAI 所谓机器学习算法就是一个假设集合,用于找到最优模型.机器学习算法可以分为三大类. 监督学习:输 ...

  3. “Spark上流式机器学习算法实现”终期检查报告

    自6月底申请项目到现在9月初撰写项目结题报告,眨眼一瞬间两个半月很快成为过去,在这两个半月的时间里,在不断的看文章和调试代码,首先我得感谢和我一起合作的赖百胜同学与我并肩作战,是他给了我一次次战胜bu ...

  4. 8个常见机器学习算法的计算复杂度总结!

    Datawhale干货 来源:DeepHub IMBA,编辑:数据派THU 计算的复杂度是一个特定算法在运行时所消耗的计算资源(时间和空间)的度量. 计算复杂度又分为两类: 一.时间复杂度 时间复杂度 ...

  5. 机器学习算法一览(附python和R代码)

     机器学习算法一览(附python和R代码) 来源:数据观 时间:2016-04-19 15:20:43 作者:大数据文摘 "谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能 ...

  6. 机器学习系列(9)_机器学习算法一览(附Python和R代码)

    转载自:http://blog.csdn.net/longxinchen_ml/article/details/51192086 – 谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电 ...

  7. 深度学习笔记——基于传统机器学习算法(LR、SVM、GBDT、RandomForest)的句子对匹配方法

    句子对匹配(Sentence Pair Matching)问题是NLP中非常常见的一类问题,所谓"句子对匹配",就是说给定两个句子S1和S2,任务目标是判断这两个句子是否具备某种类 ...

  8. 图解10大机器学习算法

    今天给大家分享一篇机器学习算法的文章,利用图解的方式介绍了10大常见的机器学习算法.看正文: 在机器学习领域,有种说法叫做"世上没有免费的午餐",简而言之,它是指没有任何一种算法能 ...

  9. 转机器学习系列(9)_机器学习算法一览(附Python和R代码)

    转自http://blog.csdn.net/han_xiaoyang/article/details/51191386 – 谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更 ...

  10. 机器学习算法系列(一)-基础机器学习算法入门

    问题思考 1 您熟悉那些学习算法? 2 您应用那些机器学习算法? 本篇内容主要是面向机器学习初学者,介绍常见的机器学习算法,当然,欢迎各位小伙伴一起交流. 哲学要回答的基本问题是从哪里来.我是谁.到哪 ...

最新文章

  1. 【PHP】字符串去空格并将每个单词首字母转换成大写de多种解法
  2. Linux下SENDMAIL+OPENWEBMAIL(2)
  3. python官网下载步骤图解-下载及安装Python详细步骤
  4. BPI:bit for Webduino WEB:Bit 教育版平台正式发布,支持离线安装使用
  5. 复习笔记(五)——C++多态和虚函数
  6. C# 单例模式的多种简单实现
  7. SPSS学习系列之SPSS Statistics(简称SPSS)是什么?
  8. LeetCode 548. 将数组分割成和相等的子数组(哈希set)
  9. 存储芯片在智能化产业链中扮演的角色将更加重要
  10. AI论文解读丨融合视觉、语义、关系多模态信息的文档版面分析架构VSR
  11. WHERE和HAVING子句有什么区别?
  12. git add用法详解,参数列表,git add -A/git add -u/git add .区别
  13. Java设计模式与实践
  14. 疫期免费 “零接触”云迁移~工具替代人力! 人不聚,活儿继续!
  15. 运维人员的三种层次:看看你是背锅侠,还是闪修侠?
  16. 记账软件哪个好用,亲测有效
  17. mine 规范_模型规范要求
  18. python编辑器怎么放大字体_增大python字体的方法步骤
  19. 修复双系统的windows启动项找不到问题
  20. ftp的20 21端口和主动被动模式

热门文章

  1. 最新PHP超精简全站自适应小说网网站源码
  2. 双光耦开关电源电路图_光耦817应用电路图汇总(PC817光电耦合器/开关电源/TL431)...
  3. 零基础如何学习java?
  4. [ERP/鼎捷E10][生产管理]指定完工
  5. 网络营销推广,微商引流48招技能
  6. 热敏电阻温度采集简述
  7. Fiddler https最新抓包方法(Android 9.0)
  8. 基于springboot房屋租赁管理系统 (源代码+数据库)
  9. wps h5制作软件
  10. VRay 2.0 for SketchUp高级室内渲染教程锌