登录
首页精彩阅读如何使用线性回归分析来预测发电厂的发电量
如何使用线性回归分析来预测发电厂的发电量
2016-10-17
收藏

如何使用线性回归分析来预测发电厂的发电量

在这篇文章中,我将会教大家如何通过拟合一个线性回归模型来预测联合循环发电厂(CCPP)的发电量。这个数据集则来自于UCI Machine Learning Repository。这个数据集包含5列,也就是说,它包含环境温度(AT)、环境压力(AP)、相对湿度(RH)、抽真空(EV)已经发电厂的电网每小时的发电量。前面4个变量作为属性,最后一个则作为因变量。

读取和分解数据

由于数据是xlsx格式,我们需要xlsx包。我们将提取数据文件中的第一个表格。

  1. library(xlsx)
  2. powerData <- read.xlsx('Folds5x2_pp.xlsx', 1)
  3. head(powerData)
  4. AT V AP RH PE
  5. 1 14.96 41.76 1024.07 73.17 463.26
  6. 2 25.18 62.96 1020.04 59.08 444.37
  7. 3 5.11 39.40 1012.16 92.14 488.56
  8. 4 20.86 57.32 1010.24 76.64 446.48
  9. 5 10.82 37.50 1009.23 96.62 473.90
  10. 6 26.27 59.44 1012.23 58.77 443.67

接下来,我们需要把数据集分成训练数据集和测试数据集。就像它们的名字所暗示的那样,训练数据集用于训练和建立模型,然后使用测试数据集对模型进行测试。现在,我们把75%的数据集作为训练数据集,和25%的数据作为测试数据集。我们可以按照下面的步骤操作:

  1. set.seed(123)
  2. split <- sample(nrow(powerData), size = floor(0.75 * nrow(powerData)))
  3. trainData <- powerData[split, ]
  4. testData <- powerData[-split, ]
  5. head(trainData)
  6. head(testdata)
  7. AT V AP RH PE
  8. 2752 29.14 67.45 1015.51 46.47 433.34
  9. 7542 24.67 70.94 1007.99 75.64 443.51
  10. 3913 20.84 51.19 1008.63 84.11 448.98
  11. 8447 31.73 74.67 1016.38 44.51 425.34
  12. 8995 4.44 38.44 1016.14 75.35 486.53
  13. 436 9.43 37.14 1013.03 74.99 473.57
  14. rating age yearsmarried religiousness prob
  15. 1 3.93178 17 8.177696 3.116473 0.3350834
  16. 2 3.93178 27 8.177696 3.116473 0.2615373
  17. 3 3.93178 37 8.177696 3.116473 0.1992953
  18. 4 3.93178 47 8.177696 3.116473 0.1488796
  19. 5 3.93178 57 8.177696 3.116473 0.1094738

现在,让我解释一下上面每一条指令所代表的含义。

第一,我们使用set.seed()函数使得数据具有可重复性。

然后,我们创建一个序列,使得它整个的长度等于数据集的行数。这些数字则作为这个数据集的索引。我们随机的从序列中选择75%的数据并把它存放到变量split中。

最后,我们把索引数组里所隐含的所有的行都复制到训练数据集中,把剩下的数据则放到测试数据集中。

建立预测模型

现在,让我们预测一下这个模型。我们会使用lm()函数。

  1. predictionModel <- lm(PE ~ AT + V + AP + RH, data = trainData)

上面的这个函数将会尝试从AP、V、AP和RH来推测PE。由于我们使用了数据集里的所有变量,一个更简短的代码为(如果这个数据集的变量非常多,这样写效果会很不错):

  1. predictionModel <- lm(PE ~ ., data = trainData)

我们现在用summary()来汇总一下这个模型:

  1. summary(predictionModel)
  2. Call:
  3. lm(formula = PE ~ ., data = trainData)
  4. Residuals:
  5. Min 1Q Median 3Q Max
  6. -43.363 -3.148 -0.140 3.162 17.763
  7. Coefficients:
  8. Estimate Std. Error t value Pr(>|t|)
  9. (Intercept) 450.764756 11.331102 39.781 < 2e-16 ***
  10. AT -1.978787 0.017599 -112.435 < 2e-16 ***
  11. V -0.232049 0.008415 -27.575 < 2e-16 ***
  12. AP 0.065590 0.010993 5.967 2.54e-09 ***
  13. RH -0.155561 0.004829 -32.214 < 2e-16 ***
  14. ---
  15. Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  16. Residual standard error: 4.574 on 7171 degrees of freedom
  17. Multiple R-squared: 0.9284, Adjusted R-squared: 0.9284
  18. F-statistic: 2.326e+04 on 4 and 7171 DF, p-value: < 2.2e-16

