使用Apache Spark进行预测性数据分析--回归分析篇

本文是Boutros El-Gamil的使用Apache Spark进行预测性数据分析系列文章的第五篇,http://www.data-automaton.com/2019/01/15/predictive-data-analytics-with-apache-spark-part-5-regression-analysis/

前四篇分别是

  1. 使用Apache Spark进行预测性数据分析--简介篇

  2. 使用Apache Spark进行预测性数据分析--数据准备篇

  3. 使用Apache Spark进行预测性数据分析--特征工程篇

  4. 使用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 VectorAssemblerfrom pyspark.ml.stat import Correlationdef 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 featurestrain_ulr_corr = get_correlations(train_df, input_features)test_ulr_corr = get_correlations(test_df, input_features)
# print top positive correlated featuresprint("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 featuresprint("\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 msWall time: 9.49 s

3. 构建测试数据帧的特征向量

在获得最佳相关特征以达到目标变量(RUL)之后,我们构建了训练数据集的特征向量。该向量将在所有回归算法中用作测试数据向量。

# select features to be used into regression algorithmstrain = 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 vectortrain_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 instancelr = LinearRegression(featuresCol = 'features', labelCol = 'label', maxIter=100)

正如您在上一行中注意到的那样,我们将在训练数据向量中定义的名称传递给LinearRegression()函数,该名称用于独立特征(features)和目标变量(label)。我们还将LR算法的最大迭代次数设置为100。

4.2优化模型参数

如果要更改上面LinearRegression()函数的默认参数设置,可以通过在初始化对象时更改参数设置来实现:

# init LR instancelr = LinearRegression(featuresCol = 'features', labelCol = 'label',                       regParam=0.2, elasticNetParam=0.5, maxIter=200)

在上一行中,我们将最大迭代次数设置为200,将回归参数设置为0.2,并将弹性净参数设置为0.5。

4.3将线性回归模型拟合到训练数据向量

第二步是将LR模型拟合到我们的测试数据向量。

# fit linear regression modellr_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 vectortest_vector = test.rdd.map(lambda x: [x[5], Vectors.dense(x[0:5])]).toDF(['label','features'])

4.5获得预测

执行完上述步骤后,我们可以通过将测试向量传递给回归模型来获得预测:

# get predictionspred = lr_model.transform(test_vector)

4.6评估回归模型

建立了回归模型并将其应用于测试数据集后,就可以评估回归模型了。Apache Spark具有一些不错的功能,可以计算回归模型的基本评估指标。要使用它,我们需要初始化一个评估对象:

from pyspark.ml.evaluation import RegressionEvaluator# initialize regression evaluation instanceevaluator = RegressionEvaluator(predictionCol='prediction', labelCol='label')

现在,我们可以使用此评估实例计算一些不错的评估指标。以下代码行显示R Squared均方误差(MSE)均方根误差(RMSE)Mean Absolute Error(MAE)

# print evaluation metricsprint ("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 instanceglr = 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. depthmaxDepth = [5, 10]
# set tree max. number of binsmaxBins = [4, 8]
# build and evaluate decision tree regression modelfor 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.2109488013465084median MSE:  2021.0993725649312median RMSE:  44.956638804129156median MAE:  34.39000675943137 
maxDepth = 5 max Bins = 8 median R-Squared: 0.2587368658296212median MSE: 1949.072147238039median RMSE: 44.14829721787737median MAE: 36.04739104979992
maxDepth = 10 max Bins = 4 median R-Squared: 0.2615910842192609median MSE: 2361.48434721602median RMSE: 48.595106206448605median MAE: 39.69089356011583
maxDepth = 10 max Bins = 8 median R-Squared: 0.1925103581215516median MSE: 2983.7077209127956median RMSE: 54.623325795055685median MAE: 44.38078595510133
CPU times: user 640 ms, sys: 206 ms, total: 845 msWall time: 1min 4s

7.完整代码

可以在我的Github中(https://github.com/boutrosrg/Predictive-Maintenance-In-PySpark)中找到本教程的代码。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值