From f192e3fb2c24fa46cc82ea13cd0b8578f775e30f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Szczepa=C5=84ski?= Date: Wed, 18 Oct 2023 14:37:13 +0200 Subject: [PATCH] regresja liniowa --- .../regresja_liniowa_NMI-checkpoint.ipynb | 332 +++++++++++++++++- regresja liniowa/regresja_liniowa_NMI.ipynb | 332 +++++++++++++++++- 2 files changed, 662 insertions(+), 2 deletions(-) diff --git a/regresja liniowa/.ipynb_checkpoints/regresja_liniowa_NMI-checkpoint.ipynb b/regresja liniowa/.ipynb_checkpoints/regresja_liniowa_NMI-checkpoint.ipynb index 85d259c..1d334d9 100644 --- a/regresja liniowa/.ipynb_checkpoints/regresja_liniowa_NMI-checkpoint.ipynb +++ b/regresja liniowa/.ipynb_checkpoints/regresja_liniowa_NMI-checkpoint.ipynb @@ -215,10 +215,340 @@ "## Przykład kodu na regresję liniową" ] }, + { + "cell_type": "markdown", + "id": "1c1dd0af-74e4-4f7a-93bf-64a9d2be14c3", + "metadata": {}, + "source": [ + "Zaczynamy od importu pewnych bibliotek, które ułatwiają pracę z danymi i uruchamianie algorytmów uczenia maszynowego:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74d886ec-b819-48fa-aac2-e69c6160287b", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + " \n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_squared_error" + ] + }, + { + "cell_type": "markdown", + "id": "d9e1ee83-3b9d-439f-9aee-5ac095ded83a", + "metadata": {}, + "source": [ + "Wczytajmy dane i podejrzyjmy nasz zbiór danych:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f1111528-20ce-4ed5-9c5a-511f2c1041d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cwiczeniaczas_minwejscianieodwiedzoneczas_do_testu_godzinytest
0412112020.00
1825333660.00
21448313392.86
31137504265.34
4529202242.35
52514513.14
61636714785.13
71855503998.33
820484045100.00
91042713770.00
\n", + "
" + ], + "text/plain": [ + " cwiczenia czas_min wejscia nieodwiedzone czas_do_testu_godziny test\n", + "0 4 12 1 1 20 20.00\n", + "1 8 25 3 3 36 60.00\n", + "2 14 48 3 1 33 92.86\n", + "3 11 37 5 0 42 65.34\n", + "4 5 29 2 0 22 42.35\n", + "5 2 5 1 4 5 13.14\n", + "6 16 36 7 1 47 85.13\n", + "7 18 55 5 0 39 98.33\n", + "8 20 48 4 0 45 100.00\n", + "9 10 42 7 1 37 70.00" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('data.csv', sep=';')\n", + "data" + ] + }, + { + "cell_type": "markdown", + "id": "2158a205-2c9e-41b9-9fe0-d56dd7b97213", + "metadata": {}, + "source": [ + "Teraz obliczamy podstawowy model regresji liniowej i wyliczamy błąd (czyli jak bardzo obliczone wartości funkcji regresji różnią się od tych rzeczywistych) - weźmy miarę RMSE (omówimy ją na późniejszych zajęciach - na razie zapamiętajmy: im niższy błąd tym lepiej):" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "f7eade7c-def7-4944-8eea-7cba985e5bf5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Współczynnik a: 4.8869552414605435\n", + "Wyraz wolny: 11.935883392226131\n", + "Błąd: Root Mean Squared Error (RMSE): 8.27\n" + ] + } + ], + "source": [ + "model = LinearRegression()\n", + " \n", + "X = data[['cwiczenia']]\n", + "y = data['test']\n", + " \n", + "model.fit(X,y, sample_weight=None)\n", + "y_pred = model.predict(X)\n", + " \n", + "print('Współczynnik a: ', model.coef_[0])\n", + "print('Wyraz wolny: ', model.intercept_)\n", + "print('Błąd: Root Mean Squared Error (RMSE): %.2f'% np.sqrt(mean_squared_error(y, y_pred)))\n" + ] + }, + { + "cell_type": "markdown", + "id": "04bf6923-da81-40ca-96bd-33f1ad973ddc", + "metadata": {}, + "source": [ + "A co by było jakbyśmy wzięli dodatkowo pod uwagę czas spędzony w kursie:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "2b232e81-9d0e-4817-ac0a-5f7b1d293666", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Współczynnik przy argumencie \"cwiczenia\": 2.793448759670846\n", + "Współczynnik przy argumencie \"czas_min\": 0.9017691542564438\n", + "Wyraz wolny: 4.156132897112705\n", + "Błąd: Root Mean Squared Error (RMSE): 5.19\n" + ] + } + ], + "source": [ + "X = data[['cwiczenia', 'czas_min']]\n", + "y = data['test']\n", + " \n", + "model.fit(X,y, sample_weight=None)\n", + "y_pred = model.predict(X)\n", + " \n", + "print('Współczynnik przy argumencie \"cwiczenia\": ', model.coef_[0])\n", + "print('Współczynnik przy argumencie \"czas_min\": ', model.coef_[1])\n", + "print('Wyraz wolny: ', model.intercept_)\n", + "print('Błąd: Root Mean Squared Error (RMSE): %.2f'% np.sqrt(mean_squared_error(y, y_pred)))\n" + ] + }, + { + "cell_type": "markdown", + "id": "e49fa078-6216-4d83-bbbd-db0b58aa7c8e", + "metadata": {}, + "source": [ + "Mamy lepszy wynik - błąd jest niższy :)" + ] + }, + { + "cell_type": "markdown", + "id": "d501bcc0-d3bf-4552-bf2b-c78753b4d5d6", + "metadata": {}, + "source": [ + "A jak wyglądają nasze wyznaczone wartości funkcji regresji?" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "e539d645-86c6-42c0-9059-7a3c310cc2a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 26.15115779, 49.04795183, 86.54933494, 68.24952796,\n", + " 44.27468217, 14.25187619, 81.31500261, 104.03551406,\n", + " 103.31002749, 69.96492497])" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_with_y_pred = data.copy()\n", + "data_with_y_pred['y_pred'] = y_pred\n", + "data_with_y_pred\n", + "y_pred" + ] + }, + { + "cell_type": "markdown", + "id": "7ea9c2cb-b654-4190-9e4f-972e4d3bf92f", + "metadata": {}, + "source": [ + "## Zadanie 1.\n", + "\n", + "Dla całego zbioru danych oblicz sumę kwadratów róźnic pomiędzy kolumnami **test** i **y_pred**. Wynik zaokrąglij do dwóch miejsc po przecinku (pamiętaj, że od 5 zaokrąglamy w górę). Podpowiedź:" + ] + }, + { + "cell_type": "markdown", + "id": "90d8f306-e823-4552-8f41-6aac1ee37611", + "metadata": {}, + "source": [ + "- `data_with_y_pred['nazwa_kolumny'].size` - liczba elementów (wierszy) w danej kolumnie\n", + "\n", + "- `data_with_y_pred['nazwa_kolumny'][0]` - pierwszy (indeksujemy od zera) element (wiersz) kolumny" + ] + }, + { + "cell_type": "markdown", + "id": "8d9c213b-5758-409b-a73d-1012a3709032", + "metadata": {}, + "source": [ + "Konkretne zadanie: napisz funkcję o nazwie `fun1()`, która zwróci oczekiwany wynik. Kod tej funkcji wklej na Moodle'u w aktywności o nazwie **Regresja liniowa - zadanie 1**. Na Moodle'u poza powyższym zbiorem danych kod będzie sprawdzony na innym zbiorze danych, więc nie można napisać prostej funkcji, która zwróci wartość obliczoną np. na kartce - niestety trzeba napisać funkcję obliczającą poszukiwaną wartość ;)" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "28e2ef8c-dbbf-4c3d-924e-f59318e4f383", + "id": "7d1a8edd-0a16-4504-8383-1e9240504306", "metadata": {}, "outputs": [], "source": [] diff --git a/regresja liniowa/regresja_liniowa_NMI.ipynb b/regresja liniowa/regresja_liniowa_NMI.ipynb index 85d259c..1d334d9 100644 --- a/regresja liniowa/regresja_liniowa_NMI.ipynb +++ b/regresja liniowa/regresja_liniowa_NMI.ipynb @@ -215,10 +215,340 @@ "## Przykład kodu na regresję liniową" ] }, + { + "cell_type": "markdown", + "id": "1c1dd0af-74e4-4f7a-93bf-64a9d2be14c3", + "metadata": {}, + "source": [ + "Zaczynamy od importu pewnych bibliotek, które ułatwiają pracę z danymi i uruchamianie algorytmów uczenia maszynowego:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74d886ec-b819-48fa-aac2-e69c6160287b", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + " \n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_squared_error" + ] + }, + { + "cell_type": "markdown", + "id": "d9e1ee83-3b9d-439f-9aee-5ac095ded83a", + "metadata": {}, + "source": [ + "Wczytajmy dane i podejrzyjmy nasz zbiór danych:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f1111528-20ce-4ed5-9c5a-511f2c1041d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cwiczeniaczas_minwejscianieodwiedzoneczas_do_testu_godzinytest
0412112020.00
1825333660.00
21448313392.86
31137504265.34
4529202242.35
52514513.14
61636714785.13
71855503998.33
820484045100.00
91042713770.00
\n", + "
" + ], + "text/plain": [ + " cwiczenia czas_min wejscia nieodwiedzone czas_do_testu_godziny test\n", + "0 4 12 1 1 20 20.00\n", + "1 8 25 3 3 36 60.00\n", + "2 14 48 3 1 33 92.86\n", + "3 11 37 5 0 42 65.34\n", + "4 5 29 2 0 22 42.35\n", + "5 2 5 1 4 5 13.14\n", + "6 16 36 7 1 47 85.13\n", + "7 18 55 5 0 39 98.33\n", + "8 20 48 4 0 45 100.00\n", + "9 10 42 7 1 37 70.00" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('data.csv', sep=';')\n", + "data" + ] + }, + { + "cell_type": "markdown", + "id": "2158a205-2c9e-41b9-9fe0-d56dd7b97213", + "metadata": {}, + "source": [ + "Teraz obliczamy podstawowy model regresji liniowej i wyliczamy błąd (czyli jak bardzo obliczone wartości funkcji regresji różnią się od tych rzeczywistych) - weźmy miarę RMSE (omówimy ją na późniejszych zajęciach - na razie zapamiętajmy: im niższy błąd tym lepiej):" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "f7eade7c-def7-4944-8eea-7cba985e5bf5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Współczynnik a: 4.8869552414605435\n", + "Wyraz wolny: 11.935883392226131\n", + "Błąd: Root Mean Squared Error (RMSE): 8.27\n" + ] + } + ], + "source": [ + "model = LinearRegression()\n", + " \n", + "X = data[['cwiczenia']]\n", + "y = data['test']\n", + " \n", + "model.fit(X,y, sample_weight=None)\n", + "y_pred = model.predict(X)\n", + " \n", + "print('Współczynnik a: ', model.coef_[0])\n", + "print('Wyraz wolny: ', model.intercept_)\n", + "print('Błąd: Root Mean Squared Error (RMSE): %.2f'% np.sqrt(mean_squared_error(y, y_pred)))\n" + ] + }, + { + "cell_type": "markdown", + "id": "04bf6923-da81-40ca-96bd-33f1ad973ddc", + "metadata": {}, + "source": [ + "A co by było jakbyśmy wzięli dodatkowo pod uwagę czas spędzony w kursie:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "2b232e81-9d0e-4817-ac0a-5f7b1d293666", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Współczynnik przy argumencie \"cwiczenia\": 2.793448759670846\n", + "Współczynnik przy argumencie \"czas_min\": 0.9017691542564438\n", + "Wyraz wolny: 4.156132897112705\n", + "Błąd: Root Mean Squared Error (RMSE): 5.19\n" + ] + } + ], + "source": [ + "X = data[['cwiczenia', 'czas_min']]\n", + "y = data['test']\n", + " \n", + "model.fit(X,y, sample_weight=None)\n", + "y_pred = model.predict(X)\n", + " \n", + "print('Współczynnik przy argumencie \"cwiczenia\": ', model.coef_[0])\n", + "print('Współczynnik przy argumencie \"czas_min\": ', model.coef_[1])\n", + "print('Wyraz wolny: ', model.intercept_)\n", + "print('Błąd: Root Mean Squared Error (RMSE): %.2f'% np.sqrt(mean_squared_error(y, y_pred)))\n" + ] + }, + { + "cell_type": "markdown", + "id": "e49fa078-6216-4d83-bbbd-db0b58aa7c8e", + "metadata": {}, + "source": [ + "Mamy lepszy wynik - błąd jest niższy :)" + ] + }, + { + "cell_type": "markdown", + "id": "d501bcc0-d3bf-4552-bf2b-c78753b4d5d6", + "metadata": {}, + "source": [ + "A jak wyglądają nasze wyznaczone wartości funkcji regresji?" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "e539d645-86c6-42c0-9059-7a3c310cc2a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 26.15115779, 49.04795183, 86.54933494, 68.24952796,\n", + " 44.27468217, 14.25187619, 81.31500261, 104.03551406,\n", + " 103.31002749, 69.96492497])" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_with_y_pred = data.copy()\n", + "data_with_y_pred['y_pred'] = y_pred\n", + "data_with_y_pred\n", + "y_pred" + ] + }, + { + "cell_type": "markdown", + "id": "7ea9c2cb-b654-4190-9e4f-972e4d3bf92f", + "metadata": {}, + "source": [ + "## Zadanie 1.\n", + "\n", + "Dla całego zbioru danych oblicz sumę kwadratów róźnic pomiędzy kolumnami **test** i **y_pred**. Wynik zaokrąglij do dwóch miejsc po przecinku (pamiętaj, że od 5 zaokrąglamy w górę). Podpowiedź:" + ] + }, + { + "cell_type": "markdown", + "id": "90d8f306-e823-4552-8f41-6aac1ee37611", + "metadata": {}, + "source": [ + "- `data_with_y_pred['nazwa_kolumny'].size` - liczba elementów (wierszy) w danej kolumnie\n", + "\n", + "- `data_with_y_pred['nazwa_kolumny'][0]` - pierwszy (indeksujemy od zera) element (wiersz) kolumny" + ] + }, + { + "cell_type": "markdown", + "id": "8d9c213b-5758-409b-a73d-1012a3709032", + "metadata": {}, + "source": [ + "Konkretne zadanie: napisz funkcję o nazwie `fun1()`, która zwróci oczekiwany wynik. Kod tej funkcji wklej na Moodle'u w aktywności o nazwie **Regresja liniowa - zadanie 1**. Na Moodle'u poza powyższym zbiorem danych kod będzie sprawdzony na innym zbiorze danych, więc nie można napisać prostej funkcji, która zwróci wartość obliczoną np. na kartce - niestety trzeba napisać funkcję obliczającą poszukiwaną wartość ;)" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "28e2ef8c-dbbf-4c3d-924e-f59318e4f383", + "id": "7d1a8edd-0a16-4504-8383-1e9240504306", "metadata": {}, "outputs": [], "source": []