DEV Community

Cover image for Hogyan működik a trendszámítás
Code & Stats with Olivér
Code & Stats with Olivér

Posted on

Hogyan működik a trendszámítás

A trendszámítás fontos eszköz az adattudományban, ezért érdemes a matematikai alapokat is ismerni, nem csak azt, hogyan valósítsd meg a számítást egy adatelemző szoftverben. Ebben a blogbejegyzésben lépésről lépésre levezetem az eljárást.

Matematikai alapok

A trendszámítás során a cél, hogy találjunk egy olyan függvényt, amely a lehető legjobban illeszkedik az adatpontjainkra. Az adatpontokat tudjuk ábrázolni egy koordináta-rendszerben, ahol az x tengelyen az idő múlása, az y tengelyen pedig a mérni kívánt értékek szerepelnek. Ezek a mérni kívánt értékek lehetnek mondjuk egy vállalkozás adott időpontokban vett bevételei.

A kapcsolat az idő múlása és a bevételek között általában véve nem függvényszerű, tehát nem tudunk pontos értékkel szolgálni a t-edik időpontban arra vonatkozóan, hogy a vállalat bevétele miként alakul. A kapcsolat a két változó között sztochasztikus, ami a gyakorlatban azt jelenti, hogy az adatpontok alakulását véletlen hatások is befolyásolják.

A lenti példában egy lineáris függvénnyel fogunk közelíteni az adatpontokhoz. Az εi\varepsilon_i (epszilon) a véletlen hibakomponens, amely azt fejezi ki, hogy az i-edik megfigyelés mennyivel tér el az elméleti függvény által meghatározott értéktől.

yi=b0+b1⋅ti+εi y_i = b_0 + b_1 \cdot t_i + \varepsilon_i

SSE és MSE

Az SSE (Sum of Squared Errors), valamint az MSE (Mean Squared Error) számítások mindketten arra szolgálnak (legalábbis jelen számítás során), hogy mérjék a különbséget az illesztett egyenes és a tényleges értékek között. Ha kiszámolom adatpontonként a tényleges érték és az illesztett egyenes szerinti érték különbségeinek négyzeteit, majd ezeket összeadom, az az SSE. Ha ezt leosztom az adatpontok számával, az az MSE. Fontos megjegyezni, hogy valójában nem konkrét adatpontokra való illesztés a célunk hanem az, hogy az SSE felhasználásával olyan általános megoldást adjunk, ami bármilyen adott adatsorra kiszámíthatóvá teszi az optimális b0 és b1 paramétereket.
A képletekben szereplő jelölések jelentése:

  • yi: az i. adatpont tényleges (megfigyelt) értéke
  • ŷi: az i. adatponthoz tartozó, az illesztett egyenes szerinti (becsült) érték
  • n: az adatpontok száma
  • i: az adatpontok indexe (1-től n-ig)
  • ti: az i. időpont (1, 2, 3, 4, stb.)
  • b0: az egyenes y tengelymetszete
  • b1: az egyenes meredeksége
SSE=∑i=1n(yi−y^i)2 SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
MSE=∑i=1n(yi−y^i)2n MSE = \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{n}

A deriválás szerepe

Szeretnénk minimalizálni az adatpontokon vett MSE-t vagy SSE-t. Igazából mindegy is, hogy melyiket, tekintettel arra, hogy n jelen esetben konstans, így az 1/n szorzó kiesik, amikor a deriváltat nullával tesszük egyenlővé. (Egy pozitív konstanssal való szorzás nem változtatja meg, hogy hol van a függvény minimuma.) Ahol a derivált értéke nulla, ott úgynevezett stacionárius pontot találunk. Ez lehet lokális vagy globális minimum, illetve maximumpont, de nem feltétlenül szélsőérték: az x3 függvény deriváltja az origóban nulla, mégsem szélsőérték, hanem inflexiós pont. Többváltozós függvényeknél nyeregpont is előfordulhat.

