Modele regresji liniowej szybko i łatwo z scikit learn

Rozmawiająć z osobami, które zawodowo wykorzystują metody analizy danych byłem zaskoczony jak wiele modeli predykcyjnych opartych jest na regresji liniowej. Jest to jedna z podstawowych technik w arsenale analityka, stosukowo prosta w implementacji oraz zrozumieniu, a jednak niezwykle efektywna i użyteczna. Dzięki bibliotece scikit-learn jesteśmy w stanie w kilku wierszach kodu python’a zaimplementować jej podstawowe rodzaje.

Regresja liniowa wprowadzenie


Celem regresji liniowej jest dopasowanie do danych doświadczalnych/historycznych prostej, która oddaje charakter tych danych. Zadanie polega na znalezieniu funkcji liniowej \(f(x) \rightarrow \mathbf{R}\) postaci:
\begin{equation}
f(x) = w_0 + w_1x_1+w_2x_2+…w_nx_n
\label{eq1}
\end{equation}

gdzie \(x \in R^N\) a \(w \in R^N\) jest wektorem zawierającym współczynniki prostej. I to właśnie na znalezieniu wektora \(w\) będziemy skupiać swoją uwagę.

Metoda najmniejszych kwadratów

Mając dane historyczne  \(X = \{x^1,x^2,…,x^k \} , x^i \in R^N\)  oraz odpowiadające im wartości \(Y=\{y^1, y^2,…,y^k\}\) będziemy poszukiwać najlepiej dopasowanego wektora \(w\). Co to dla nas znaczy, najlepiej dopasowanego?

Mianowicie takiego, dla którego wartości zwracane przez funkcję \(f\) i odpowiadająca wartości rzeczywiste najmniej się różnią. Załóżmy że mamy już wybrany wektor np. \(w=[1,0.5,0,0,2,0.3,…,1]\) możemy obliczyć:

\begin{align}
f(x^1)= & w_0 + w_1x^1_1+w_2x^1_2+…w_nx^1_n = w_0 + (x^1)^T*w\\
f(x^2)= & w_0 + w_1x^2_1+w_2x^2_2+…w_nx^2_n = w_0 + (x^2)^T*w \\
\cdots  &\\
f(x^k)= & w_0 + w_1x^k_1+w_2x^k_2+…w_nx^k_n =  w_0 + (x^k)^T*w\\
\end{align}

Wartości te możemy porównać z rzeczywistymi odpowiadającymi wartościami \(y\), stąd mamy

\begin{align}
e^1 = &f(x^1)- y^1 \\
e^2 = &f(x^2)- y^2\\
\cdots  &\\
e^k= &f(x^k)- y^k \\
\end{align}

Następnie sumując kwadraty tych błędów \(e^1, …, e^k\) otrzymamy wyrażenie:

$$E(w) =  \sum_{i=1}^{k}\left(f(x^i)-y^i\right)^2 $$

Oczywiście chcielibyśmy aby suma kwadratów błędów była jak najmniejsza, a jedyne co możemy zmieniać to wartości współczynników wektora \(w\). W ten sposób zdefiniowaliśmy zadanie minimalizacji \(E\) względem \(w\). Aby skrócić i ułatwić sobie zapis powyższe można zapisać w postaci macierzowej, jeżeli \(X\) zapiszemy jako macierz, w której poszczególne egzemplarze \(x^i\) zostaną ułożone w wierszach, wektor \(w\) jest wektorem kolumnowym, a \(Y\) potraktujemy także jako wektor kolumnowy całość możemy zapisać w postaci:

$$ \underset{w}{min} ||X*w-Y||_2^2 $$

 Rodzaje regresji liniowej

