#!/usr/bin/env python
# coding: utf-8
# Sveučilište u Zagrebu
# Fakultet elektrotehnike i računarstva
#
# # Strojno učenje
#
# http://www.fer.unizg.hr/predmet/su
#
# Ak. god. 2015./2016.
#
# # Bilježnica 2: Osnovni koncepti strojnog učenja
#
# (c) 2015 Jan Šnajder
#
# Verzija: 0.7 (2015-10-21)
# In[1]:
import scipy as sp
import scipy.stats as stats
import matplotlib.pyplot as plt
from numpy.random import normal
get_ipython().run_line_magic('pylab', 'inline')
# ### Sadržaj:
#
# * Tipični koraci primjene algoritma SU
#
# * Prostor primjera
#
# * Hipoteza i model
#
# * Empirijska pogreška
#
# * Prostor inačica
#
# * Složenost modela
#
# * Induktivna pristranost
#
# * Tri komponente svakog algoritma SU
#
# * Primjer: regresija
#
# * Problem šuma
#
# * Odabir modela
# # Tipični koraci primjene algoritma SU
#
#
#
# 1. Priprema podataka
#
# 2. (Označavanje podataka za učenje i ispitivanje)
#
# 3. (Redukcija dimenzionalnosti)
#
# 4. **Odabir modela**
#
# 5. **Učenje modela**
#
# 6. **Vrednovanje modela**
#
# 7. **Dijagnostika i ispravljanje (debugging)**
#
# 8. Instalacija (deployment)
#
#
# * Naš fokus su koraci 4-7
# # Prostor primjera
#
#
# * Prostor primjera (ulazni prostor): $\mathcal{X}$
#
#
# * Dimenzija ulaznog prostora: $n$
#
#
# * Primjer je vektor u ulaznom prostoru: $\mathbf{x} = (x_1, x_2, \dots, x_n)^T \in \mathcal{X}$
#
#
# * Oznaka (engl. *label*) klase (za klasifikaciju) ili ciljna vrijednost (za regresiju): $y$
#
#
# * Skup oznaka klase: $\mathcal{Y} = \{0, \dots, K\}$
# * Broj klasa: $K$
# * Binarna klasifikacija: $K=2$, $\mathcal{Y} = \{0,1\}$
#
#
# * Broj primjera: $N$
#
#
# * Skup označenih primjera za učenje: $\mathcal{D} = \big\{(x^{(i)}, y^{(i)})\big\}_{i=1}^N \subseteq \mathcal{X}\times\mathcal{Y}$
#
#
# * Matrično:
# \begin{array}{lllll|l}
# &x_1 & x_2 & \cdots & x_n & \mathbf{y}\\
# \hline
# \mathbf{x}^{(1)} = & x_1^{(1)} & x_2^{(1)} & \cdots & x_n^{(1)} & y^{(1)}\\
# \mathbf{x}^{(2)} = & x_1^{(2)} & x_2^{(2)} & \cdots & x_n^{(2)} & y^{(2)}\\
# & \vdots\\
# \mathbf{x}^{(N)} = & x_1^{(N)} & x_2^{(N)} & \cdots & x_n^{(N)} & y^{(N)}\\
# \end{array}
# Matrica $\mathcal{D}$ sastavljena je od matrice $\mathbf{X}_{N\times n}$ i vektora $\mathbf{y}_{N\times 1}$
#
# # Hipoteza i model
#
# * Hipoteza: $h : \mathcal{X} \to \mathcal{Y}$
# * Funkcija koja svakom primjeru (iz prostora primjera) dodjeljuje oznaku klase (iz skupa oznaka klase)
#
#
# * Binarna klasifikacija: $h : \mathcal{Y} \to \{0, 1\}$
# * Definicija: Primjer $\mathbf{x}\in\mathcal{X}$ **zadovoljava** hipotezu $h$ akko $h(\mathbf{x})=1$
# * Definicija: Hipoteza $h$ je **konzistentna** s primjerom $(\mathbf{x}, y)$ akko $h(\mathbf{x})=y$
#
#
# * Općenitije: $h(\mathbf{x} | \theta)$
# * Funkcija parametrizirana parametrima $\theta$ (vektor parametara)
# * Npr.:
# * Linearna regresija: $h(x) = \theta_1 x + \theta_0$
# * Linearan klasifikacijski model: $h(x_1,x_2|\theta_0,\theta_1,\theta_2) = \mathbf{1}\{\theta_1 x_1 + \theta_2 x_2 + \theta_0 \geq 0\}$
#
#
#
# * Model $\mathcal{H}$: skup hipoteza $h$
#
#
# * Formalno: $\mathcal{H} = \big\{ h(\mathbf{x} | \theta)\big\}_{\theta}$
# * Familija funkcija parametriziranih s $\theta$
#
#
# * Učenje (treniranje modela) svodi se na **pretraživanje** prostora hipoteza $\mathcal{H}$ i nalaženje **najbolje** hipoteze $h\in \mathcal{H}$
# * Najbolja hipoteza: ona koja najtočnije klasificira primjere (klasifikacija) odnosno daje vrijednosti najbliže ciljnim vrijednostima (regresija)
# * Optimizacijski problem!
#
#
# * [Primjer: Ulazni prostor + prostor parametara]
#
#
# * $\mathcal{H}$ je vrlo velik, pa nam često treba heuristička optimizacija
# # Empirijska pogreška
#
# * Iskazuje koliko točno hipoteza klasificira primjere (klasifikacija) ili koliko su vrijednosti blizu ciljnih vrijednosti (regresija)
#
#
# * Pogreška klasifikacija (engl. *misclassification error*):
#
# $$
# E(h|\mathcal{D})
# = \frac{1}{N} \sum_{i=1}^N \mathbf{1}\{h(\mathbf{x})^{(i)} \neq y^{(i)}\}
# $$
#
# * Specifično, za binarnu klasifikaciju s $\mathcal{Y}=\{0,1\}$:
#
# $$
# E(h|\mathcal{D}) = \frac{1}{N} \sum_{i=1}^N |h(\mathbf{x})^{(i)} - y^{(i)}|
# $$
#
# * [Primjer]
#
#
# * Vrijednost pogreške načinjene na pojedinačnom primjeru (funkcija unutar sume) zove se **funkcija gubitka** (engl. *loss function*)
# * Gubitak $\mathbf{1}\{h(\mathbf{x})^{(i)} \neq y^{(i)}\}$ zove se **gubitak nula-jedan** (engl. *zero-one loss*)
# # Prostor inačica (engl. *version space*)
#
#
# * $\mathit{VS}_{\mathcal{H},\mathcal{D}} \subseteq \mathcal{H}$
#
#
# * Skup hipoteza iz $\mathcal{H}$ koje su konzistentne s primjerima za učenje $\mathcal{D}$
#
# $$
# \mathit{VS}_{\mathcal{H},\mathcal{D}} =
# \Big\{h\in\mathcal{H} \mid \forall(\mathbf{x},y)\in\mathcal{D}.\ \big(h(\mathbf{x})=y\big)\Big\}
# $$
#
# * [Primjer]
#
#
# # Složenost modela
#
#
# * Idealno, u modelu $\mathcal{H}$ postoji hipoteza $h$ koja je konzistentna s $\mathcal{D}$, tj. hipoteza za koju vrijedi $E(h|\mathcal{D}) = 0$
#
#
# * No, moguće je da takva $h$ ne postoji, tj. $\forall h\in\mathcal{H}. E(h|\mathcal{D}) > 0$
#
#
# * Tada kažemo da model $\mathcal{H}$ nije dovoljne **složenosti** (ili kapaciteta)
#
#
# * [Primjer]
#
#
# * [Zadatak: 6 primjera]
# #Induktivna pristranost (engl. *inductive bias*)
#
# * Učenje hipoteze je **loše definiran problem**: $h$ ne slijedi deduktivno iz $\mathcal{D}$
#
#
# * Primjer 1: Učenje Booleove funkcije
#
# \begin{array}{ccc|c}
# x_1 & x_2 & x_3 & y\\
# \hline
# 0&0&0&\color{red}{\textbf{?}}\\
# 0&0&1&\color{red}{\textbf{?}}\\
# 0&1&0&1\\
# 0&1&1&0\\
# 1&0&0&1\\
# 1&0&1&0\\
# 1&1&0&\color{red}{\textbf{?}}\\
# 1&1&1&1\\
# \end{array}
#
# * $N = |\mathcal{D}|=5$, $n=3$, $\mathcal{X} = \{0,1\}^3$, $|\mathit{VS}| = 2^{2^n - N} = 8$
#
#
# * **Generalizacija** - sposobnost klasifikacije još neviđenih primjera
#
#
# * Učenje i generalizacija nisu mogući bez **dodatnih pretpostavki**
# * *Futility of bias-free learning*
#
#
# * **Induktivna pristranost** (engl. inductive bias)
# * $\mathcal{L}$ - algoritam učenja
# * $h_\mathcal{L}$ - hipoteza inducirana pomoću $\mathcal{L}$ na $\mathcal{D}$
# * $h_\mathcal{L}(\mathbf{x})$ - klasifikacija primjera $\mathbf{x}\in\mathcal{X}$
# * Induktivna pristranost od $\mathcal{L}$ je bilo koji skup minimalnih pretpostavki $\mathcal{B}$ takvih da
#
# $$
# \forall \mathcal{D}.\,\forall\mathbf{x}\in \mathcal{X}.\,\big((\mathcal{B}\land\mathcal{D}\land\mathbf{x})\ \vdash\ h_\mathcal{L}(\mathbf{x})\big)
# $$
#
#
# * Skup pretpostavki koje *od indukcije čine dedukciju*
#
#
# * Dvije vrste induktivne pristranosti:
#
# * **Pristranost jezika** (pristranost ograničenjem): odabiremo model $\mathcal{H}$ koji ograničava skup prikazivih hipoteza
#
# * **Pristranost preferencijom** (pristranost pretraživanja): definiramo način pretraživanja unutar $\mathcal{H}$
#
#
# * Većina aloritama SU kombinira obje vrste pristranosti
#
#
# * [Primjer 2: Ulazni prostor + prostor parametara]
#
#
# * Zadatak 3:
# * Učenje Booleove funkcije u $\mathcal{X}=\{0,1\}$, $\mathcal{H}$ je skup pravaca
# * Q: Koja je ovo vrsta pristranosti?
# * Q: Koliko različitih hipoteza postoji?
# * Q: Postoji li za svako označavanje konzistentna hipoteza u $\mathcal{H}$?
#
#
# * Razmotrimo opet Primjer 1, uz $\mathcal{H} = \text{skup ravnina u $\mathbb{R}^3$}$
# #Tri komponente svakog algoritma SU
#
#
# * **(1) Model** $\mathcal{H}$
# * $\mathcal{H} = \big\{ h(\mathbf{x} | \theta)\big\}_{\theta}$
#
#
# * **(2) Funkcija gubitka** $L(y, h(\mathbf{x}))$
#
# * Izračunava kolika je pogreška hipoteze (naučenog modela) na primjeru $\mathbf{x}^{(i)}$
#
# * Uobičajene funkcije gubitka:
# * Kvadratno odstupanje (regresija): $L\big(y,h(\mathbf{x}^{(i)}|\theta)\big)=(h(\mathbf{x}^{(i)}|\theta) - y^{(i)})^2$
# * Gubitak 0-1 (klasifikacija): $L\big(y,h(\mathbf{x}^{(i)}|\theta)\big) = \mathbf{1}\{h(\mathbf{x})^{(i)} \neq y^{(i)}\}$
#
#
# * **Funkcija pogreške** definirana je kao očekivana vrijednost funkcije gubitka na primjerima iz $\mathcal{X}\times\mathcal{Y}$
# $$
# E(h) = \mathbb{E}_{\mathbf{x},y}[L]
# $$
# * Međutim, prava distribucija primjera i oznaka, $P(\mathbf{x}, y)$ je nepoznata, pa umjesto toga računamo *empirijsku pogrešku* (pogrešku na skupu označenih primjera $\mathcal{D}$)
# $$E(h|\mathcal{D}) = \mathbb{E}_{D}[L] = \frac{1}{N} \sum_{i=1}^N L\big(y^{(i)}, h(\mathbf{x}^{(i)})\big)$$
# * Budući da su hipoteze indeksirane preko parametara $\theta$, možemo pisati
# $$E(\color{red}{\theta}|\mathcal{D}) = \mathbb{E}_{D}[L] = \frac{1}{N} \sum_{i=1}^N L\big(y^{(i)}, h(\mathbf{x}^{(i)}|\color{red}{\theta})\big)$$
#
# * **(3) Optimizacijski postupak**
#
# * Postupak kojim nalazimo hipotezu $h^*$ koja minimizira empirijsku pogrešku
# $$
# h^* = \mathrm{argmin}_{h\in\mathcal{H}} E(h|\mathcal{D})
# $$
# tj.
# $$
# \theta^* = \mathrm{argmin}_{\theta} E(\theta|\mathcal{D})
# $$
#
#
# * Optimizacija može biti analitička ili heuristička
# * Analitičke postupke koristimo kada postoji rješenje u **zatvorenoj formi**
#
#
# * Gornje tri komponente definiraju i induktivnu pristranost svakog algoritma
# * Q: Koja vrsta induktivne pristranosti je vezana uz koje komponente?
# # Primjer: regresija
#
# * $y \in \mathbb{R}$
#
#
# * Na temelju $\mathcal{D}=\{(\mathbf{x}^{(i)},y^{(i)})\}$ učimo funkciju $h$ koja aproksimira nepoznatu funkciju $f:\mathcal{X}\to\mathbb{R}$
#
#
# * Idealno, $y^{(i)}=f(\mathbf{x}^{(i)})$, ali zbog šuma $y=f(\mathcal{x}^{(i)})+\varepsilon$
#
#
# * [Primjeri: Box Office Revenue, prosjek ocjena, cijena automobila]
#
#
# * Funkcija gubitka je kvadratna:
# $$
# L(y, h(\mathbf{x})) = (y - h(\mathbf{x}))^2
# $$
# pa je empirijska pogreška hipoteze
# $$
# E(h|\mathcal{D})=\color{red}{\frac{1}{2}}\sum_{i=1}^N\big(y^{(i)}-h(\mathbf{x}^{(i)})\big)^2
# $$
# NB: Umjesto $1/N$, kod pogreške regresije koristimo $1/2$ zbog kasnije matematičke jednostavnosti. To međutim nema utjecaja na optimizaciju (radi se o konstanti)
#
# * **Linearan model**: hiperravnina u $\mathbb{R}^n$
#
# $$
# h(\mathbf{x}|\mathbf{w}) = w_1 x_1 + w_2 x_2 + \dots + w_n x_n + w_0 =
# \sum_{i=1}^n w_i x_i + w_0 = \mathbf{w}^T\mathbf{x} + w_0
# $$
#
# * Za $n=2$ imamo $\mathcal{X}=\mathbb{R}$. Model je
# $$
# h(x|\mathbf{w}) = w_1 x + w_0
# $$
# funkcija gubitka je
# $$
# L(y^{(i)}, h(x^{(i)})) = \big(y^{(i)}-(w_1 x^{(i)} + w_0)\big)^2
# $$
# a pogreška je
#
# $$
# E(h|\mathcal{D})=\frac{1}{2}
# \sum_{i=1}^N\big(y^{(i)}-(w_1 x^{(i)} + w_0)\big)^2
# $$
# **(1) Model**:
# In[2]:
def h(x, w): return w[1] * x + w[0]
# **(2) Funkcija gubitka** (i njoj odgovarajuća funkcija pogreške):
# In[3]:
def quadratic_loss(y, hx):
return (y - hx)**2
def error(h, X, y):
err = 0
for xi, yi in zip(X, y):
err += quadratic_loss(yi, h(xi))
return 0.5 * err
# Funkcija koja generira podatke (i koju zapravo želimo naučiti):
# In[4]:
def f(x): return 3 * x + 2
xs = sp.linspace(0, 10)
plt.plot(xs, f(xs));
# Skup primjera za učenje $\mathcal{D}=(\mathbf{X},\mathbf{y})$ dobiven je iz $f(x)$, uz dodatan šum:
# In[5]:
X = linspace(0, 10)
y = f(X) + 2 * stats.norm.rvs(scale=3, size=50)
# In[6]:
X
# In[7]:
len(_)
# In[8]:
y
# In[6]:
plt.plot(xs, f(xs), '--')
plt.scatter(X, y)
plt.show()
# Dvije hipoteze iz našeg modela:
# In[7]:
def h1(x): return h(x, [0,1])
def h2(x): return h(x, [0,2])
# In[8]:
weights = [[0,1], [0,2], [1,2]]
plt.plot(xs, f(xs), '--')
plt.scatter(X, y)
plt.plot(xs, h1(xs), 'r', label='h1')
plt.plot(xs, h2(xs), 'g', label='h2')
plt.legend();
# Empirijske pogreške hipoteza na skupu $\mathcal{D}$:
# In[9]:
error(h1, X, y)
# In[10]:
error(h2, X, y)
# **(3) Optimizacijski postupak**
#
# * Tražimo $h\in\mathcal{H}$ koja minimizira empirijsku pogrešku
#
# $$
# h^* =
# \mathrm{argmin}_{h\in\mathcal{H}} E(h|\mathcal{D}) =
# \mathrm{argmin}_{h\in\mathcal{H}} \frac{1}{2}
# \sum_{i=1}^N\big(y^{(i)}-h(x^{(i)})\big)^2
# $$
#
# * Hipoteza $h$ je indeksirana parametrima $(w_0, w_1)$, dakle zapravo tražimo
#
# $$
# (w_0,w_1)^* =
# \mathrm{argmin}_{w_0,w_1} \frac{1}{2}
# \sum_{i=1}^N\big(y^{(i)}-(w_1 x^{(i)} + w_0)\big)^2
# $$
#
# * U ovom slučaju postoji **analitičko rješenje** (rješenje u zatvorenoj formi)
#
# \begin{eqnarray*}
# && \nabla_{w_0,w_1} E(h|\mathcal{D})=0\\
# &&\frac{\partial}{\partial w_0}\Big[
# \frac{1}{2}\sum_i^N\big(y^{(i)}-(w_1 x^{(i)}+ w_0)\big)^2\Big] = 0 \\
# &&\frac{\partial}{\partial w_1}\Big[\frac{1}{2}\sum_i^N\big(y^{(i)}-(w_1 x^{(i)}+
# w_0)\big)^2\Big] = 0\\
# &&\vdots\\
# && w_0= \bar{y} - w_1\bar{x}\\
# && w_1 = \frac{\sum_i^N x^{(i)}y^{(i)} - N\bar{x}\bar{y} }
# {\sum_i^N(x^{(i)})^2 - N\bar{x}^2}
# \end{eqnarray*}
#
# In[11]:
N = len(X)
x_mean = sp.mean(X)
y_mean = sp.mean(y)
w1 = (np.dot(X, y) - N * x_mean * y_mean) / (sum(X**2) - N * (x_mean**2))
w0 = sp.mean(y) - w1 * sp.mean(X)
# In[12]:
print w1, w0
# In[13]:
def h_best(x): return h(x, [w0,w1])
# In[14]:
plt.plot(xs, f(xs), '--')
plt.scatter(X, y)
plt.plot(xs, h_best(xs), 'r');
# In[15]:
error(h_best, X, y)
# * U gornjem primjeru radili smo s modelom prvog stupnja
#
# $$
# h_1(x) = w_1 x + w_0
# $$
#
# * Međutim, mogli smo odabrati i složeniji model, npr. polinom drugog stupnja:
# $$
# h_2(x) = w_2 x^2 + w_1 x + w_0
# $$
# ili četvrtog stupnja:
# $$
# h_4(x) = w_4 x^4 + w_3 x^3 + w_2 x^2 + w_1 x + w_0
# $$
#
# * Ovo je i dalje linearna regresija, i dalje ima analitičko rješenje
# In[16]:
from SU import PolyRegression
# In[18]:
X1 = X.reshape((50,1))
h2 = PolyRegression(2).fit(X1, y)
h4 = PolyRegression(4).fit(X1, y)
# In[19]:
plt.plot(xs, f(xs), '--')
plt.scatter(X, y)
plt.plot(X1, h2.predict(X1), 'r');
plt.plot(X1, h4.predict(X1), 'g');
# In[20]:
error(h2, X, y)
# In[21]:
error(h4, X, y)
#
# * Možemo očekivati da vrijedi:
# $$
# E(h_4|\mathcal{D}) \leq E(h_2|\mathcal{D}) \leq E(h_1|\mathcal{D})
# $$
# Q: Zašto?
#
#
# * Q: Koji model odabrati u ovom slučaju?
#
#
# * Q: Koji model općenito odabrati za neke podatke $\mathcal{D}$?
# # Problem šuma
#
# * **Šum** je neželjena anomalija u podacima
#
#
# * Mogući uzroci:
# * Nepreciznost pri mjerenju značajki
# * Pogreške u označavanju (engl. *teacher noise*)
# * Postojanje skrivenih značajki (latentnih varijabli)
# * Nejasne granice klasa (subjektivnost)
#
#
# * Zbog šuma je granica između pozitivnih i negativnih primjera složenija nego što bi idealno bila!
#
#
# * [Primjer 1: binarna klasifikacija po značajkama dobi i prihoda]
#
#
# * Jednostavni modeli ne mogu doseći $E(h|\mathcal{D})=0$
#
#
# * S druge strane, složeni modeli uče šum, a ne pravu klasifikaciju!
#
#
# * [Primjer 2]
#
#
# * Šum u načelu nije moguće odvojiti od pravih podataka
# * Moguće je samo za stršeće vrijednosti (engl. *outliers*)
# # Odabir modela
#
# * Moramo odabrati model $\mathcal{H}$ (učenje bez pristranosti je uzaludno)!
#
#
# * Često radimo odabir modela unutar neke familije modela (npr. kod regresije: odabir stupnja polinoma)
#
#
# * Stupanj polinoma je **hiperparametar** modela ($w_i$ su parametri)
#
#
# * ** Odabir modela = optimizacija modela, optimizacija hiperparametara **
#
# ### Primjer: regresija
# In[22]:
def g(x): return x**3 - 10 * x**2 + 2 * x - 2
xs = sp.linspace(0, 10)
plt.plot(xs, g(xs));
# In[23]:
X = sp.linspace(0,10)
y = g(X) + 5 * stats.norm.rvs(scale=3, size=50)
plt.plot(xs, g(xs), '--')
plt.scatter(X, y)
plt.show()
# In[24]:
plt.plot(xs, g(xs), '--')
plt.scatter(X, y)
X1 = X.reshape((50,1))
for degree in range(1, 8):
h = PolyRegression(degree).fit(X1, y)
plt.plot(X1, h.predict(X1), label="d=%d" % degree);
print "error(h%d) = %.2f" % (degree, error(h, X, y))
plt.legend()
plt.show()
#
# * Model koji odgovara pravoj funkciji koja je generirala podatke je $h_3$, tj. **optimalan hiperparametar je $d=3$**
#
#
# * Modeli $h_1$ i $h_2$ imaju veću pogrešku od $h_3$ i njih sigurno ne bismo uzeli
#
#
# * Međutim, modeli $h_4$ i $h_5$ imaju manju pogrešku od $h_3$
#
# * Očito, što je veći kapacitet modela $\mathcal{H}$, to je manja pogreška $E(h|\mathcal{D})$, $h\in\mathcal{H}$
#
#
# * Ali model mora moći **generalizirati!**
#
#
# * Preferiramo jednostavne modele
# * bolja generalizacija
# * lakše učenje/uporaba
# * lakše tumačenje
#
#
# * **Occamova britva**
#
#
#
#
#
# * Trebamo odabrati model koji točno odgovara *pravoj složenosti* funkcije koju nastojimo naučiti
#
#
# * Dvije krajnosti:
#
# * **Podnaučenost (engl. underfitting)** - $\mathcal{H}$ je prejednostavan u odnosu na stvarnu funkciju $\Rightarrow$ loša klasifikacija na viđenim i neviđenim primjerima
#
# * **Prenaučenost (engl. overfitting)** - $\mathcal{H}$ je previše složen u odnosu na stvarnu funkciju $\Rightarrow$ loša klasifikacija na neviđenim primjerima (loša generalizacija)
#
#
# * [Primjer: Podnaučenost/prenaučenost kod klasifikacije]
#
#
# * Drugi pogled:
# * Jednostavan model ima **visoku pristranost** (engl. high bias)
# * Složen model ima **visoku varijancu** (engl. high variance)
# * Odabir modela $\Rightarrow$ kompromis između pristranosti i varijance (engl. bias-variance tradeoff)
# * Optimalan model minimizira zajednički pristranost i varijancu
#
#
# * **Pretpostavka induktivnog učenja**
# * Ako je **(1)** pogreška hipoteze na dovoljno velikom skupu primjera za učenje mala i **(2)** ako model nije suviše složen, hipoteza će dobro klasificirati i nove, **(3)** slične primjere
# # Unakrsna provjera (engl. *cross-validation*)
#
# * Metoda za procjenu sposobnosti generalizacije modela
# * Skup primjera dijelimo na **skup za učenje** i **skup za ispitivanje**
# $$
# \mathcal{D} = \mathcal{D}_{\mathrm{train}} \cup \mathcal{D}_{\mathrm{test}}
# $$
# * Model učimo na skupu za učenje, a ispitujemo na skupu za ispitivanje
# * Primjeri iz skupa za ispitivanje model dosad nije vidio, pa na tom skupu dobivamo dobru (pravednu) procjenu pogreške generalizacije
#
#
# * Računamo dvije pogreške za $h\in\mathcal{H}$:
# * **Pogreška učenja** (engl. *train error*): empirijska pogreška hipoteze na skupu za učenje, $P(h|\mathcal{D}_{\mathrm{train}})$
# * **Ispitna pogreška** (engl. *test error*): empirijska pogreška hipoteze na skupu za ispitivanje, $P(h|\mathcal{D}_{\mathrm{test}})$
#
#
# * $P(h|\mathcal{D}_{\mathrm{train}})$ pada sa složenošću modela, dok $P(h|\mathcal{D}_{\mathrm{test}})$ tipično prvo opada a zatim raste
#
#
# * Optimalan model je onaj koji minimizira $P(h|\mathcal{D}_{\mathrm{test}})$
#
#
# * [Graf: Pogreške s obzirom na složenost modela]
#
#
# * Što ako želimo optimirati parametre modela?
#
# * Ne možemo to raditi na skupu za provjeru!
#
# * Trebamo još jedan skup: **skup za provjeru** (engl. *validation set*)
#
# * Tročlana particija skupa primjera:
# $$
# \mathcal{D} = \mathcal{D}_{\mathrm{train}} \cup \mathcal{D}_{\mathrm{val}} \cup \mathcal{D}_{\mathrm{test}}
# $$
# $$
# \mathcal{D}_{\mathrm{train}} \cap \mathcal{D}_{\mathrm{val}} =
# \mathcal{D}_{\mathrm{train}} \cap \mathcal{D}_{\mathrm{test}} =
# \mathcal{D}_{\mathrm{val}} \cap \mathcal{D}_{\mathrm{test}} = \emptyset
# $$
#
# ### Primjer: Regresija
# In[25]:
XY = np.column_stack((X1, y))
np.random.shuffle(XY)
# In[28]:
X_train, y_train = XY[:30,0:1], XY[:30,1]
X_test, y_test = XY[30:,0:1], XY[30:,1]
# In[29]:
len(X_train), len(X_test)
# In[30]:
plt.plot(xs, g(xs), '--')
plt.scatter(X_train, y_train, c='b')
plt.scatter(X_test, y_test, c='r');
# In[31]:
plt.plot(xs, g(xs), '--')
plt.scatter(X_train, y_train, c='b')
plt.scatter(X_test, y_test, c='r');
for degree in range(1, 8):
h = PolyRegression(degree).fit(X_train, y_train)
plt.plot(X1, h.predict(X1), label="d=%d" % degree);
print "train_error(h%d) = %.2f; test_error(h%d) = %.2f" % (degree, error(h, X_train, y_train), degree, error(h, X_test, y_test))
plt.legend()
plt.show()
# In[32]:
train_errors = []
test_errors = []
degrees = range(1,8)
for degree in degrees:
h = PolyRegression(degree).fit(X_train, y_train)
train_error = error(h, X_train, y_train)
test_error = error(h, X_test, y_test)
train_errors.append(train_error)
test_errors.append(test_error)
# In[33]:
plt.plot(list(degrees), train_errors, label="train_error")
plt.plot(list(degrees), test_errors, label="test_error")
plt.legend()
plt.show()
# # Odabir modela kao minimizacija rizika*
#
# * Pogled na problem optimizacije modela iz **statističke teorije učenja**
#
#
# * Rizik = očekivanje gubitka = pogreška hipoteze
#
#
# * **Empirijski rizik $R_{\mathrm{emp}}$** = procjena pogreške na skupu primjera, $E(h|\mathcal{D})$
#
#
# * **Strukturni rizik $R_{\mathrm{struct}}$** = kvantifikacija složenosti modela
# * Npr.: broj parametara, veličina zapisa modela i sl.
# * Što je model složeniji, to je veći strukturni rizik
#
#
# * Želimo modele $\mathcal{H}$ koji (za naučenu $h\in\mathcal{H}$) minimiziraju i empirijski i strukturni rizik
# $$
# R_{\mathrm{emp}}(h) + \lambda R_{\mathrm{struct}}(h)
# $$
# gdje $\lambda$ definira važnost empirijskog rizika u odnosu na strukturni
#
#
# * [Grafikon: empirijska + strukturna pogreška]
#
#
# * Dakle, umjesto minimizacije
# $$
# h^* = \mathrm{argmin}_{h\in\mathcal{H}} E(h|\mathcal{D})
# $$
# imamo
# $$
# h^* = \mathrm{argmin}_{h\in\mathcal{H}} E(h|\mathcal{D}) + \lambda R_{\mathrm{struct}}(h)
# $$
#
#
# * Minimizacija strukturnog rizika je alternativa unakrsnoj provjeri
#
#
# * U praksi ipak koristimo unakrsnu provjeru (jer je pouzdanija)
#
#
# * Često kombiniramo unakrsnu provjeru s minimizacjom strukturnog rizika (tzv. regularizacija)
# # Sažetak
#
# * **Hipoteza** je funkcija koja klasificira primjere (kod klasifikcije) ili daje brojčanu vrijednost (kod regresije), a **model** je skup hipoteza
#
#
# * Različiti modeli imaju različite **složenosti** (kapacitete)
#
#
# * Učenje nije moguće bez **induktivne pristranosti**, koja može **pristranost jezika** ili **pristranost preferencijom**
#
#
# * Svaki algoritam SU ima tri komponente: **model**, **funkciju gubitka** i **optimizacijski postupak**
#
#
# * Empirijsku pogrešku hipoteze izračunavamo kao očekivanje funkcije gubitka na skupu primjera
#
#
# * Učenje modela svodi se na **optimizaciju parametara** modela s empirijskom pogreškom kao kriterijem
# * Konkretno, kod regresije postoji **analitičko rješenje** za taj problem
#
#
# * Model koji je **podnaučen** ili **prenaučen** loše generalizira
#
#
# * Odabir modela svodi se na **optimiranje hiperparametara** modela
#
#
# * **Unakrsnom provjerom** možemo procijeniti **pogreška generalizacije** i odabrati optimalan model
#