Ami miatt ebben a konkrét esetben biztosan globális minimumpontot találunk, az a függvény alakja. Az SSE az egyenes paramétereinek (b0 és b1) másodfokú, felfelé nyíló (konvex) függvénye, ami a parabolához hasonlóan egyetlen minimumponttal rendelkezik.

A csavar az, hogy valójában egy kétváltozós függvényről beszélünk, emiatt parciális deriváltat alkalmazunk. Ilyenkor persze a parabola alak nem teljesen pontos kifejezés, mivel nem kettő, hanem három dimenzióban gondolkodunk: két tengelyen a b0 és b1, a harmadikon pedig az SSE értéke szerepel. Az SSE grafikonja egy úgynevezett konvex elliptikus paraboloid, de ezt nem szükséges tudni a számítás megértéséhez. A lenti ábra egy ilyen konvex paraboloid képét jeleníti meg.

Írjuk fel részletesen az SSE-t, hogy jobban lássuk, milyen problémával nézünk szembe! Az ŷi valójában egy függvény, amely rendelkezik b0 tengelymetszettel, valamint b1 meredekséggel, ami a ti-edik x-tengelybeli értékkel van szorozva minden adatponton.

SSE=∑i=1n(yi−y^i)2 SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
SSE=∑i=1n(yi−(b0+b1⋅ti))2 SSE = \sum_{i=1}^{n} \left(y_i - (b_0 + b_1 \cdot t_i)\right)^2

Mivel a szummák tagonként deriválhatók, elég egyetlen tagot megvizsgálni, és a szummát utána visszahelyezni. Vegyük el tehát egy percre a szumma jelet, hogy jobban lássuk a képletet! Az alábbi kifejezés parciális deriváltja szükséges b0 és b1 szerint. Ha parciálisan deriválunk, akkor minden változót konstansnak tekintünk, kivéve azt, amelyik szerint a deriválás végbemegy.
Geometriailag ez azt jelenti, hogy a felületet elmetsszük egy olyan síkkal, amelyben a többi változó értéke rögzített, és az így kapott görbe meredekségét vizsgáljuk az adott irányban. Úgy lehet elképzelni, mintha b0 szerinti deriváláskor b1 értékét befagyasztanánk, és egy golyót gurítanánk végig a felületen a b0 irányában. A derivált azt mutatja meg, hogy a golyó az adott pontban mennyire meredeken halad felfelé vagy lefelé. Ahol a golyó vízszintesen halad, ott a derivált (azaz a meredekség) nulla.

(yi−(b0+b1⋅ti))2 \left(y_i - (b_0 + b_1 \cdot t_i)\right)^2

b0 szerinti derivált

Itt yi és b1 · ti konstansnak számítanak, ezért a belső függvény deriváláskor eltűnnek. A b0 sorsa az lesz, hogy egy lesz belőle, pontosabban −1. A külső függvény deriváltja szimplán csak az eredeti kifejezés négyzet alatti része, szorozva kettővel. Láncszabállyal az egy tagra vonatkozó derivált:

2⋅(yi−(b0+b1⋅ti))⋅(−1)=−2⋅(yi−b0−b1⋅ti) 2 \cdot \left(y_i - (b_0 + b_1 \cdot t_i)\right) \cdot (-1) = -2 \cdot (y_i - b_0 - b_1 \cdot t_i)

Most helyezzük vissza a szummát. A teljes SSE deriváltja az egyes tagok deriváltjainak összege, és ezt az összeget tesszük nullával egyenlővé. A fura fordított hatos jel a parciális d, a parciális derivált jelzése. Itt például az SSE-t deriváljuk b0 szerint:

∂SSE∂b0=∑i=1n−2⋅(yi−b0−b1⋅ti)=0 \frac{\partial SSE}{\partial b_0} = \sum_{i=1}^{n} -2 \cdot (y_i - b_0 - b_1 \cdot t_i) = 0

Leosztva mínusz kettővel az alábbi kifejezés keletkezik:

∑i=1n(yi−b0−b1⋅ti)=0 \sum_{i=1}^{n} (y_i - b_0 - b_1 \cdot t_i) = 0

