Apache Spark MLlib与Python实现数据科学

在大数据领域,处理数据并获取洞察是核心目标。Apache Spark使得可以构建包含机器学习支持的数据管道,这意味着可以实时进行训练和预测。Spark ML库(MLlib)是基于Spark DataFrame API实现机器学习操作的库。MLlib支持多种数据源,包括Parquet、CSV、JSON、JDBC等,并且有专门的库用于图像和LIBSVM数据类型,支持标签列数据和特征向量。

MLlib的特点

SparkMLlib提供了从原始数据中轻松提取特征的功能,包括特征提取、降维、字符串分词等任务。MLlib支持监督学习和无监督学习,可以在Spark中创建图像和音频分类器,也可以借助MLlib进行聚类。Spark还可以用于实时计算机视觉任务。对于特定任务,可以安装外部Spark包。可以使用Transformers、Estimators和Pipeline API构建机器学习管道。

目标

将在Spark中实现一个回归模型,包括获取Spark ML和统计库、进行基本统计操作、构建简单的线性回归模型、训练和评估。

安装Pyspark

安装和设置Pyspark非常简单。使用pip包管理器,可以在任何Python环境中安装Pyspark。

!pip install pyspark !pip install findspark import findspark findspark.init()

导入所需库

import pandas as pd import matplotlib.pyplot as plt from pyspark import SparkContext, SparkConf from pyspark.sql import SparkSession

创建Spark会话和上下文

需要创建一个Spark会话来加载数据帧。

# Spark Context Class sc = SparkContext() # spark session spark = SparkSession.builder.appName("PythonSpark DataFrames Machine learning").config("spark.some.config.option", "some-value").getOrCreate()

Spark ML库

在本文中,将主要介绍四个SparkMl函数。有关ML库的更多信息,请参阅此链接。

特征库(pyspark.ml.feature):特征库用于创建特征向量并处理它们,包含VectorAssembler、Normalizer、StandardScaler等。

统计库(pyspark.ml.stat):统计库用于统计任务,如相关性、假设检验、标准差等。

回归库(pyspark.ml.regression):回归库包含回归模型。

from pyspark.ml.feature import VectorAssembler, Normalizer, StandardScaler from pyspark.ml.stat import Correlation from pyspark.ml.regression import LinearRegression

加载数据和创建特征向量

使用pandas数据帧加载数据,然后使用MLlib类将数据帧转换为特征向量以构建模型。

cars = pd.read_csv('https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBM-BD0225EN-SkillsNetwork/labs/data/cars.csv',header=None, names=["mpg", "hp", "weight"])

只对加载三个列感兴趣,即mpg(每加仑英里数)、hp(马力)和weight(重量)。

sdf = spark.createDataFrame(cars) sdf.printSchema()

特征向量用于在Spark中与ML模型一起工作。使用VectorAssembler函数,可以将数据帧的列转换为特征向量。

assembler = VectorAssembler(inputCols=["hp", "weight"], outputCol="features") output = assembler.transform(sdf).select('features','mpg')

这里的输出是一个Spark数据帧,包含features和mpg列。

将数据集分割为训练和测试

train, test = output.randomSplit([0.75, 0.25])

75%的数据将用于训练,25%的数据将用于测试。

特征工程和统计

在这部分,执行特征工程和基础统计,通过创建新特征和丢弃冗余特征来改进训练数据。这个过程涉及研究数据,了解不同的特征向量如何工作以及它们之间的关系。使用统计学来理解特征之间的关系。

Spark ML提供了内置的统计函数。可以使用统计库中的相关性函数来确定hp和weight之间的不同类型相关性。

r1 = Correlation.corr(train, "features","pearson").head() print("Pearson correlation matrix:n" + str(r1[0])) r2 = Correlation.corr(train, "features", "spearman").head() print("Spearman correlation matrix:n" + str(r2[0]))

观察到特征(“weight”和“hp”)之间存在0.86(或86%)的相关性。这是合理的,因为马力更大的车辆很可能有更大的发动机,因此更重。

可以可视化马力和重量之间的相关性。

plt.figure() plt.scatter(cars["hp"], cars["weight"]) plt.xlabel("horsepower") plt.ylabel("weight") plt.title("Correlation between Horsepower and Weight") plt.show()

归一化有助于模型更有效地收敛和更快地训练。在训练之前归一化特征向量是一个好习惯。归一化将值的范围移动到0和1之间。

Spark ML lib提供了Normalizer类来归一化特征向量。

normalizer = Normalizer(inputCol="features", outputCol="features_normalized", p=1.0) train_norm = normalizer.transform(train) print("Normalized using L^1 norm") train_norm.show(5, truncate=False)

这是一种缩放特征的技术,使得所有特征列具有0均值和1单位方差。这创建了一个钟形分布。

标准缩放不限制数据值在某个特定范围内。Spark提供了StandardScaler进行标准化。

standard_scaler = StandardScaler(inputCol="features", outputCol="features_scaled") train_model = standard_scaler.fit(train) train_scaled = train_model.transform(train) train_scaled.show(5, truncate=False)

注意:如果正在缩放训练数据,也必须使用相同的拟合缩放类来缩放测试数据。

test_scaled = train_model.transform(test) test_scaled.show(5, truncate=False)

模型构建和训练

在这一步,已经准备好了缩放特征向量。将使用Spark内置的回归模型对标准化的特征进行训练。

lr = LinearRegression(featuresCol='features_scaled', labelCol='mpg', maxIter=100) lrModel = lr.fit(train_scaled)

系数和截距

print("Coefficients: %s" % str(lrModel.coefficients)) print("Intercept: %s" % str(lrModel.intercept))

摘要

trainingSummary = lrModel.summary print("RMSE: %f" % trainingSummary.rootMeanSquaredError) print("R-squared: %f" % trainingSummary.r2)

RMSE : 4.11 → 模型预测mpg的平均误差为4.11单位。

lrModel.coefficients → 返回回归系数。

预测阶段

一旦模型训练完成,可以使用transform()函数获得新的未见过的缩放数据的预测。

lrModel.transform(test_scaled).show(5)

如所见,mpg(真实mpg)和预测(预测mpg)非常接近,平均误差为4.11单位。

本文讨论了Apache SparkPython中的机器学习能力。然后讨论了构建机器学习管道的步骤,Spark支持许多附加包用于特定任务。Spark支持计算机视觉和自然语言处理。Spark可以用于构建计算机视觉和自然语言处理任务的管道。

Q1. 如何在PySpark中归一化?

A. 在PySpark中归一化涉及使用MLlib库中的StandardScaler或Min-Max Scaler函数来缩放数值数据到特定范围,使特征可比,并提高机器学习模型性能。

Q2. Spark中的归一化是什么?

A. Spark中的归一化,像PySpark一样,是将数值数据缩放到标准范围的过程,例如0到1之间,以确保特征在同一尺度上进行公平比较,并减轻不同特征尺度对机器学习模型的影响。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485