【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)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Lenhart001/article/details/131056343