博客
关于我
spark之常见的机器学习算法
阅读量:558 次
发布时间:2019-03-09

本文共 3612 字,大约阅读时间需要 12 分钟。

分类、回归、聚类:机器学习技术的核心要素

机器学习技术中,分类、回归和聚类是三大核心任务,它们以不同的方式处理数据,解决实际问题。分类和回归是监督学习任务,而聚类是无监督学习的典型应用。

分类与回归

分类的目标是根据输入特征构建分类函数或模型,将未知类别的样本映射到已知类别中。数学表达为:

F(W, X) = C
其中W是模型参数,X是输入向量,C是标签向量。

回归任务则是预测数值结果,例如预测房价、温度等连续变量。目标函数通常通过最小化误差或者最大化拟合程度来优化模型参数。

在spark.ml中,可以使用多种分类和回归算法。以下是几种常见算法的实现示例:

逻辑回归

逻辑回归是一种常用分类方法,通过对特征进行线性组合并归一化,输出类别概率得分。

  • 逻辑斯蒂分布

    输出函数基于贝叶斯概率计算,P(Y=1|x) = s(X·W),其中s是sigmoid函数。

  • 二项LR

    适用于二类分类问题,通过对样本进行迭代拟合,最终确定分类边界。

  • 似然函数最大化

    对似然函数求导,使用梯度下降等方法优化模型参数。

  • 决策树

    决策树通过分裂数据特征,构建树状分类结构,判断路径即可预测结果。

  • 特征选择

    通过信息增益和信息增益比选择最有效特征。

  • 决策树生成

    根据特征对数据进行递归分裂,生成分类树。

  • 决策树剪枝

    为了防止过拟合,对生成的树进行剪枝,降低模型复杂度,同时保持分类准确性。

  • 实例展示

    可以通过spark.ml Pipeline实现完整分类流程,包括特征转换、模型训练和结果评估。以下是一个简单的分类代码示例:

    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
    # 初始化spark session
    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()
    # 构建ML Pipeline
    labelIndexer = StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(df)
    featureIndexer = VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").fit(df)
    # 调整分类器参数
    lr = LogisticRegression().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
    # 创建Pipeline
    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 = ", 1.0 - lrAccuracy)

    聚类分析

    聚类任务没有固定的类别,目标是根据相似性将数据自动划分为簇。

    实现步骤:

  • 初始化k个样本点作为簇中心。
  • 计算每个样本到中心的距离,将样本分配到最近的簇。
  • 根据新样本更新簇中心,重复步骤直到收敛。
  • Spark中提供KMeans算法,支持参数设置和性能优化。

    示例代码

    from pyspark.sql import Row
    from pyspark.ml.clustering import KMeans, KMeansModel
    # 初始化spark session
    spark = SparkSession.builder.master("local").appName("spark ML").getOrCreate()
    # 模型训练
    kmeansmodel = KMeans().setK(2).setFeaturesCol('features').setPredictionCol('prediction').fit(df)
    # 模型预测
    kmeansPredictions = kmeansmodel.transform(df)
    # 查看预测结果
    kmeansPredictions.select('prediction', 'features').show()
    # 查看聚类中心
    results2 = kmeansmodel.clusterCenters()
    for item in results2:
    print(item)

    总结

    分类、回归和聚类是机器学习实践的三大主要任务,它们在实际应用中发挥着重要作用。选择合适的算法和优化参数,可以有效提升模型性能。在Spark ML中通过Pipepline实现模型训练和部署,能够高效处理多种数据集,为实际问题提供可靠解决方案。

    转载地址:http://mubpz.baihongyu.com/

    你可能感兴趣的文章
    Nodejs异步回调的处理方法总结
    查看>>
    NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
    查看>>
    nodejs支持ssi实现include shtml页面
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs服务端实现post请求
    查看>>
    nodejs框架,原理,组件,核心,跟npm和vue的关系
    查看>>
    Nodejs概览: 思维导图、核心技术、应用场景
    查看>>
    nodejs模块——fs模块
    查看>>
    Nodejs模块、自定义模块、CommonJs的概念和使用
    查看>>
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>
    NodeJs连接Oracle数据库
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    NodeMCU教程 http请求获取Json中文乱码解决方案
    查看>>
    Nodemon 深入解析与使用
    查看>>