A szummát tagonként felbontva:

∑i=1nyi−∑i=1nb0−b1∑i=1nti=0 \sum_{i=1}^{n} y_i - \sum_{i=1}^{n} b_0 - b_1 \sum_{i=1}^{n} t_i = 0

Mivel a konstans b0-t n-szer adjuk össze, azért a b0 szummája valójában n · b0. Rendezve megkapjuk az I. normálegyenletet:

∑i=1nyi=n⋅b0+b1∑i=1nti \sum_{i=1}^{n} y_i = n \cdot b_0 + b_1 \sum_{i=1}^{n} t_i

b1 szerinti derivált

Itt yi és b0 számít konstansnak, a belső függvény deriváltja pedig −ti. Az egy tagra vonatkozó derivált:

2⋅(yi−b0−b1⋅ti)⋅(−ti)=−2⋅ti⋅(yi−b0−b1⋅ti) 2 \cdot (y_i - b_0 - b_1 \cdot t_i) \cdot (-t_i) = -2 \cdot t_i \cdot (y_i - b_0 - b_1 \cdot t_i)

A szummát visszahelyezve, és az összeget nullával egyenlővé téve:

∂SSE∂b1=∑i=1n−2⋅ti⋅(yi−b0−b1⋅ti)=0 \frac{\partial SSE}{\partial b_1} = \sum_{i=1}^{n} -2 \cdot t_i \cdot (y_i - b_0 - b_1 \cdot t_i) = 0

Mínusz kettővel leosztva, majd a zárójelet felbontva:

∑i=1n(ti⋅yi−b0⋅ti−b1⋅ti2)=0 \sum_{i=1}^{n} (t_i \cdot y_i - b_0 \cdot t_i - b_1 \cdot t_i^2) = 0

A szummát tagonként felbontva és rendezve megkapjuk a II. normálegyenletet:

∑i=1n(ti⋅yi)=b0∑i=1nti+b1∑i=1nti2 \sum_{i=1}^{n} (t_i \cdot y_i) = b_0 \sum_{i=1}^{n} t_i + b_1 \sum_{i=1}^{n} t_i^2

Nemlineáris trendek

Ha nem lineáris görbét szeretnénk illeszteni, sok esetben nem kell új módszert tanulnunk. A modellt átalakítjuk úgy, hogy lineárissá váljon, elvégezzük a fenti számítást, majd az eredményt visszaalakítjuk. A trükk az, hogy a lineáris modell nem feltétlenül az eredeti y és t értékekre vonatkozik, hanem azok átalakított változataira. Ha az átalakított változókat Y-nal és X-szel jelöljük, akkor mindig ugyanazt az egyenest illesztjük:

Y=c0+c1⋅X Y = c_0 + c_1 \cdot X

Az egyenes paramétereit itt c0 és c1 jelöli, hogy ne keveredjenek az eredeti modell b0 és b1 paramétereivel. A normálegyenletekben ilyenkor egyszerűen az yi helyére az Yi, a ti helyére az Xi, a b0 és b1 helyére pedig a c0 és c1 kerül. A módszer három lépésből áll:

  1. Kiszámoljuk az átalakított Yi és Xi értékeket.
  2. Az Yi és Xi értékekre a fenti módon illesztünk egyenest, így megkapjuk a c0 és c1 paramétereket.
  3. A c0 és c1 paraméterekből visszaalakítjuk az eredeti modell paramétereit.

Exponenciális modell

Az exponenciális trend alakja:

y^i=b0⋅b1ti \hat{y}_i = b_0 \cdot b_1^{t_i}

Itt b0 a kezdőérték, b1 pedig a növekedési tényező: minden időszakban b1-szeresére változik az érték. Ha például b1 = 1,05, akkor időszakonként 5%-os a növekedés.

Vegyük mindkét oldal természetes logaritmusát:

ln⁡y^i=ln⁡(b0⋅b1ti) \ln \hat{y}_i = \ln \left( b_0 \cdot b_1^{t_i} \right)