这样帮助我们决定哪些变量在这个模型中具有相关性。一个线性模型的表达式可以写成 y_i = β_1 x_i1 + β_2 x_i2 + β_3 x_i3 + ⋯ + ε,其中y_i代表模型的预测输出,即因变量(PE)的预测值,而x_i则代表各个变量属性(AT、V、AP和RH),而β则代表系数,ε代表一个常数项。

summary的第一行,它列举了一些预测值。第一个值与ε有关,而剩下的则为各种属性变量的系数,如果这些系数为0或者接近0,说明这几个变量对预测几乎没有什么影响。因此, 我们需要把它们剔除掉。表示残差的那一列给出了一些估计值,表明了这些系数的变化幅度有多大。t值通过划分标准差列而计算出来的估计值。最后一列则预测这些系数(p(>|t|)的可能性,它与t值成反比。预测,一个属性计算出较高的t值或是较低的Pr(>|t|)的绝对值是可以接受的。

想要判断哪些变量具有较强的相关性,我们则可以通过观察它们的星星数进行判断。后面带三颗星的表明这种变量相关性最强。接下来是两颗星,最不想关的则为一颗星。变量的特征本身是否重要则通常没有被包含到预测模型的预测当中,如何这个变量与其它毫不相干,则这些变量都不重要了。

在我们的模型中,我们可以看到所有变量都重要。当你要处理一个数据集,这里含有多个不想关的变量的时候,建议在此同时先把无关变量删去。这时因为变量之间是高度相关的,其它则可能是显著的。这就归于它的多重共线性。你可以在这里找到更多关于多重共线性的内容。

想要知道模型的精度,最简单的方法就是查看它的判定系数。summary里提供了两个判定系数,即多重判定系数和调整判定系数。多重判定系数的计算过程如下:
多元判定系数=1-SSE/SST,其中:

SSE代表残差平方和。残差就是预测值与真实值之间的差,并可以由predictionModel$residuals来估算。

SST就是总平方和。它可以由真实值和均值之差的平方和计算出来。

比如说,我们有5、6、7和8这4个数,而模型的预测值分别为4.5,6.3,7.2和7.9。

然后,SSE可以这样计算:SSE = (5 – 4.5) ^ 2 + (6 – 6.3) ^ 2 + (7 – 7.2) ^ 2 + (8 – 7.9) ^ 2,而SST则要这样计算:mean = (5 + 6 + 7 + 8) / 4 = 6.5; SST = (5 – 6.5) ^ 2 + (6 – 6.5) ^ 2 + (7 – 6.5) ^ 2 + (8 – 6.5) ^ 2。

调整判定系数和多重判定系数很相似,但是它由变量的个数来决定。这意味着,在预测模型中,每增加一个变量,其调整判定系数也随之增加。但是,如果一个变量在预测模型中显示不相关,调整判定系数也会下降。关于更多判定系数的信息,请看这里。

调整判定系数为1的时候意味着,这是一个完美的预测模型;如果它为0,说明它没有在基准模型上有任何提高(基准模型就是预测它总与均值相等)。从summary来看,我们看到判定系数为0.9284,相当高了

测试预测模型

现在,我们使用测试数据集来预测模型了。

  1. prediction <- predict(predictionModel, newdata = testData)

现在,观察一下最初几个预测值,并与测试数据集上的PE的真实值作比较:

  1. head(prediction)
  2. 2 4 12 13 14 17
  3. 444.0433 450.5260 456.5837 438.7872 443.1039 463.7809
  4. head(testData$PE)[1] 444.37 446.48 453.99 440.29 451.28 467.54

对于PE的真实值为444.37,我们的预测值为440.0433,而对于446.48,其预测值为450.5260,以此类推。

我们可以基于上面的利用测试数据集而模拟出的模型来计算其判定系数:

  1. SSE <- sum((testData$PE - prediction) ^ 2)
  2. SST <- sum((testData$PE - mean(testData$PE)) ^ 2)
  3. 1 - SSE/SST
  4. 0.9294734

这里,我们来到了文章的末尾。我希望你能在此感到很享受,找到了它的价值。

数据分析咨询请扫描二维码

客服在线
立即咨询