本文共 3561 字,大约阅读时间需要 11 分钟。
机器学习技术中,分类、回归和聚类是三大核心任务,它们以不同的方式处理数据,解决实际问题。分类和回归是监督学习任务,而聚类是无监督学习的典型应用。
分类的目标是根据输入特征构建分类函数或模型,将未知类别的样本映射到已知类别中。数学表达为:
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 SparkSessionfrom pyspark.sql import Row, functionsfrom pyspark.ml.linalg import Vector, Vectorsfrom pyspark.ml.evaluation import MulticlassClassificationEvaluatorfrom pyspark.ml import Pipelinefrom pyspark.ml.feature import IndexToString, StringIndexer, VectorIndexer, HashingTF, Tokenizerfrom pyspark.ml.classification import LogisticRegression, LogisticRegressionModel, BinaryLogisticRegressionSummary# 初始化spark sessionspark = 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# 读取数据集并转化为DataFramedf = 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 PipelinelabelIndexer = 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)# 创建PipelinelabelConverter = 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) 聚类任务没有固定的类别,目标是根据相似性将数据自动划分为簇。
实现步骤:
Spark中提供KMeans算法,支持参数设置和性能优化。
from pyspark.sql import Rowfrom pyspark.ml.clustering import KMeans, KMeansModel# 初始化spark sessionspark = 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/