Prognozowanie wyjściowej mocy elektrowni w cyklu kombinowanym przy użyciu modelu regresji liniowej (część 1)

Dzisiaj zajmujemy się prognozowaniem wyjściowej mocy elektrowni przy użyciu modelu regresji liniowej.

Regresja liniowa

Użycie klasycznych modeli regresji liniowej może okazać się bardzo skutecznym narzędziem w procesie optymalizacji procesów wytwórczych. Jednoczynnikowa i wieloraka regresja liniowa powstała na bazie metody najmniejszych kwadratów opisanej w 1805 roku i spopularyzowanej przez francuskiego matematyka Adrien-Marie Legendre.

Pracochłonność oraz wysokie wymagania merytorycznie przy modelowaniu procesów były głównym powodami małej popularności tej metody optymalizacji.

Pojawienie się komputerów osobistych, dynamiczny wzrost wydajności ich wydajności oraz upowszechnienie programowania w językach R oraz Python spowodowało wzrost zainteresowania wykorzystaniem złożonych narzędzi ekonometrycznych.

W tej publikacji chciałbym przedstawić przykład zastosowania modelu regresji wielorakiej wykorzystując zbiór danych opracowanych przez naukowców z Namık Kemal University.

(Pınar Tüfekci, Çorlu Wydział Inżynierii, Namık Kemal University, TR-59860 Çorlu, Tekirdağ, Turcja)

Źródło danych: https://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant

Forma artykułu

W tej i w następnej części tej publikacji przedstawiony został proces tworzenia modeli prostej regresji liniowej. Autor artykułu zrezygnował z przedstawiania tego procesu w formie wzorów matematycznych ponieważ uznał, że bardziej praktycznie będzie pokazanie użycie nowoczesnych bibliotek języka Python. Wszystkie wykorzystane tu narzędzia ją bezpłatne i powszechnie dostępne w Internecie. W tej publikacji wykorzystana została głównie biblioteka statsmodels zbudowaną na bazie pakietów NumPy i SciPy języka Python. Wszystkie operacje zostały przeprowadzone w notatniku Jupyter należącym do bezpłatnego pakietu Anaconda. Czytelnik wprowadzając podany w publikacji kod uzyska te same wyniki, co może stanowić zachętę do głębszego zainteresowania zaprezentowanymi tutaj narzędziami.

Przegląd danych

Zbiór danych zawiera 9568 pomiarów z 6 lat (2006-2011), zebranych w elektrowni o cyklu łączonym. Podczas pomiaru elektrownia była wykorzystywana do pracy z pełnym obciążeniem.

Przedmiotem pomiaru były następujące zmienne:

  • średnie godziny zmienne temperatury temperatury (T),
  • zawartości satelitarne (R)
  • wilgotność względna (RH)
  • próżnia spalin (V).

Te zmienne niezależne umożliwiały przegląd godzinowej wydajności energii elektrycznej netto (EP).

Elektrownia o cyklu kombinowanym (CCPP) składa się z turbin gazowych (GT), turbin parowych (ST) i generatorów pary z odzyskiem ciepła. W elektrowni typu CCPP energia elektryczna jest wytwarzana przez turbiny gazowe i parowe, które są powiązane w jednym cyklu i gdzie nośniki energii są przenoszone z jednej turbiny do drugiej. Podczas gdy mierzona próżnia ma wpływ na turbinę parową, pozostałe trzy zmienne oddziaływania wpływają na wydajność turbin gazowych GT.

Prognozowanie przy użyciu modelu regresji liniowej

Otwieramy źródło danych i potrzebne biblioteki języka Python. Obliczenia zostały przeprowadzone w notatniku Jupyter. 

import pandas as pd
import numpy as np
import itertools
from itertools import chain, combinations
import statsmodels.formula.api as smf
import scipy.stats as scipystats
import statsmodels.api as sm
import statsmodels.stats.stattools as stools
import statsmodels.stats as stats
from statsmodels.graphics.regressionplots import *
import matplotlib.pyplot as plt
import seaborn as sns
import copy
#from sklearn.cross_validation import train_test_split
import math

## https://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant

df = pd.read_excel('c:/1/Folds5x2_pp.xlsx')
df.sample(5)

Zbiór pomiarów ma postać tabeli, gdzie kolumny reprezentują zmienne niezależne. Ostatnia kolumna oznaczona jako PE reprezentuje zmienną zależną (wynikową).

Poniżej została przeprowadzona analiza wielkość zbioru i formatu danych.

df.shape

Dane składają się z 9 568 wierszy w pięciu kolumnach.

(9568, 5)

df.dtypes

Dane mają postać liczbową.

Dla lepszej czytelności zmieniamy oznaczenia kolumn.

df.columns

df.columns = ['Temperature', 'Exhaust_Vacuum', 'Ambient_Pressure', 'Relative_Humidity', 'Energy_output']
df.sample(5)

Nazwy kolumn zostały zmienione.

Warunki podstawowe przy zastosowaniu modelu regresji liniowej

