wykład 8

This commit is contained in:
Filip Gralinski 2021-04-27 19:00:36 +02:00
parent 724be2f486
commit c5864ab9ad
10 changed files with 351 additions and 0 deletions

View File

@ -0,0 +1,214 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "continent-intermediate",
"metadata": {},
"source": [
"# Regresja liniowa\n",
"\n",
"Regresja liniowa jest prosta...\n",
"\n",
"![Ceny mieszkań](./08_files/linregr1.png)\n",
"\n",
"... dosłownie — dopasuj prostą $y = ax + b$ do punktów\n",
"\n",
"Należy odgadnąć $a$ i $b$ tak, aby zminimalizować błąd\n",
"kwadratowy, tj. wartość:\n",
"\n",
"$$\\sum_{i=1}^n (y_i - (ax_i + b))^2$$\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "original-speed",
"metadata": {},
"source": [
"Regresje liniowa (jednej zmiennej) jest łatwa do rozwiązania — wystarczy podstawić do wzoru!\n",
"\n",
"$$\\hat{b} = \\frac{ \\sum_{i=1}^{n}{x_i y_i} - \\frac{1}{n} \\sum_{i=1}^n x_i\n",
" \\sum_{j=1}^n y_j}{ \\sum_{i=1}^n {x_i^2} - \\frac{1}{n} (\\sum_{i=1}^n\n",
" x_i)^2 }$$\n",
"\n",
"$$\\hat{a} = \\bar{y} - \\hat{b}\\,\\bar{x}$$\n",
"\n",
"\n",
"Na przykład dla mieszkań: $b =$ -30809.203 zł, $a =$ 5733.693 zł/m$^2$.\n",
"\n",
"![Ceny mieszkań](./08_files/linregr2.png)\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "significant-relaxation",
"metadata": {},
"source": [
"## Regresja wielu zmiennych\n",
"\n",
"W praktyce mamy do czynienia z **wielowymiarową** regresją\n",
"liniową.\n",
"\n",
"Cena mieszkań może być prognozowana na podstawie:\n",
"\n",
"* powierzchni ($x_1 = 32.3$) \n",
"\n",
"* liczby pokoi ($x_2 = 3$)\n",
" \n",
"* piętra ($x_3 = 4$)\n",
"\n",
"* wieku ($x_4 = 13$)\n",
"\n",
"* odległości od Dworca Centralnego w Warszawie ($x_5 = 371.3$)\n",
"\n",
"* cech zerojedynkowych:\n",
"\n",
" * czy wielka płyta? ($x_6 = 0$)\n",
"\n",
" * czy jest jacuzzi? ($x_7 = 1$)\n",
"\n",
" * czy jest grzyb? ($x_8 = 0$)\n",
"\n",
" * czy to Kielce? ($x_9 = 1$)\n",
"\n",
"* ...\n",
"\n",
"... więc uogólniamy na wiele ($k$) wymiarów:\n",
"\n",
"$$ y = w_0 + w_1x_1 + \\ldots + w_kx_k = w_0 + \\sum_{j=1}^{k} w_jx_j $$\n",
"\n",
"gdzie:\n",
"\n",
"* $x_1,\\dots,x_k$ -- zmienne, na podstawie których zgadujemy\n",
"\n",
"* $w_0, w_1,\\dots,w_k$ -- wagi modelu (do wymyślenia na\n",
" podstawie przykładów)\n",
"\n",
"* $y$ -- odgadywana wartość\n",
"\n",
"Też istnieje wzór ładny wzór na wyliczenie wektora wag!\n",
"\n",
"$$\\mathbf{w} = (\\mathbf{X}^{\\rm T}\\mathbf{X})^{-1} \\mathbf{X}^{\\rm T}\\mathbf{y}$$\n",
"\n",
"... niestety odwracanie macierzy nie jest tanie :("
]
},
{
"cell_type": "markdown",
"id": "ordinary-appendix",
"metadata": {},
"source": [
"## Kilka sporzeżeń\n",
"\n",
"Regresja liniowa to najprostszy możliwy model:\n",
"\n",
"* im czegoś więcej na wejściu, tym proporcjonalnie (troszkę) więcej/mniej na wyjściu\n",
"\n",
"* nic prostszego nie da się wymyślić (funkcja stała??)\n",
"\n",
"* niestety model liniowy czasami kompletnie nie ma sensu (np. wzrost człowieka w\n",
" stosunku do wieku)\n"
]
},
{
"cell_type": "markdown",
"id": "egyptian-austria",
"metadata": {},
"source": [
"## Uczenie\n",
"\n",
"A jak nauczyć się wag z przykładów?\n",
"\n",
"* wzór (z odwracaniem macierzy) — problematyczny\n",
"\n",
"### Metoda gradientu prostego\n",
"\n",
"![Morskie Oko - Krzysztof Dudzik](08_files/morskieoko.jpg)\n",
"\n",
"Schodź wzdłuż lokalnego spadku funkcji błędu.\n",
"\n",
"Tak więc w praktyce zamiast podstawiać do wzoru lepiej się uczyć iteracyjnie -\n",
" metodą **gradientu prostego** (ang. _gradient descent_).\n",
"\n",
"1. Zacznij od byle jakich wag $w_i$ (np. wylosuj)\n",
"2. Weź losowy przykład uczący $x_1,\\dots,x_n$, $y$.\n",
"3. Oblicz wyjście $\\hat{y}$ na podstawie $x_1,\\dots,x_n$.\n",
"4. Oblicz funkcję błędu między $y$ a $\\hat{y}$.\n",
"5. Zmodyfikuj lekko wagi $(w_i)$ w kierunku spadku funkcji błędu.\n",
"6. Jeśli błąd jest duży, idź do 2.\n",
"\n",
"Modyfikacja wag:\n",
"\n",
"$$w_i := w_i - x_i (\\hat{y} - y) \\eta$$\n",
"\n",
"gdzie $\\eta$ to **współczynnik uczenia** _learning rate_.\n"
]
},
{
"cell_type": "markdown",
"id": "exact-train",
"metadata": {},
"source": [
"## Ewaluacja regresji\n",
"\n",
"To miary błędu (im mniej, tym lepiej!)}\n",
"\n",
"### Błąd bezwzględny (Mean Absolute Error, MAE)\n",
"\n",
"$$\\frac{1}{n}\\sum_{i=1}^n |\\hat{y}_i - y_i| $$\n",
"\n",
"### Mean Squared Error (MSE)\n",
"\n",
"$$\\frac{1}{n}\\sum_{i=1}^n (\\hat{y}_i - y_i)^2$$\n",
"\n",
"### Root Mean Squared Error (RMSE)\n",
"\n",
"$$\\sqrt{\\frac{1}{n}\\sum_{i=1}^n (\\hat{y}_i - y_i)^2}$$\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "selective-agriculture",
"metadata": {},
"source": [
"## Regresja liniowa dla tekstu\n",
"\n",
"Czym jest wektor $\\vec{x} = (x_1,\\dots,x_n)$? Wiemy, np. reprezentacja tf-idf (być z trikiem z haszowaniem, Word2vec etc.).\n",
"\n",
"![schemat regresji liniowej](08_files/regresja-liniowa-tekst.png)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "numerous-limitation",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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
}

BIN
wyk/08_files/linregr1.pdf Normal file

Binary file not shown.

BIN
wyk/08_files/linregr1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

8
wyk/08_files/linregr1.r Normal file
View File

@ -0,0 +1,8 @@
library(ggplot2)
prices = read.csv("mieszkania.tsv", sep="\t", header=TRUE)
prices$area = prices$powierzchnia
prices$price = prices$cena
pdf("linregr1.pdf")
ggplot(prices, aes(x=area, y=price)) + geom_point()
dev.off()

BIN
wyk/08_files/linregr2.pdf Normal file

Binary file not shown.

BIN
wyk/08_files/linregr2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

8
wyk/08_files/linregr2.r Normal file
View File

@ -0,0 +1,8 @@
library(ggplot2)
prices = read.csv("mieszkania.tsv", sep="\t", header=TRUE)
prices$area = prices$powierzchnia
prices$price = prices$cena
pdf("linregr2.pdf")
ggplot(prices, aes(x=area, y=price)) + geom_point() + stat_smooth(method=lm, se=FALSE)
dev.off()

121
wyk/08_files/mieszkania.tsv Normal file
View File

@ -0,0 +1,121 @@
powierzchnia cena
53 215000
60.01 219990
54 285000
60 330000
63 212000
39 219000
76.11 399000
48 119000
42.19 260000
53.41 323000
65.65 555000
65 185000
55 247000
100 280000
56 224000
39 230000
42.3 179000
49.65 305000
68 345000
37 145000
103 529000
62.3 209000
17.65 42000
45 500000
36.15 140000
45 159000
50 130000
48 84000
36 359000
39.3 116400
49.48 136950
26 85000
72 469000
64 239000
55 435000
90 175903
90 175903
90 175903
127.88 1710000
59 649000
48.7 240000
73 259000
32.9 275000
64 170000
44.72 174408
68 275000
38 323000
35 110000
63 165000
25 69000
50 290000
76.312 572325
65 429000
52.5 499000
58 145000
34 95000
46 280000
38 120000
52 269000
47 105000
63 266000
67.79 275000
60 550000
107 1230000
53 228000
48.65 148000
39 140000
23 170000
35 195000
71.19 245000
75 329000
53 185000
51 135000
42 133000
38 142000
45.6 470000
50 194000
29 158999
28.8 199000
36 199000
57.43 385621
57.71 402305
60.12 395000
38 210000
56.28 419000
60 346800
41 295000
28.7 219000
39 275000
37 105000
47 330000
64 435000
96 151200
35.34 87000
101 489000
50 129000
49.5 315000
14 2000
31 110000
50.9 265000
117 129000
52.2 250000
28 140000
15 5000
41.7 249000
56.4 490000
30.9 161000
42.3 229000
53 270000
72.4 409000
52.9 370000
37.77 135000
82 260000
32 195000
59 590000
62.01 205000
52.5 543000
56 170000
67.61 285000
51 494000
1 powierzchnia cena
2 53 215000
3 60.01 219990
4 54 285000
5 60 330000
6 63 212000
7 39 219000
8 76.11 399000
9 48 119000
10 42.19 260000
11 53.41 323000
12 65.65 555000
13 65 185000
14 55 247000
15 100 280000
16 56 224000
17 39 230000
18 42.3 179000
19 49.65 305000
20 68 345000
21 37 145000
22 103 529000
23 62.3 209000
24 17.65 42000
25 45 500000
26 36.15 140000
27 45 159000
28 50 130000
29 48 84000
30 36 359000
31 39.3 116400
32 49.48 136950
33 26 85000
34 72 469000
35 64 239000
36 55 435000
37 90 175903
38 90 175903
39 90 175903
40 127.88 1710000
41 59 649000
42 48.7 240000
43 73 259000
44 32.9 275000
45 64 170000
46 44.72 174408
47 68 275000
48 38 323000
49 35 110000
50 63 165000
51 25 69000
52 50 290000
53 76.312 572325
54 65 429000
55 52.5 499000
56 58 145000
57 34 95000
58 46 280000
59 38 120000
60 52 269000
61 47 105000
62 63 266000
63 67.79 275000
64 60 550000
65 107 1230000
66 53 228000
67 48.65 148000
68 39 140000
69 23 170000
70 35 195000
71 71.19 245000
72 75 329000
73 53 185000
74 51 135000
75 42 133000
76 38 142000
77 45.6 470000
78 50 194000
79 29 158999
80 28.8 199000
81 36 199000
82 57.43 385621
83 57.71 402305
84 60.12 395000
85 38 210000
86 56.28 419000
87 60 346800
88 41 295000
89 28.7 219000
90 39 275000
91 37 105000
92 47 330000
93 64 435000
94 96 151200
95 35.34 87000
96 101 489000
97 50 129000
98 49.5 315000
99 14 2000
100 31 110000
101 50.9 265000
102 117 129000
103 52.2 250000
104 28 140000
105 15 5000
106 41.7 249000
107 56.4 490000
108 30.9 161000
109 42.3 229000
110 53 270000
111 72.4 409000
112 52.9 370000
113 37.77 135000
114 82 260000
115 32 195000
116 59 590000
117 62.01 205000
118 52.5 543000
119 56 170000
120 67.61 285000
121 51 494000

BIN
wyk/08_files/morskieoko.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB