在大数据领域,处理数据并获取洞察是核心目标。Apache Spark使得可以构建包含机器学习支持的数据管道,这意味着可以实时进行训练和预测。Spark ML库(MLlib)是基于Spark DataFrame API实现机器学习操作的库。MLlib支持多种数据源,包括Parquet、CSV、JSON、JDBC等,并且有专门的库用于图像和LIBSVM数据类型,支持标签列数据和特征向量。
SparkMLlib提供了从原始数据中轻松提取特征的功能,包括特征提取、降维、字符串分词等任务。MLlib支持监督学习和无监督学习,可以在Spark中创建图像和音频分类器,也可以借助MLlib进行聚类。Spark还可以用于实时计算机视觉任务。对于特定任务,可以安装外部Spark包。可以使用Transformers、Estimators和Pipeline API构建机器学习管道。
将在Spark中实现一个回归模型,包括获取Spark ML和统计库、进行基本统计操作、构建简单的线性回归模型、训练和评估。
安装和设置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 Context Class
sc = SparkContext()
# spark session
spark = SparkSession.builder.appName("PythonSpark DataFrames Machine learning").config("spark.some.config.option", "some-value").getOrCreate()
在本文中,将主要介绍四个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 Spark在Python中的机器学习能力。然后讨论了构建机器学习管道的步骤,Spark支持许多附加包用于特定任务。Spark支持计算机视觉和自然语言处理。Spark可以用于构建计算机视觉和自然语言处理任务的管道。
Q1. 如何在PySpark中归一化?
A. 在PySpark中归一化涉及使用MLlib库中的StandardScaler或Min-Max Scaler函数来缩放数值数据到特定范围,使特征可比,并提高机器学习模型性能。
Q2. Spark中的归一化是什么?
A. Spark中的归一化,像PySpark一样,是将数值数据缩放到标准范围的过程,例如0到1之间,以确保特征在同一尺度上进行公平比较,并减轻不同特征尺度对机器学习模型的影响。