{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Uczenie maszynowe\n",
"# 3. Metody ewaluacji i optymalizacji"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## 3.1. Metodologia testowania"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"source": [
"W uczeniu maszynowym bardzo ważna jest ewaluacja budowanego modelu. Dlatego dobrze jest podzielić posiadane dane na odrębne zbiory – osobny zbiór danych do uczenia i osobny do testowania. W niektórych przypadkach potrzeba będzie dodatkowo wyodrębnić tzw. zbiór walidacyjny."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Zbiór uczący a zbiór testowy"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"* Na zbiorze uczącym (treningowym) uczymy algorytmy, a na zbiorze testowym sprawdzamy ich poprawność.\n",
"* Zbiór uczący powinien być kilkukrotnie większy od testowego (np. 4:1, 9:1 itp.).\n",
"* Zbiór testowy często jest nieznany.\n",
"* Należy unikać mieszania danych testowych i treningowych – nie wolno „zanieczyszczać” danych treningowych danymi testowymi!"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Czasami potrzebujemy dobrać parametry modelu, np. $\\alpha$ – który zbiór wykorzystać do tego celu?"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Zbiór walidacyjny"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Do doboru parametrów najlepiej użyć jeszcze innego zbioru – jest to tzw. **zbiór walidacyjny**"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
" * Zbiór walidacyjny powinien mieć wielkość zbliżoną do wielkości zbioru testowego, czyli np. dane można podzielić na te trzy zbiory w proporcjach 3:1:1, 8:1:1 itp."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Walidacja krzyżowa"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Którą część danych wydzielić jako zbiór walidacyjny tak, żeby było „najlepiej”?"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
" * Niech każda partia danych pełni tę rolę naprzemiennie!"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"\n",
"Żródło: https://chrisjmccormick.wordpress.com/2013/07/31/k-fold-cross-validation-with-matlab-code/"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Walidacja krzyżowa\n",
"\n",
"* Podziel dane $D = \\left\\{ (x^{(1)}, y^{(1)}), \\ldots, (x^{(m)}, y^{(m)})\\right\\} $ na $N$ rozłącznych zbiorów $T_1,\\ldots,T_N$\n",
"* Dla $i=1,\\ldots,N$, wykonaj:\n",
" * Użyj $T_i$ do walidacji i zbiór $S_i$ do trenowania, gdzie $S_i = D \\smallsetminus T_i$. \n",
" * Zapisz model $\\theta_i$.\n",
"* Akumuluj wyniki dla modeli $\\theta_i$ dla zbiorów $T_i$.\n",
"* Ustalaj parametry uczenia na akumulowanych wynikach."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Walidacja krzyżowa – wskazówki\n",
"\n",
"* Zazwyczaj ustala się $N$ w przedziale od $4$ do $10$, tzw. $N$-krotna walidacja krzyżowa (*$N$-fold cross validation*). \n",
"* Zbiór $D$ warto zrandomizować przed podziałem.\n",
"* W jaki sposób akumulować wyniki dla wszystkich zbiórow $T_i$?\n",
"* Po ustaleniu parametrów dla każdego $T_i$, trenujemy model na całych danych treningowych z ustalonymi parametrami.\n",
"* Testujemy na zbiorze testowym (jeśli nim dysponujemy)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### _Leave-one-out_\n",
"\n",
"Jest to szczególny przypadek walidacji krzyżowej, w której $N = m$."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"* Jaki jest rozmiar pojedynczego zbioru $T_i$?\n",
"* Jakie są zalety i wady tej metody?\n",
"* Kiedy może być przydatna?"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Zbiór walidujący a algorytmy optymalizacji\n",
"\n",
"* Gdy błąd rośnie na zbiorze uczącym, mamy źle dobrany parametr $\\alpha$. Należy go wtedy zmniejszyć.\n",
"* Gdy błąd zmniejsza się na zbiorze trenującym, ale rośnie na zbiorze walidującym, mamy do czynienia ze zjawiskiem **nadmiernego dopasowania** (*overfitting*).\n",
"* Należy wtedy przerwać optymalizację. Automatyzacja tego procesu to _early stopping_."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## 3.2. Miary jakości"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"source": [
"Aby przeprowadzić ewaluację modelu, musimy wybrać **miarę** (**metrykę**), jakiej będziemy używać.\n",
"\n",
"Jakiej miary użyc najlepiej?\n",
" * To zależy od rodzaju zadania.\n",
" * Innych metryk używa się do regresji, a innych do klasyfikacji"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Metryki dla zadań regresji\n",
"\n",
"Dla zadań regresji możemy zastosować np.:\n",
" * błąd średniokwadratowy (*root-mean-square error*, RMSE):\n",
" $$ \\mathrm{RMSE} \\, = \\, \\sqrt{ \\frac{1}{m} \\sum_{i=1}^{m} \\left( \\hat{y}^{(i)} - y^{(i)} \\right)^2 } $$\n",
" * średni błąd bezwzględny (*mean absolute error*, MAE):\n",
" $$ \\mathrm{MAE} \\, = \\, \\frac{1}{m} \\sum_{i=1}^{m} \\left| \\hat{y}^{(i)} - y^{(i)} \\right| $$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"source": [
"W powyższych wzorach $y^{(i)}$ oznacza **oczekiwaną** wartości zmiennej $y$ w $i$-tym przykładzie, a $\\hat{y}^{(i)}$ oznacza wartość zmiennej $y$ w $i$-tym przykładzie wyliczoną (**przewidzianą**) przez nasz model."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Metryki dla zadań klasyfikacji\n",
"\n",
"Aby przedstawić kilka najpopularniejszych metryk stosowanych dla zadań klasyfikacyjnych, posłużmy się następującym przykładem:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"outputs": [],
"source": [
"# Przydatne importy\n",
"\n",
"import ipywidgets as widgets\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas\n",
"import random\n",
"import seaborn\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"outputs": [],
"source": [
"def powerme(x1,x2,n):\n",
" \"\"\"Funkcja, która generuje n potęg dla zmiennych x1 i x2 oraz ich iloczynów\"\"\"\n",
" X = []\n",
" for m in range(n+1):\n",
" for i in range(m+1):\n",
" X.append(np.multiply(np.power(x1,i),np.power(x2,(m-i))))\n",
" return np.hstack(X)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"outputs": [],
"source": [
"def plot_data_for_classification(X, Y, xlabel=None, ylabel=None, Y_predicted=[], highlight=None):\n",
" \"\"\"Wykres danych dla zadania klasyfikacji\"\"\"\n",
" fig = plt.figure(figsize=(16*.6, 9*.6))\n",
" ax = fig.add_subplot(111)\n",
" fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)\n",
" X = X.tolist()\n",
" Y = Y.tolist()\n",
" X1n = [x[1] for x, y in zip(X, Y) if y[0] == 0]\n",
" X1p = [x[1] for x, y in zip(X, Y) if y[0] == 1]\n",
" X2n = [x[2] for x, y in zip(X, Y) if y[0] == 0]\n",
" X2p = [x[2] for x, y in zip(X, Y) if y[0] == 1]\n",
" \n",
" if len(Y_predicted) > 0:\n",
" Y_predicted = Y_predicted.tolist()\n",
" X1tn = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 0]\n",
" X1fn = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 0]\n",
" X1tp = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 1]\n",
" X1fp = [x[1] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 1]\n",
" X2tn = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 0]\n",
" X2fn = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 0]\n",
" X2tp = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 1 and yp[0] == 1]\n",
" X2fp = [x[2] for x, y, yp in zip(X, Y, Y_predicted) if y[0] == 0 and yp[0] == 1]\n",
" \n",
" if highlight == 'tn':\n",
" ax.scatter(X1tn, X2tn, c='r', marker='x', s=100, label='Dane')\n",
" ax.scatter(X1fn, X2fn, c='k', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1tp, X2tp, c='k', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1fp, X2fp, c='k', marker='x', s=50, label='Dane')\n",
" elif highlight == 'fn':\n",
" ax.scatter(X1tn, X2tn, c='k', marker='x', s=50, label='Dane')\n",
" ax.scatter(X1fn, X2fn, c='g', marker='o', s=100, label='Dane')\n",
" ax.scatter(X1tp, X2tp, c='k', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1fp, X2fp, c='k', marker='x', s=50, label='Dane')\n",
" elif highlight == 'tp':\n",
" ax.scatter(X1tn, X2tn, c='k', marker='x', s=50, label='Dane')\n",
" ax.scatter(X1fn, X2fn, c='k', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1tp, X2tp, c='g', marker='o', s=100, label='Dane')\n",
" ax.scatter(X1fp, X2fp, c='k', marker='x', s=50, label='Dane')\n",
" elif highlight == 'fp':\n",
" ax.scatter(X1tn, X2tn, c='k', marker='x', s=50, label='Dane')\n",
" ax.scatter(X1fn, X2fn, c='k', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1tp, X2tp, c='k', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1fp, X2fp, c='r', marker='x', s=100, label='Dane')\n",
" else:\n",
" ax.scatter(X1tn, X2tn, c='r', marker='x', s=50, label='Dane')\n",
" ax.scatter(X1fn, X2fn, c='g', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1tp, X2tp, c='g', marker='o', s=50, label='Dane')\n",
" ax.scatter(X1fp, X2fp, c='r', marker='x', s=50, label='Dane')\n",
"\n",
" else:\n",
" ax.scatter(X1n, X2n, c='r', marker='x', s=50, label='Dane')\n",
" ax.scatter(X1p, X2p, c='g', marker='o', s=50, label='Dane')\n",
" \n",
" if xlabel:\n",
" ax.set_xlabel(xlabel)\n",
" if ylabel:\n",
" ax.set_ylabel(ylabel)\n",
" \n",
" ax.margins(.05, .05)\n",
" return fig"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"slideshow": {
"slide_type": "notes"
}
},
"outputs": [],
"source": [
"# Wczytanie danych\n",
"import pandas\n",
"import numpy as np\n",
"\n",
"alldata = pandas.read_csv('data-metrics.tsv', sep='\\t')\n",
"data = np.matrix(alldata)\n",
"\n",
"m, n_plus_1 = data.shape\n",
"n = n_plus_1 - 1\n",
"\n",
"X2 = powerme(data[:, 1], data[:, 2], n)\n",
"Y2 = np.matrix(data[:, 0]).reshape(m, 1)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"