在本文中,将探讨如何使用MLIB库构建一个端到端的线性回归模型,该模型能够预测客户在公司产品上的年消费额。将从一个完全虚拟的数据集开始,这个数据集是为了帮助理解使用MLIB构建连续数据模型的概念而生成的。
在进入机器学习过程并遵循预测客户年消费的步骤之前,需要初始化Spark会话并读取虚拟数据集,这些数据集包含了所有相关特征。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('E-commerce').getOrCreate()
通过上述代码,成功导入了PySpark的SQL包中的SparkSession对象,并使用getOrCreate()函数创建了环境。在创建之前,使用builder函数构建它,并命名为“E-commerce”。
data = spark.read.csv("Ecommerce_Customers.csv",inferSchema=True,header=True)
在上述代码行中,读取了电子商务数据,并保持inferSchema参数为True,以便它返回数据集所具有的真实数据类型,并将header设置为True,以便记录的第一行被视为标题。
data.printSchema()
使用printSchema()函数显示数据集包含的每列的信息,通过查看输出,可以看到数据类型。
将通过三种不同的方式查看数据集,以便更精确地进行分析。
data.show()
show()函数返回数据的前20行。
data.head()
head()函数返回一个完整的记录/元组。
for item in data.head():
print(item)
通过for循环和head函数的组合,可以迭代每个项目,并以更清晰的版本显示Row对象的输出。
from pyspark.ml.regression import LinearRegression
将预测客户在产品上的年支出,因此需要处理连续数据,当处理这种类型的数据时,需要使用线性回归模型。
在本节中,将执行所有数据预处理技术,使数据集准备好进入ML管道,以便模型能够轻松适应并构建一个高效的模型。
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
将查看数据集中哪些列存在,并使用describe方法获取更多信息。
data.columns
describe方法将帮助了解哪些列可以用于模型开发阶段,因为机器学习涉及数学计算,只有数字类型的列被接受。
assembler = VectorAssembler(
inputCols=["Avg Session Length", "Time on App",
"Time on Website",'Length of Membership'],
outputCol="features")
使用VectorAssembler方法将所有特征列堆叠在一起,并返回为“features”列。
output = assembler.transform(data)
Transform函数用于将实际数据与在assembler变量中使用VectorAssembler函数所做的更改相适应,以便更改反映在实际数据集中。
output.select("features").show()
使用select函数,仅从数据集中选择features列,并使用show()函数以DataFrame的形式显示。
final_data = output.select("features",'Yearly Amount Spent')
将依赖特征堆叠(命名为features)和独立特征一起连接,并命名为final_data,此框架将在后续过程中进一步分析。
在模型构建的这一步中,将数据分为训练集和测试集,训练数据将用于构建模型,而测试数据将用于测试模型的性能。
train_data,test_data = final_data.randomSplit([0.7,0.3])
使用随机分割方法将70%的数据存储在train_data中,30%的数据存储在test_data中。
train_data.describe().show()
test_data.describe().show()
describe方法似乎是分析和比较训练和测试数据差异的准确方法,可以看到训练集中有349条记录,而测试集中有151条记录。
最后,来到了构建线性回归模型的步骤,使用LinearRegression对象,并将“Yearly Amount Spent”列传递给labelCol参数,这是独立列。
lr = LinearRegression(labelCol='Yearly Amount Spent')
现在,已经创建了Linear Regression对象,可以轻松地适应数据,即可以通过将训练数据传递到fit方法来进行模型训练。
lrModel = lr.fit(train_data)
让打印模型训练的每个特征的系数和截距,这是将了解模型如何单独涉及每个独立变量的信息之一。
print("Coefficients: {} Intercept: {}".format(lrModel.coefficients,lrModel.intercept))
系数:[25.324513354618116,38.880247333555445,0.20347373150823037,61.82593066961652] 截距:-1031.8607952442187
在这一步中,将评估模型,即将分析模型的性能,并在模型部署阶段决定是否使用现有的模型。
test_results = lrModel.evaluate(test_data)
对于了解线性回归背后的数学直觉的人来说,必须知道残差=原始结果-预测结果,即模型预测的标签列结果与原始结果之间的差异。
test_results.residuals.show()
现在是从模型中进行预测的时候了,首先存储未标记的数据,即特征数据,并将其转换,以便发生变化。
unlabeled_data = test_data.select('features')
predictions = lrModel.transform(unlabeled_data)
predictions.show()