A szorzat logaritmusa a tényezők logaritmusának összege, ezért:

ln⁡y^i=ln⁡b0+ln⁡(b1ti) \ln \hat{y}_i = \ln b_0 + \ln \left( b_1^{t_i} \right)

A hatvány logaritmusánál a kitevő szorzóként kihozható a logaritmus elé:

ln⁡y^i=ln⁡b0+ti⋅ln⁡b1 \ln \hat{y}_i = \ln b_0 + t_i \cdot \ln b_1

Ez pontosan egy egyenes egyenlete, ahol Y = ln y és X = t, a tengelymetszet c0 = ln b0, a meredekség pedig c1 = ln b1. Vagyis a ti értékek maradnak, az yi értékek helyett pedig az ln yi értékekre illesztünk egyenest.

A visszaalakításhoz a logaritmus fordított műveletét, a hatványozást használjuk (az ln inverze az e alapú hatványozás):

b0=ec0,b1=ec1 b_0 = e^{c_0}, \qquad b_1 = e^{c_1}

Az e szám itt csak azért jelenik meg, mert természetes logaritmust használtunk. Bármilyen más alapú logaritmussal is működik az eljárás, például tízes alapúval a visszaalakítás b0 = 10c0 és b1 = 10c1, a végeredmény ugyanaz lesz.

Az eljárás csak pozitív y értékekre működik, mert nem pozitív számnak nincs valós logaritmusa.

Hatványkitevős modell

A hatványfüggvény alakja:

y^i=b0⋅tib1 \hat{y}_i = b_0 \cdot t_i^{b_1}

Az exponenciális modellnél a változó a kitevőben volt, itt viszont az alapban, a kitevő pedig a b1 paraméter. Vegyük mindkét oldal természetes logaritmusát, és használjuk ugyanazokat a logaritmus-azonosságokat:

ln⁡y^i=ln⁡b0+b1⋅ln⁡ti \ln \hat{y}_i = \ln b_0 + b_1 \cdot \ln t_i

Itt mind az y-t, mind a t-t logaritmizáljuk, tehát Y = ln y és X = ln t. A tengelymetszet c0 = ln b0, a meredekség pedig közvetlenül a kitevő: c1 = b1. A visszaalakítás:

b0=ec0,b1=c1 b_0 = e^{c_0}, \qquad b_1 = c_1

Ennél a modellnél az y és a t értékeknek is pozitívnak kell lenniük. Mivel az időpontokat 1-től számozzuk, a t-vel általában nincs gond.

Logaritmikus modell

A logaritmikus trend alakja:

y^i=b0+b1⋅ln⁡ti \hat{y}_i = b_0 + b_1 \cdot \ln t_i

Ez az egyetlen a három nemlineáris modell közül, ahol az y értékeket nem kell átalakítani, csak a t-t: Y = y és X = ln t. Az egyenes paraméterei közvetlenül az eredeti modell paraméterei, nincs mit visszaalakítani:

b0=c0,b1=c1 b_0 = c_0, \qquad b_1 = c_1

Itt t > 0 kell, hogy teljesüljön.

Összefoglalás

Modell Eredeti alak Y X Visszaalakítás
Lineáris ŷ = b0 + b1 · t y t nem szükséges
Exponenciális ŷ = b0 · b1t ln y t b0 = ec0, b1 = ec1
Hatványkitevős ŷ = b0 · tb1 ln y ln t b0 = ec0, b1 = c1
Logaritmikus ŷ = b0 + b1 · ln t y ln t b0 = c0, b1 = c1

Mire figyeljünk?

Ha az y értékeket logaritmizáljuk (exponenciális és hatványkitevős modell), akkor a négyzetes hibát a logaritmizált értékeken minimalizáljuk, nem az eredeti skálán. Ezért az eredmény általában kicsit eltér attól, amit az eredeti skálán végzett közvetlen illesztés adna. A logaritmikus modellnél ez a probléma nem jelentkezik, mert ott az y értékek változatlanok maradnak, így az SSE az eredeti skálán minimalizálódik.

Top comments (0)