本文是Boutros El-Gamil的使用Apache Spark进行预测性数据分析系列文章的第五篇,http://www.data-automaton.com/2019/01/15/predictive-data-analytics-with-apache-spark-part-5-regression-analysis/
前四篇分别是
使用Apache Spark进行预测性数据分析--简介篇
使用Apache Spark进行预测性数据分析--数据准备篇
使用Apache Spark进行预测性数据分析--特征工程篇
使用Apache Spark进行预测性数据分析--PCA篇
1.将Parquet数据文件导入Spark数据帧
在上一篇文章的末尾,我们将训练和测试数据帧保存为.parquet数据文件。现在我们想将这些文件检索为Spark Dataframes。以下代码行完成了这项工作。
# Load data from file 'train_FD001_preprocessed.parquet'
train_df = spark.read.parquet(os.getcwd() + '/' + path + 'train_FD001_preprocessed.parquet')
test_df = spark.read.parquet(os.getcwd() + '/' + path + 'test_FD001_preprocessed.parquet')
2.计算特征之间的相关性
建立回归模型的第一步是找到适合回归分析的数据特征子集。选择这些特征的最简单方法是计算目标变量(在我们的用例中是引擎的剩余可用寿命“ RUL”)和独立变量(说明了所有本机和生成的数据功能)之间的相关性 在前两个帖子中)。以下函数计算双方之间的皮尔逊相关性。
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.stat import Correlation
def get_correlations(df, features):
'''
this function returns list of correlations of numerical features of PySpark Dataframe
INPUTS:
@df: PySpark Dataframe
@features: list of columns' names to calculate correlations in between
OUTPUTS:
@sorted_corr_dict: list of @df feautres sorted by their correlations to the first feature
'''
# convert to vector column first
vector_col = "corr_features"
assembler = VectorAssembler(inputCols= features, outputCol=vector_col)
df_vector = assembler.transform(df).select(vector_col)
# get correlation matrix
r1 = Correlation.corr(df_vector, vector_col).head()
# get list of Pearson correlations between first feature (RUL) and all other features
corr_list = r1[0].toArray()[:1,:].tolist()[0]
# set dictionary of features and correlations
corr_dict = dict(zip(corr_list, input_features))
# sort dictionary by Pearson correlations
sorted_corr_dict = sorted(corr_dict.items(), key=operator.itemgetter(0))
return sorted_corr_dict
我们使用以下代码执行上述函数:
# get Pearson correlations between RUL and other numerical features
train_ulr_corr = get_correlations(train_df, input_features)
test_ulr_corr = get_correlations(test_df, input_features)
# print top positive correlated features
print("Top Positive Correlated Features (Train):\n")
for i in reversed(train_ulr_corr[-6:-1]):
print(i)
print("\nTop Positive Correlated Features (Test):\n")
for i in reversed(test_ulr_corr[-6:-1]):
print(i)
# print top negative correlated features
print("\nTop Negative Correlated Features (Train):\n")
for i in train_ulr_corr[0:5]:
print(i)
print("\nTop Negative Correlated Features (Test):\n")
for i in test_ulr_corr[0:5]:
print(i)
以下是这些行的输出:
Top Positive Correlated Features (Train):
(0.7891290976368206, 's12_rollingmean_4_scaled')
(0.7797179646508305, 's7_rollingmean_4_scaled')
(0.7743707880518276, 's12_rollingmean_4_norm')
(0.7733777137249406, 's7_rollingmean_4_norm')
(0.7117150656675688, 's12_rollingmean_4')
Top Positive Correlated Features (Test):
(0.54098279911739, 's12_rollingmean_4_norm')
(0.49366782512940416, 's7_rollingmean_4_norm')
(0.4751862708553446, 's12_rollingmean_4_scaled')
(0.4585230500478898, 's7_rollingmean_4_scaled')
(0.2875254965000236, 'PCA_2_scaled')
Top Negative Correlated Features (Train):
(-0.7888110654218343, 's4_rollingmean_4_scaled')
(-0.7757296788046874, 's4_rollingmean_4_norm')
(-0.7466390619110802, 's17_rollingmean_4_scaled')
(-0.7451601569134584, 's2_rollingmean_4_scaled')
(-0.7332185343637497, 's3_rollingmean_4_scaled')
Top Negative Correlated Features (Test):
(-0.5202779694027116, 'PCA_5_scaled')
(-0.5202779694027094, 'PCA_5_norm')
(-0.5202779694012791, 'PCA_5')
(-0.5094505130758384, 's4_rollingmean_4_norm')
(-0.4636488921403958, 's4_rollingmean_4_scaled')
CPU times: user 33.9 ms, sys: 13.4 ms, total: 47.3 ms
Wall time: 9.49 s
3. 构建测试数据帧的特征向量
在获得最佳相关特征以达到目标变量(RUL)之后,我们构建了训练数据集的特征向量。该向量将在所有回归算法中用作测试数据向量。
# select features to be used into regression algorithms
train = train_df.select(train_df["s12_rollingmean_4_norm"],train_df["s7_rollingmean_4_scaled"],
train_df["s12_rollingmean_4_scaled"],train_df["s4_rollingmean_4_norm"],
train_df["s4_rollingmean_4_scaled"],train_df["rul"])
# build train features vector
train_vector = train.rdd.map(lambda x: [x[5], Vectors.dense(x[0:5])]).toDF(['label','features'])
我们在这里选择了5个独立的特征来构建训练向量。您可以随意选择更多或更少的特征。
请注意,我们在训练向量的末尾添加了因变量“URL”。
请注意,独立变量集在训练向量和测试向量中都应完全兼容。在下面的回归建模过程中将构建测试向量。
4. 线性回归
4.1初始化线性回归实例
回归分析的第一步是设置LinearRegression()函数的新实例:
from pyspark.ml.regression import LinearRegression
# init LR instance
lr = LinearRegression(featuresCol = 'features', labelCol = 'label', maxIter=100)
正如您在上一行中注意到的那样,我们将在训练数据向量中定义的名称传递给LinearRegression()函数,该名称用于独立特征(features)和目标变量(label)。我们还将LR算法的最大迭代次数设置为100。
4.2优化模型参数
如果要更改上面LinearRegression()函数的默认参数设置,可以通过在初始化对象时更改参数设置来实现:
# init LR instance
lr = LinearRegression(featuresCol = 'features', labelCol = 'label',
regParam=0.2, elasticNetParam=0.5, maxIter=200)
在上一行中,我们将最大迭代次数设置为200,将回归参数设置为0.2,并将弹性净参数设置为0.5。
4.3将线性回归模型拟合到训练数据向量
第二步是将LR模型拟合到我们的测试数据向量。
# fit linear regression model
lr_model = lr.fit(train_vector)
在这里,我们通过将测试数据向量传递到上一步中创建的LR实例来构建回归模型。
4.4建立测试特征向量
第三步是建立与训练向量兼容的测试数据向量:
# select test features (with same features set as of train vector)
test = test_df.select(test_df["s12_rollingmean_4_norm"],test_df["s7_rollingmean_4_scaled"],
test_df["s12_rollingmean_4_scaled"],test_df["s4_rollingmean_4_norm"],
test_df["s4_rollingmean_4_scaled"],test_df["rul"])
# build test features vector
test_vector = test.rdd.map(lambda x: [x[5], Vectors.dense(x[0:5])]).toDF(['label','features'])
4.5获得预测
执行完上述步骤后,我们可以通过将测试向量传递给回归模型来获得预测:
# get predictions
pred = lr_model.transform(test_vector)
4.6评估回归模型
建立了回归模型并将其应用于测试数据集后,就可以评估回归模型了。Apache Spark具有一些不错的功能,可以计算回归模型的基本评估指标。要使用它,我们需要初始化一个评估对象:
from pyspark.ml.evaluation import RegressionEvaluator
# initialize regression evaluation instance
evaluator = RegressionEvaluator(predictionCol='prediction', labelCol='label')
现在,我们可以使用此评估实例计算一些不错的评估指标。以下代码行显示R Squared,均方误差(MSE),均方根误差(RMSE)和Mean Absolute Error(MAE)。
# print evaluation metrics
print ("R-squared= ", evaluator.setMetricName('r2').evaluate(pred))
print ("MSE= ", evaluator.setMetricName('mse').evaluate(pred))
print ("RMSE= ", evaluator.setMetricName('rmse').evaluate(pred))
print ("MAE= ", evaluator.setMetricName('mae').evaluate(pred))
4.7可视化评估
通过将上述步骤应用于部分引擎(引擎18、30、38、12、34),我们获得了如下图所示的评估结果。
5.广义线性回归
5.1初始化广义线性回归实例
通过执行上述相同步骤,我们可以使用以下代码构建另一个称为广义线性回归的回归模型:
from pyspark.ml.regression import GeneralizedLinearRegression
# init GLR instance
glr = GeneralizedLinearRegression(featuresCol = 'features', labelCol = 'label', family="gaussian",
link="identity", maxIter=50, regParam=l)
其中回归参数????可以取值[0,0.5,1,10,30,50]之一。
5.2可视化评估
通过使用不同输入参数的设置评估上述模型,我们可以比较每种设置的模型性能,并选择最准确的一种。
在上图中,我们发现将回归参数设置为0会生成最低的误差值。
6. 决策树
6.1初始化决策树回归实例
本文中的最后一个回归模型是决策树算法。在该算法中,我们将优化决策树的两个参数;也就是说,最大仓数(即实现更多特征分区)和最大深度(即从根到叶的最长路径的长度)。
from pyspark.ml.regression import DecisionTreeRegressor
# set tree max. depth
maxDepth = [5, 10]
# set tree max. number of bins
maxBins = [4, 8]
# build and evaluate decision tree regression model
for m1 in maxDepth:
for m2 in maxBins:
# init decision tree instance with parameters
dt = DecisionTreeRegressor(featuresCol = 'features', labelCol = 'label',
maxDepth=m1, maxBins=m2)
6.2评估
通过评估决策树模型,我们计算R平方,MSE,RMSE和MAE指标。结果如下:
maxDepth = 5 max Bins = 4
median R-Squared: 0.2109488013465084
median MSE: 2021.0993725649312
median RMSE: 44.956638804129156
median MAE: 34.39000675943137
maxDepth = 5 max Bins = 8
median R-Squared: 0.2587368658296212
median MSE: 1949.072147238039
median RMSE: 44.14829721787737
median MAE: 36.04739104979992
maxDepth = 10 max Bins = 4
median R-Squared: 0.2615910842192609
median MSE: 2361.48434721602
median RMSE: 48.595106206448605
median MAE: 39.69089356011583
maxDepth = 10 max Bins = 8
median R-Squared: 0.1925103581215516
median MSE: 2983.7077209127956
median RMSE: 54.623325795055685
median MAE: 44.38078595510133
CPU times: user 640 ms, sys: 206 ms, total: 845 ms
Wall time: 1min 4s
7.完整代码
可以在我的Github中(https://github.com/boutrosrg/Predictive-Maintenance-In-PySpark)中找到本教程的代码。