{ "cells": [ { "cell_type": "markdown", "id": "4814259a-4af7-4839-a1dd-7f0e02837c3f", "metadata": {}, "source": [ "# Regresja liniowa" ] }, { "cell_type": "markdown", "id": "62ab7b17-f761-4723-8992-9620630fdaa6", "metadata": {}, "source": [ "Na dzisiejszych zajęciach omówimy problem predykcji informacji i jego rozwiązanie poprzez wykorzystanie regresji liniowej." ] }, { "cell_type": "markdown", "id": "b01eb137-5b7d-4f09-abac-0410366df4a9", "metadata": {}, "source": [ "Zadaniem regresji liniowej jest po prostu dopasowanie prostej linii do danych. Warto podkreślić, że regresja liniowa przyjmuje założenie, że związek między cechami a zmienną objaśnianą jest mniej więcej liniowy. Regresja liniowa nie jest jedynym rodzajem regresji aczkolwiek jest to najprostsza wersja." ] }, { "cell_type": "markdown", "id": "5dd39b3d-1a4b-44e5-9300-5ad796f7bb4c", "metadata": {}, "source": [ "Regresja może nam pomóc w predykcji (przewidzeniu) wartości jakiejś zmiennej objaśnianej (zależnej) na podstawie jakiś cech (zmiennych niezależnych)." ] }, { "cell_type": "markdown", "id": "3e618a4a-4088-4c3c-8f98-64c8a3ae0b57", "metadata": {}, "source": [ "## Rozgrzewka" ] }, { "cell_type": "markdown", "id": "c4a323d0-e71f-48a9-bda0-17ca379b71da", "metadata": {}, "source": [ "Przeanalizuj poniższy wykres:" ] }, { "cell_type": "markdown", "id": "1c26ec9b-3e87-4cbc-810a-78d61936f28d", "metadata": {}, "source": [ "![](reglin.png)" ] }, { "cell_type": "markdown", "id": "f38c977c-490c-49d8-8853-8c24c8d7cc43", "metadata": {}, "source": [ "1. Dlaczego możemy zastosować regresję liniową do przewidywania informacji o danych?\n", "\n", "2. Co musimy znaleźć, aby móc dokonywać predykcji informacji? Co musimy mieć na uwadze, aby to znaleźć?" ] }, { "cell_type": "markdown", "id": "8f70342d-6503-4810-ba02-e0f4a6208bfc", "metadata": {}, "source": [ "## Przykład" ] }, { "cell_type": "markdown", "id": "ebe61c55-c441-433d-8ba9-ec657ff5cc51", "metadata": {}, "source": [ "Załóżmy, że mamy uczniów, którzy pracują w kursie e-learningowym i ciekawi nas, czy zakończą pracę w tym kursie z sukcesem, tzn. zdobędą jak najlepszy wynik w końcowym teście zaliczeniowym. Aktualne informacje, które posiadamy, to czas spędzony w tym kursie, liczba rozwiązanych ćwiczeń, liczba elementów, których uczeń jeszcze nie odwiedził. Wiemy też, kiedy uczeń zaczął się uczyć i ile razy wchodził do kursu. Każdy uczeń ma też świadomość, że mają określony termin, do kiedy muszą podejść do końcowego testu zaliczeniowego." ] }, { "cell_type": "markdown", "id": "e29d4510-b276-4697-bc68-2b9f497bbc9e", "metadata": {}, "source": [ "Powiedzmy, że na początek przyjrzymy się jednej z informacji - liczbie rozwiązanych ćwiczeń. Załóżmy, że w kursie jest 20 ćwiczeń do rozwiązania a wynik w końcowym teście zaliczeniowym badamy w procentach. Rok temu mieliśmy innych uczniów, którzy też pracowali z tym kursem e-learningowym i mamy informację o ich wynikach:" ] }, { "cell_type": "markdown", "id": "960ec22d-236f-41b8-9f58-295ede47335a", "metadata": {}, "source": [ "![](wyniki.png)" ] }, { "cell_type": "markdown", "id": "be26d14d-2356-4e45-b0d0-b1bb6ece9526", "metadata": {}, "source": [ "Zauważmy, że mamy tutaj pewien trend. W przybliżeniu możemy stwierdzić, że im większa liczba rozwiązanych ćwiczeń w kursie tym większy wynik w końcowym teście zaliczeniowym. Zatem moglibyśmy spróbować wyznaczyć funkcję, która pokazywałaby ten trend. Najprościej będzie wyznaczyć zależność liniową, czyli pewną funkcję liniową, która nam przybliży trend. Musimy znaleźć taką funkcję, dla której będziemy mieć sytuację, że dla jak największej liczby argumentów będziemy mieć jak najmniejszą różnicę pomiędzy wartością, którą zwróci funkcja a wartością rzeczywistą, którą mamy na powyższym wykresie." ] }, { "cell_type": "markdown", "id": "020d9194-8fb5-450d-b642-71701c853c21", "metadata": {}, "source": [ "Zatem naszym zadaniem jest wyznaczenie pewnej funkcji liniowej postaci:\n", "$f(x)=ax+b$, gdzie:\n", "\n", "$x$ - liczba rozwiązanych ćwiczeń w kursie\n", "\n", "$f(x)$ - przybliżony wynik osiągnięty w końcowym teście zaliczeniowym\n", "\n", "$a$ - współczynnik kierunkowy naszej funkcji **regresji liniowej**\n", "\n", "$b$ - wyraz wolny" ] }, { "cell_type": "markdown", "id": "05f37fe3-da73-46f3-b4b3-3cba82dbf546", "metadata": {}, "source": [ "Powstaje pytanie jak wyznaczyć wartości $a$ i $b$. Istnieją algorytmy numeryczne, które pozwalają znaleźć przybliżone wartości. Jednym z nich jest tzw. algorytm gradientu prostego. Natomiast nie będziemy go w tym momencie omawiać.\n", "\n", "Na zajęciach ze statystyki będziecie Państwo (jeśli jeszcze nie mieliście statystyki) uczyć się jak wyznaczać te szukane wartości wg pewnych wzorów i teraz z nich skorzystamy:\n", "\n", "$a=\\frac{\\sum_{i=1}^{n}\\left ( x_{i}-\\overline{x} \\right )\\left ( y_{i}-\\overline{y} \\right )}{\\sum_{i=1}^{n}\\left ( x_{i}-\\overline{x} \\right )^{2}}$\n", "\n", "$b=\\overline{y}-a\\overline{x}$\n", "\n", "gdzie:\n", "\n", "$n$ - liczba punktów na naszym wykresie\n", "\n", "$(x_{i}, y_{i})$ to i-ty punkt na naszym wykresie\n", "\n", "$\\overline{x}$ to średnia arytmetyczna wszystkich argumentów z naszego wykresu (liczby rozwiązanych ćwiczeń)\n", "\n", "$\\overline{y}$ to średnia arytmetyczna wszystkich wartości z naszego wykresu (wyników w teście)" ] }, { "cell_type": "markdown", "id": "efdfa37b-292f-45c1-b18a-605b426b495a", "metadata": {}, "source": [ "Co do zasady te wzory będą (lub były) wyjaśniane na zajęciach ze statystyki, natomiast na ten moment powinna wystarczyć nam informacja, że wynikają one z faktu, że szukamy takiej funkcji, dla której różnice między obliczoną a rzeczywistą wartością są jak najmniejsze. Różnice te mogą być ujemne, dlatego bada się kwadraty różnic, żeby nie było sytuacji, że różnice pewnych wartości się wyzerują i przez to znajdziemy błędną funkcję regresji. Taką metodę nazywa się **metodą najmniejszych kwadratów** a same różnice nazywa się **resztami** lub **residuami**." ] }, { "cell_type": "markdown", "id": "9c2ebd9c-3b53-470a-8f62-1099c128cf15", "metadata": {}, "source": [ "Gdybyśmy dla naszych danych wyznaczyli zgodnie z powyższymi wzorami wartość funkcji regresji liniowej otrzymalibyśmy prostą jak na poniższym wykresie:\n", "\n", "![](wyniki_reglin.png)" ] }, { "cell_type": "markdown", "id": "b8f03bcd-8ace-4d2e-8942-678e92dda4e4", "metadata": {}, "source": [ "Można to interpretować następująco:\n", "\n", "- ponieważ wyraz wolny $b$ w przybliżeniu wynosi 11,94 to można powiedzieć, że jeśli uczeń nie rozwiąże ćwiczeń, to jego wynik na teście końcowym wyniesie właśnie ok. 12%;\n", "- ponieważ współczynnik kierunkowy $a$ jest dodatni to oznacza, że wraz ze wzrostem liczby rozwiązanych ćwiczeń będzie rósł wynik na teście końcowym;\n", "- ponieważ współczynnik kierunkowy $a$ wynosi ok. 4,89, oznacza to, że wraz z każdym kolejnym rozwiązanym ćwiczeniem wynik w teście końcowym wzrasta o ok. 4,89%.\n", "\n", "To, czy powyższe wnioski są w naszym problemie sensowne to inna sprawa. Regresja liniowa ma swoje plusy i minusy:\n", "\n", "### Zalety:\n", "- Prostota – dzięki swojej prostocie wykorzystywana jest w wielu dziedzinach: od matematyki, poprzez ekonomię, aż po geodezję,\n", "- interpretowalność – dzięki prostym wzorom bardzo łatwo wyjaśnić biznesowi lub innym osobom, jak dana cecha wpływa na wynik modelu,\n", "- szybkość – nawet przy dużej liczbie danych dla prostych algorytmów wyniki dostajemy prawie od razu.\n", "\n", "### Wady:\n", "- Prostota (wcześniej zaleta ;P) – świat nie składa się z prostych liniowych zależności. Gdyby tak było, to pewnie nie byłoby takiego rozwoju uczenia maszynowego.\n", "\n" ] }, { "cell_type": "markdown", "id": "f54542e5-d2c2-4192-8cbb-2d42737955f2", "metadata": {}, "source": [ "
\n", " \n", "
https://xkcd.com/
\n", "
" ] }, { "cell_type": "markdown", "id": "56ca2bb6-eff7-4fe3-9d09-9e5955acc18e", "metadata": {}, "source": [ "Oczywiście mamy więcej informacji niż liczba rozwiązanych ćwiczeń, więc można by było spróbować wyznaczyć funkcję wielu zmiennych, w której każdy ze składników byłby jakąś funkcją liniową. To już spróbujemy zrobić korzystając z możliwości języka Python i dostępnych dla niego bibliotek." ] }, { "cell_type": "markdown", "id": "3b482f8e-e70e-4a61-a2a5-37d42cf9656b", "metadata": {}, "source": [ "## Przykład kodu na regresję liniową" ] }, { "cell_type": "code", "execution_count": null, "id": "28e2ef8c-dbbf-4c3d-924e-f59318e4f383", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.2" } }, "nbformat": 4, "nbformat_minor": 5 }