Niedotrzymanie podstawowych warunkami regresji może prowadzić do stworzenia modelu nie odzwierciedlającego prawdziwych relacji pomiędzy zmiennymi niezależnymi i zmienną zależną.

  • Między predyktorami i zmienną wynikową musi być zachowana relacja liniowa.
  • Nie może istnieć silna korelacja pomiędzy zmiennymi niezależnymi.
  • Wartości resztkowe powinny mieć rozkład normalność. Indywidualne reszty modelu powinny być podobne w swej zbiorowości oraz mieć rozkład normalny.
  • Homogeniczność wariancji - wariancja błędu powinna być stała.
  • Niezależność - błędy związane z jedną obserwacją nie mogą być skorelowane z błędami innych obserwacji.

Analiza danych liniowych między zmienną zależną a zmiennymi niezależnymi

CORREL = df.corr().sort_values('Energy_output')
CORREL['Energy_output']

Test korelacji ujawnił bardzo dużą korelację ujemną Temperatury i Próżni spalin z wartością produkowanego prądu.

  Zakresy zmiennych niezależnych: 

Zestawienie zawiera minimalne i maksymalne wahania wartości zmiennych egzogenicznych:

  • Temperatura (T) w zakresie od 1,81 ° C do 37,11 ° C,
  • Obejmuje powierzchnię (AP) w zakresie od 992,89 do 1033,30 milibara,
  • Wilgotność względna (RH) w zakresie od 25,56% do 100,16%
  • Próżnia spalin (V) w zakresie od 25,36 do 81,56 cm Hg

Dane są pobierane z czujników rozmieszczonych w zakładzie, które co sekundę rejestrują zmienne otoczenia. Zmienne nie zostały objęte normalizacji (standaryzacją danych).

  • Zmienna zależna (wynikowa) to godzinowa produkcja energii elektrycznej netto (EP) zarejestrowana w zakresie od 420.26 do 495,76 MW

Jak wspomnieliśmy istnieje bardzo wysoka korelacja ujemna między zmienną wynikową produkcją energii elektrycznej (EP) a temperatura i próżnia spalin.

Jednoczynnikowy model regresji liniowej

lm = smf.ols(formula = 'Energy_output ~ Temperature', data = df).fit()
lm.summary()

Jednoczynnikowy model regresji w oparciu o zakresy dostępne są najlepsze właściwości prognostyczne.

plt.figure()
plt.scatter(df.Temperature, df.Energy_output, c = 'grey')
plt.plot(df.Temperature, lm.params[0] + lm.params[1] * df.Temperature, c = 'r')
plt.xlabel('Temperature')
plt.ylabel('Energy_output')
plt.title("Linear Regression Plot")

Parametr r2 ujawnia niezwykle dobre właściwości predykcyjne modelu. Poniższy wykres obrazuje jak dobry jest wykonany przez nas model.

Wieloczynnikowy model regresji liniowej

lm = smf.ols(formula = 'Energy_output ~ Temperature + Exhaust_Vacuum + Relative_Humidity + Ambient_Pressure', data = df).fit()
print (lm.summary())

Model wieloczynnikowej regresji liniowej cechuje się doskonałymi zdolnościami predykcyjnymi. Dlatego jego wyniki wzbudzają niepokój.

 Analiza danych użytych do budowy modelu 
df.describe()

 

 Analiza rozkładu zmiennej wynikowej 
plt.rcParams['figure.figsize'] = (5, 4)
sns.distplot(df['Energy_output'])    

Wykres rozkładu prawdopodobieństwa wykazał istnienie dwóch ekstremów (wykres bimodalny).

 Analiza korelacji pomiędzy zmiennymi niezależnymi 
plt.rcParams['figure.figsize'] = (5, 4)
sns.heatmap (df.corr (), cmap="YlGnBu")

Jak pamiętamy jednym z warunków prawidłowego modelu regresji liniowej jest brak korelacji pomiędzy zmiennymi egzogenicznymi.

Widać wyraźnie że między zmiennymi opisującymi ‘Temperature" oraz "Exhaust_Vacuum" występują bardzo wysokie korelacje dodatnie.

Poniżej przedstawiłem inną formę prezentacji tej samej macierzy korelacji.

sns.heatmap (df.corr (), cmap="coolwarm", annot=True, cbar=False)

 

 Sprawdzamy czy pomiary są kompletne 
df.isnull().sum()

Graficzna analiza wpływu zmiennych niezależnych na zmienną wynikową

Aby zobaczyć jaki jest wpływ wszystkich zmiennych niezależnych na zmienną zależną dzielę zbiór zmiennych wynikowych na dwie części. Do tabeli danych zostaje dodana kolumna zawierająca dwa stany produkcji energii.

Ewa = ['małą moc', 'duża moc']

df['moc'] = pd.qcut(df['Energy_output'],2, labels=Ewa)
df.sample(2)

 

Tworzymy wykres zależności.

sns.pairplot(data=df[['Temperature' ,'Exhaust_Vacuum','Ambient_Pressure', 'Relative_Humidity', 'moc']], hue='moc', dropna=True, height=2)

 

Wykres zależności kolejny raz wykazał wysoką korelację wzorów między Temperaturą (T) i Próżnią spalin (V) .

sns.jointplot(x='Temperature', y='Exhaust_Vacuum', data=df)

W drugiej części tego artykułu przeprowadzony zostanie proces weryfikacji warunków podstawowych tworzenia liniowej regresji wielorakiej.