【Spark】实验6 Spark机器学习库MLlib编程实践

Spark机器学习库MLlib编程实践

一、实验目的

  • 通过实验掌握基本的MLLib编程方法;
  • 掌握用MLLib解决一些常见的数据分析问题,包括数据导入、成分分析和分类和预测等。

二、实验平台

  • 新工科智慧平台。
  • 数据集1:下载Adult数据集(http://archive.ics.uci.edu/ml/datasets/Adult),该数据集也可以从教学平台获取。
    • 数据从美国1994年人口普查数据库抽取而来,可用来预测居民收入是否超过50K$/year。
    • 该数据集类变量为年收入是否超过50k$,属性变量包含年龄、工种、学历、职业、人种等重要信息。
    • 值得一提的是,14个属性变量中有7个类别型变量。
  • 数据集2:鸢尾花数据集 150条鸢尾花数据集

三、实验内容和要求

3.1 居民收入数据分类

1.数据导入

  • 从文件中导入数据,并转化为DataFrame。
  • 在进行数据导入前,要先对所下载的adult数据集进行预处理(本次实验只用到了adult.data和adult.test两个文件)
    • 处理1:两个文件最后的空行要删掉,不然会报错!!!
      在这里插入图片描述
    • 处理2:adult.test文件的第一行删掉,不然会报错!!
      在这里插入图片描述
    • 处理3:把adult.test文件中每一行最后的“.”删掉(直接替换即可),不然会报错!!!
      在这里插入图片描述
  • 从文件中导入数据,并转化为DataFrame
from pyspark.ml.feature import PCA
from pyspark.shell import spark
from pyspark.sql import Row
from pyspark.ml.linalg import Vector, Vectors
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml import Pipeline, PipelineModel
from pyspark.ml.feature import IndexToString, StringIndexer, VectorIndexer, HashingTF, Tokenizer
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.classification import LogisticRegressionModel
from pyspark.ml.classification import BinaryLogisticRegressionSummary, LogisticRegression
from pyspark.sql import functions
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder


def f(x):
    rel = {'features': Vectors.dense(float(x[0]), float(x[2]), float(x[4]), float(x[10]), float(x[11]), float(x[12])),
           'label': str(x[14])}
    return rel

df = spark.sparkContext.textFile("/Users/liuhao/MyProject/PycharmProject/Spark/Data/adult.data")\
    .map(lambda line: line.split(',')).map(lambda p: Row(**f(p))).toDF()
test = spark.sparkContext.textFile("/Users/liuhao/MyProject/PycharmProject/Spark/Data/adult.test")\
    .map(lambda line: line.split(',')).map(lambda p: Row(**f(p))).toDF()

在这里插入图片描述

2.进行主成分分析(PCA)

  • 对6个连续型的数值型变量进行主成分分析。
    • PCA(主成分分析)是通过正交变换把一组相关变量的观测值转化成一组线性无关的变量值,即主成分的一种方法。
    • PCA通过使用主成分把特征向量投影到低维空间,实现对特征向量的降维。
  • 通过setK()方法将主成分数量设置为3,把连续型的特征向量转化成一个3维的主成分。
  • 构建PCA模型,并通过训练集进行主成分分解,然后分别应用到训练集和测试集
pca = PCA(k=3, inputCol="features", outputCol="pcaFeatures").fit(df)
result = pca.transform(df)
testdata = pca.transform(test)

result.show()

在这里插入图片描述

test.show()

在这里插入图片描述

3.训练分类模型并预测居民收入

  • 在主成分分析的基础上,采用逻辑回归,以及决策树模型预测居民收入是否超过50K;
  • 对Test数据集进行验证。 并对两种方法结果进行分析对比。
labelIndexer = StringIndexer(inputCol="label",outputCol="indexedLabel").fit(result)
for label in labelIndexer.labels:
    print(label)
featureIndexer = VectorIndexer (inputCol="pcaFeatures", outputCol="indexedFeatures").fit(result)
print(featureIndexer.numFeatures)
labelConverter = IndexToString (inputCol=" prediction", outputCol=" predictedLabel", labels=labelIndexer.labels)
labelIndexer = StringIndexer (inputCol="label",outputCol=" indexed abel" ).fit(result)
for label in labelIndexer.labels:
    print(label)

在这里插入图片描述

featureIndexer = VectorIndexer(inputCol="pcaFeatures", outputCol="indexedFeatures").fit(result)
print (featureIndexer.numFeatures)
labelConverter = IndexToString (inputCol="prediction", outputCol="predictedLabel", labels=labelIndexer.labels)
lr = LogisticRegression().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setMaxIter(100)
lrPipeline = Pipeline().setStages( [labelIndexer, featureIndexer, lr, labelConverter])
lrPipelineModel = lrPipeline. fit( result)
lrModel = lrPipelineModel. stages[2]
print ("Coefficients: In " + str(lrModel.coefficientMatrix)+"\nIntercept: "+str(lrModel.interceptVector)+
       "\n+numFeatures: " + str( lrModel. numFeatures))
lrPredictions = lrPipelineModel.transform(testdata)
evaluator = MulticlassClassificationEvaluator() . setLabelCol(" indexedLabel" ) . setPredictionCol( "prediction" )
lrAccuracy = evaluator . evaluate(lrPredictions)
print("Test Error = %g " % (1.0 - lrAccuracy))

在这里插入图片描述

4.超参数调优

  • 利用CrossValidator确定最优的参数,包括最优主成分PCA的维数、分类器自身的参数等。
pca = PCA().setInputCol("features").setOutputCol( "pcaFeatures" )
labelIndexer = StringIndexer() . setInputCol("label" ) . set0utputCol(" indexedLabel" ) . fit(df )
featureIndexer = VectorIndexer() . setInputCol(" pcaFeatures") . setOutputCol(" indexedFeatures" )
labelConverter = IndexToString() . setInputCol(" prediction") . set0utputCol (" predictedLabel" ) . setLabels(labelIndexer . labels)
lr = LogisticRegression() .setLabelCol(" indexedLabel") .setFeaturesCol( "indexedFeatures") .setMaxIter(100)
lrPipeline = Pipeline() . setStages( [pca, labelIndexer, featureIndexer, lr, labelConverter])
paramGrid = ParamGridBuilder().addGrid(pca.k, [1,2,3,4,5,6]) . addGrid(lr.elasticNetParam, [0.2,0.8]) . addGrid(lr.regParam,[0.01,0.1,0,5]).build()
cv = CrossValidator().setEstimator(lrPipeline).setEvaluator(MulticlassClassificationEvaluator().setabelCol("indexedLabel")
                                                            .setPredictionCol("prediction") ).setEstimatorParamMaps ( paramGrid).setNumFolds(3)
cvModel = cv. fit(df)
lrPredictions = cvModel. transform(test )
evaluator = MulticlassClassificationEvaluator() . setLabelCol(" indexedLabel" ) . setPredictionCol( "prediction" )
lrAccuracy = evaluator . evaluate(lrPredictions )
print("i€ỡã 4 # "+str(lrAccuracy))


bestModel= cvModel.bestModel
lrModel = bestModel.stages[3]
print ("Coefficients: n " + str(lrModel. coefficientMatrix)+"InIntercept: "+str(lrModel.interceptVector)+ "In numClasses:ses)"+"\n numFeatures: "+str(lrModel. numFeatures))
pcaModel = bestModel. stages[0]

在这里插入图片描述

  • PCA最优的维数是6。

3.2 鸢尾花数据聚类分析

1、数据集导入

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture


data_path = "/Users/liuhao/MyProject/PycharmProject/Spark/Data/iris.txt"
data = pd.read_csv(data_path, header=None)
X = data.iloc[:, :-1]  # 特征数据
y = data.iloc[:, -1]   # 类别标签

2、构建聚类模型可以采用Kmeans及GMM,并训练

# 建立聚类模型
kmeans_model = KMeans(n_clusters=3, random_state=42)
gmm_model = GaussianMixture(n_components=3, random_state=42)

# 训练模型
kmeans_model.fit(X)
gmm_model.fit(X)

3、输出聚类标签

kmeans_labels = kmeans_model.labels_
gmm_labels = gmm_model.predict(X)

print("KMeans聚类标签:")
print(kmeans_labels)
print("\nGMM聚类标签:")
print(gmm_labels)

在这里插入图片描述

4、查看聚类中心或混合成分参数,分析并对比聚类效果

kmeans_centers = kmeans_model.cluster_centers_
gmm_means = gmm_model.means_
gmm_covariances = gmm_model.covariances_

print("\nKMeans聚类中心:")
print(kmeans_centers)
print("\nGMM混合成分均值:")
print(gmm_means)
print("\nGMM混合成分协方差矩阵:")
print(gmm_covariances)

在这里插入图片描述

  • 16
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Spark机器学习MLlib是一个基于Spark平台的分布式机器学习,它提供了一系列常用的机器学习算法和工具,包括分类、回归、聚类、协同过滤、降维等。使用MLlib可以方便地进行大规模的机器学习任务,同时也支持在线学习和增量学习等高级功能。在编程实践中,我们可以使用MLlib来构建机器学习模型,对数据进行预处理和特征工程,进行模型训练和评估等。同时,MLlib还支持与其他Spark组件的无缝集成,如Spark SQL、Spark Streaming等,可以实现更加复杂的机器学习应用场景。 ### 回答2: Spark机器学习MLlib是一个强大的分布式机器学习框架,原生支持Spark的分布式计算,可以处理大规模的数据集,并提供一系列常见的机器学习算法和工具,包括分类、回归、聚类、推荐等。 MLlib编程实践主要分为以下几个步骤: 1. 数据预处理 在使用MLlib进行机器学习之前,需要对数据进行预处理,清洗和准备工作,如数据清洗、缺失值填充、特征选择、特征缩放等。MLlib对数据的处理和转换有良好的支持,可以使用Spark的数据处理和转换函数以及MLlib的特征处理函数进行数据的预处理。 2. 特征工程 特征工程是机器学习过程中非常重要的一步,它可以帮助我们选择和构建合适的特征,减少噪声数据对模型的影响。MLlib提供了一系列特征处理函数,如特征标准化、特征编码、特征提取等,可以帮助用户方便地进行特征工程的实践。 3. 模型训练 MLlib支持多种机器学习算法,包括分类、回归、聚类和推荐系统等,用户可以选择合适的算法对数据进行建模和训练。在模型训练过程中,需要进行参数选择和调优,可以通过交叉验证等方法选择最佳的模型和参数。 4. 模型评估和选择 在训练和调优完成后,需要对训练好的模型进行评估和选择。MLlib提供了多种模型评估指标和方法,如准确率、召回率、F1值等,可以帮助用户选择最佳的模型和参数。 5. 预测和应用 在训练和评估好模型之后,就可以使用训练好的模型进行预测和应用了。MLlib提供了预测函数和模型保存与加载功能,可以帮助用户方便地进行模型应用。 总之,MLlib提供了一系列丰富的机器学习算法和工具,并且能够处理大规模数据集,有着非常广泛的应用场景。对于需要对海量数据进行机器学习的用户来说,MLlib编程实践是非常重要的,需要深入理解其算法和实现方法,以便更好地应用到实际场景中。 ### 回答3: Spark机器学习MLlib是一个开源的大数据机器学习,它提供了一套强大的分布式机器学习工具,可以让我们在Spark中轻松地进行机器学习任务。 MLlib提供了许多常见的机器学习算法和工具,包括分类、回归、聚类、降维等,同时也支持常用的数据格式和数据预处理功能。同时,它还提供了很多便利的函数和工具,使得我们可以很方便地处理大规模数据集。 在进行MLlib编程实践时,我们需要掌握以下几个方面的知识: 1. 数据准备与处理:在进行机器学习任务之前,我们需要对数据进行预处理和准备。这包括数据清洗、特征提取、特征缩放、数据转化等,MLlib提供了许多工具和函数来帮助我们完成这些任务。 2. 算法选择与调优:根据我们的任务需求和数据特征,我们需要选择合适的机器学习算法,MLlib提供了常见的分类、回归、聚类、降维算法,我们需要根据具体情况进行选择和调优。 3. 模型训练和预测:在算法选择和调优完成后,我们需要对数据集进行模型训练和预测。这包括模型的拟合、评估、优化等。MLlib提供了很多训练和评估模型的函数和工具。 4. 分布式计算:MLlib是在分布式环境下运行的,因此我们需要掌握Spark集群的搭建和优化,以充分利用分布式计算的优势,提高计算效率和速度。 在进行MLlib编程实践时,我们需要先熟悉Spark的基本操作和RDD编程模型,然后进一步学习MLlib的API和使用规则。同时,我们还需要深入了解机器学习算法和常见的数据处理和挖掘技术,以便对数据进行准备和处理。 总之,通过使用Spark机器学习MLlib,我们可以快速地进行大规模数据集的机器学习任务,从而获得更多的洞见和价值。通过MLlib编程实践,我们可以提高自己的机器学习和大数据处理能力,从而更好地应对现代数据科学的挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值