W zależności od definicji zadania minimalizacji możemy wyróżnić kilka typów regresji:

  • regresja liniowa $$ \underset{w}{min} ||X*w-Y||_2^2 $$
  • regresja grzbietowa (Ridge) $$ \underset{w}{min} ||X*w-Y||_2^2 + \alpha ||w||_2^2$$
  • regresja Lasso $$ \underset{w}{min} ||X*w-Y||_2^2 + \alpha ||w||_1$$
  • Elastic Net $$\underset{w}{min} { \frac{1}{2n_{samples}} ||X w – y||_2 ^ 2 + \alpha \rho ||w||_1 + \frac{\alpha(1-\rho)}{2} ||w||_2 ^ 2} $$

Kolejne trzy typy regresji dokładają do zadania optymalizacji dodatkowy czynnik (penalty, regularization) wpływający na cechy wektora \(w\). W regresji Ridge dodatkowo dodajemy warunek aby norma \(l_2\) wektora \(w\) była minimalizowana, dzięki czemu wymuszamy aby poszczególne współczynniki nie były za duże. Natomiast w regresji Lasso użycie normy \(l_1\) preferuje rozwiązania, w których wektor jest rzadki (ma dużo zer). Regresja Elastic Net łączy w sobie cechy Ridge oraz Lasso, poprzez zastosowanie dwóch typów norm, których istotność względem siebie kontroluje parametr \(\rho\)

Regresja liniowa przykłady w scikit-learn

No dobra, dość teorii! Czas zacząć kodować. Dzięki wykorzystaniu biblioteki scikit-learn wraz z zaimplementowanymi algorytmami regresji jesteśmy w stanie bardzo szybko nauczyć nasz model.

Implementacja dowolnego typu regresji jest bardzo prosta, tworzymy obiekt odpowiedniej klasy (LinearRegressionRidgeLassoElasticNet), na którym wywołujemy metodę fit podając jej za argumenty zbiór treningowy, docelowe wartości oraz ewentualne parametry (\(\alpha, \rho\)). Gdy model się nauczy to możemy wywołać metodę predict, która zwróci przewidywaną wartość. Ogólny szablon przedstawia się następująco

Dodatkowo warto zobaczyć jak wyglądają parametry prostej (regr.coef) oraz obliczyć rzeczywisty popełniony błąd średnio-kwadratowy.

Przykład 1. Regresja liniowa dla zbioru Diabetes

Zróbmy wizualizację prostych regresji obliczonych dla poszczególnych zmiennych w zbiorze Diabetes.

W wyniku otrzymamy następującą wizualizację:
regresja liniowa diabetes

Przykład 2. Porównanie modeli regresji liniowej

W przykładzie drugim chciałbym abyśmy dokonali porównania modeli regresji pod względem błędu dopasowania(wartości błędu średnio kwadratowego) oraz zobaczyli jak wygląda wektor kierunkowy poszczególnych prostych. W przykładzie wykorzystam zbiór Boston House Pricing, ma on 14 atrybutów oraz 506 instancji, zadanie polega na przewidzeniu ostatniego 14 parametru będącego ceną domu.

W wyniku otrzymamy diagram dokonujący porównania trzech wartości:

  • MSE – mean square error, czyli błędu dopasowania,
  • wl1 – wartość normy l1 wektora w,
  • wl2 – wartość normy l2 wektora w
porownanie modeli regresji scikit-learn

porownanie modeli regresji scikit-learn

Powyższy wykres pokazuje kilka istotnych informacji, które mogą posłużyć do wyboru modelu, po pierwsze zależy nam na tym aby MSE był jak najmniejszy. Najmniejszą wartość osiągnęła Liniowa Regrsja, tuż za nią Ridge. Warto także zwrócić uwagą na dwa pozostałe policzone parametry, normy l1 i l2 charakteryzujące znaleziony wektor ‚w’. Ze względu na stabilność numeryczną zależy nam aby wartości tego wektora nie były duże (norma l2 mała) lub gdy mamy do czynienia z danymi wielowymiarowymi chcielibyśmy aby wektor ‚w’ był rzadki (norma l1 mała). W tym przypadku Lasso promuje rozwiązania rzadkie.

Polecam poczytać o zaletach i wadach poszczególnych modeli:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *