forked from pms/uczenie-maszynowe
Wykład 9
This commit is contained in:
parent
773f85319a
commit
2a2ff36b44
File diff suppressed because one or more lines are too long
39142
wyk/02_Regresja_liniowa_1.ipynb
Normal file
39142
wyk/02_Regresja_liniowa_1.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
2245
wyk/09_NB_i_KNN.ipynb
Normal file
2245
wyk/09_NB_i_KNN.ipynb
Normal file
File diff suppressed because one or more lines are too long
722
wyk/10_Drzewa_decyzyjne_i_SVM.ipynb
Normal file
722
wyk/10_Drzewa_decyzyjne_i_SVM.ipynb
Normal file
@ -0,0 +1,722 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Uczenie maszynowe\n",
|
||||
"# 10. Przegląd metod uczenia nadzorowanego – część 2"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"## 10.1. Drzewa decyzyjne"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Drzewa decyzyjne – przykład"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 61,
|
||||
"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",
|
||||
"\n",
|
||||
"%matplotlib inline"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 64,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" Day Outlook Humidity Wind Play\n",
|
||||
"0 1 Sunny High Weak No\n",
|
||||
"1 2 Sunny High Strong No\n",
|
||||
"2 3 Overcast High Weak Yes\n",
|
||||
"3 4 Rain High Weak Yes\n",
|
||||
"4 5 Rain Normal Weak Yes\n",
|
||||
"5 6 Rain Normal Strong No\n",
|
||||
"6 7 Overcast Normal Strong Yes\n",
|
||||
"7 8 Sunny High Weak No\n",
|
||||
"8 9 Sunny Normal Weak Yes\n",
|
||||
"9 10 Rain Normal Weak Yes\n",
|
||||
"10 11 Sunny Normal Strong Yes\n",
|
||||
"11 12 Overcast High Strong Yes\n",
|
||||
"12 13 Overcast Normal Weak Yes\n",
|
||||
"13 14 Rain High Strong No\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"alldata = pandas.read_csv('tennis.tsv', sep='\\t')\n",
|
||||
"print(alldata)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 65,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'Outlook': {'Overcast', 'Rain', 'Sunny'},\n",
|
||||
" 'Humidity': {'High', 'Normal'},\n",
|
||||
" 'Wind': {'Strong', 'Weak'}}"
|
||||
]
|
||||
},
|
||||
"execution_count": 65,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Dane jako lista słowników\n",
|
||||
"data = alldata.T.to_dict().values()\n",
|
||||
"features = ['Outlook', 'Humidity', 'Wind']\n",
|
||||
"\n",
|
||||
"# Możliwe wartości w poszczególnych kolumnach\n",
|
||||
"values = {feature: set(row[feature] for row in data)\n",
|
||||
" for feature in features}\n",
|
||||
"values"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"* Czy John zagra w tenisa, jeżeli będzie padać, przy wysokiej wilgotności i silnym wietrze?\n",
|
||||
"* Algorytm drzew decyzyjnych spróbuje _zrozumieć_ „taktykę” Johna.\n",
|
||||
"* Wykorzystamy metodę „dziel i zwyciężaj”."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 66,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Podziel dane\n",
|
||||
"def split(features, data):\n",
|
||||
" values = {feature: list(set(row[feature]\n",
|
||||
" for row in data))\n",
|
||||
" for feature in features}\n",
|
||||
" if not features:\n",
|
||||
" return data\n",
|
||||
" return {val: split(features[1:],\n",
|
||||
" [row for row in data\n",
|
||||
" if row[features[0]] == val])\n",
|
||||
" for val in values[features[0]]}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 67,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 1:\tSunny\tHigh\tWeak\tNo\n",
|
||||
"Day 2:\tSunny\tHigh\tStrong\tNo\n",
|
||||
"Day 8:\tSunny\tHigh\tWeak\tNo\n",
|
||||
"Day 9:\tSunny\tNormal\tWeak\tYes\n",
|
||||
"Day 11:\tSunny\tNormal\tStrong\tYes\n",
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 4:\tRain\tHigh\tWeak\tYes\n",
|
||||
"Day 5:\tRain\tNormal\tWeak\tYes\n",
|
||||
"Day 6:\tRain\tNormal\tStrong\tNo\n",
|
||||
"Day 10:\tRain\tNormal\tWeak\tYes\n",
|
||||
"Day 14:\tRain\tHigh\tStrong\tNo\n",
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 3:\tOvercast\tHigh\tWeak\tYes\n",
|
||||
"Day 7:\tOvercast\tNormal\tStrong\tYes\n",
|
||||
"Day 12:\tOvercast\tHigh\tStrong\tYes\n",
|
||||
"Day 13:\tOvercast\tNormal\tWeak\tYes\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"split_data = split(['Outlook'], data)\n",
|
||||
"\n",
|
||||
"for outlook in values['Outlook']:\n",
|
||||
" print('\\n\\tOutlook\\tHumid\\tWind\\tPlay')\n",
|
||||
" for row in split_data[outlook]:\n",
|
||||
" print('Day {Day}:\\t{Outlook}\\t{Humidity}\\t{Wind}\\t{Play}'\n",
|
||||
" .format(**row))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Obserwacja: John lubi grać, gdy jest pochmurnie.\n",
|
||||
"\n",
|
||||
"W pozostałych przypadkach podzielmy dane ponownie:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 68,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 1:\tSunny\tHigh\tWeak\tNo\n",
|
||||
"Day 2:\tSunny\tHigh\tStrong\tNo\n",
|
||||
"Day 8:\tSunny\tHigh\tWeak\tNo\n",
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 9:\tSunny\tNormal\tWeak\tYes\n",
|
||||
"Day 11:\tSunny\tNormal\tStrong\tYes\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"split_data_sunny = split(['Outlook', 'Humidity'], data)\n",
|
||||
"\n",
|
||||
"for humidity in values['Humidity']:\n",
|
||||
" print('\\n\\tOutlook\\tHumid\\tWind\\tPlay')\n",
|
||||
" for row in split_data_sunny['Sunny'][humidity]:\n",
|
||||
" print('Day {Day}:\\t{Outlook}\\t{Humidity}\\t{Wind}\\t{Play}'\n",
|
||||
" .format(**row))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 69,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 6:\tRain\tNormal\tStrong\tNo\n",
|
||||
"Day 14:\tRain\tHigh\tStrong\tNo\n",
|
||||
"\n",
|
||||
"\tOutlook\tHumid\tWind\tPlay\n",
|
||||
"Day 4:\tRain\tHigh\tWeak\tYes\n",
|
||||
"Day 5:\tRain\tNormal\tWeak\tYes\n",
|
||||
"Day 10:\tRain\tNormal\tWeak\tYes\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"split_data_rain = split(['Outlook', 'Wind'], data)\n",
|
||||
"\n",
|
||||
"for wind in values['Wind']:\n",
|
||||
" print('\\n\\tOutlook\\tHumid\\tWind\\tPlay')\n",
|
||||
" for row in split_data_rain['Rain'][wind]:\n",
|
||||
" print('Day {Day}:\\t{Outlook}\\t{Humidity}\\t{Wind}\\t{Play}'\n",
|
||||
" .format(**row))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"* Outlook=\n",
|
||||
" * Overcast\n",
|
||||
" * → Playing\n",
|
||||
" * Sunny\n",
|
||||
" * Humidity=\n",
|
||||
" * High\n",
|
||||
" * → Not playing\n",
|
||||
" * Normal\n",
|
||||
" * → Playing\n",
|
||||
" * Rain\n",
|
||||
" * Wind=\n",
|
||||
" * Weak\n",
|
||||
" * → Playing\n",
|
||||
" * Strong\n",
|
||||
" * → Not playing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"* (9/5)\n",
|
||||
" * Outlook=Overcast (4/0)\n",
|
||||
" * YES\n",
|
||||
" * Outlook=Sunny (2/3)\n",
|
||||
" * Humidity=High (0/3)\n",
|
||||
" * NO\n",
|
||||
" * Humidity=Normal (2/0)\n",
|
||||
" * YES\n",
|
||||
" * Outlook=Rain (3/2)\n",
|
||||
" * Wind=Weak (3/0)\n",
|
||||
" * YES\n",
|
||||
" * Wind=Strong (0/2)\n",
|
||||
" * NO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Algorytm ID3"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Pseudokod algorytmu:\n",
|
||||
"\n",
|
||||
"* podziel(węzeł, zbiór przykładów):\n",
|
||||
" 1. A ← najlepszy atrybut do podziału zbioru przykładów\n",
|
||||
" 1. Dla każdej wartości atrybutu A, utwórz nowy węzeł potomny\n",
|
||||
" 1. Podziel zbiór przykładów na podzbiory według węzłów potomnych\n",
|
||||
" 1. Dla każdego węzła potomnego i podzbioru:\n",
|
||||
" * jeżeli podzbiór jest jednolity: zakończ\n",
|
||||
" * w przeciwnym przypadku: podziel(węzeł potomny, podzbiór)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Jak wybrać „najlepszy atrybut”?\n",
|
||||
"* powinien zawierać jednolity podzbiór\n",
|
||||
"* albo przynajmniej „w miarę jednolity”\n",
|
||||
"\n",
|
||||
"Skąd wziąć miarę „jednolitości” podzbioru?\n",
|
||||
"* miara powinna być symetryczna (4/0 vs. 0/4)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Entropia\n",
|
||||
"\n",
|
||||
"$$ H(S) = - p_{(+)} \\log p_{(+)} - p_{(-)} \\log p_{(-)} $$\n",
|
||||
"\n",
|
||||
"* $S$ – podzbiór przykładów\n",
|
||||
"* $p_{(+)}$, $p_{(-)}$ – procent pozytywnych/negatywnych przykładów w $S$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "fragment"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Entropię można traktować jako „liczbę bitów” potrzebną do sprawdzenia, czy losowo wybrany $x \\in S$ jest pozytywnym, czy negatywnym przykładem."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Przykład:\n",
|
||||
"\n",
|
||||
"* (3 TAK / 3 NIE):\n",
|
||||
"$$ H(S) = -\\frac{3}{6} \\log\\frac{3}{6} - \\frac{3}{6} \\log\\frac{3}{6} = 1 \\mbox{ bit} $$\n",
|
||||
"* (4 TAK / 0 NIE):\n",
|
||||
"$$ H(S) = -\\frac{4}{4} \\log\\frac{4}{4} - \\frac{0}{4} \\log\\frac{0}{4} = 0 \\mbox{ bitów} $$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### *Information gain*\n",
|
||||
"\n",
|
||||
"*Information gain* – różnica między entropią przed podziałem a entropią po podziale (podczas podziału entropia zmienia się):\n",
|
||||
"\n",
|
||||
"$$ \\mathop{\\rm Gain}(S,A) = H(S) - \\sum_{V \\in \\mathop{\\rm Values(A)}} \\frac{|S_V|}{|S|} H(S_V) $$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Przykład:\n",
|
||||
"\n",
|
||||
"$$ \\mathop{\\rm Gain}(S, Wind) = H(S) - \\frac{8}{14} H(S_{Wind={\\rm Weak}}) - \\frac{6}{14} H(S_{Wind={\\rm Strong}}) = \\\\\n",
|
||||
"= 0.94 - \\frac{8}{14} \\cdot 0.81 - \\frac{6}{14} \\cdot 1.0 = 0.049 $$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"* _Information gain_ jest całkiem sensowną heurystyką wskazującą, który atrybut jest najlepszy do dokonania podziału.\n",
|
||||
"* **Ale**: _information gain_ przeszacowuje użyteczność atrybutów, które mają dużo różnych wartości.\n",
|
||||
"* **Przykład**: gdybyśmy wybrali jako atrybut *datę*, otrzymalibyśmy bardzo duży *information gain*, ponieważ każdy podzbiór byłby jednolity, a nie byłoby to ani trochę użyteczne!"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### _Information gain ratio_\n",
|
||||
"\n",
|
||||
"$$ \\mathop{\\rm GainRatio}(S, A) = \\frac{ \\mathop{\\rm Gain}(S, A) }{ -\\sum_{V \\in \\mathop{\\rm Values}(A)} \\frac{|S_V|}{|S|} \\log\\frac{|S_V|}{|S|} } $$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "fragment"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"* _Information gain ratio_ może być lepszym wyborem heurystyki wskazującej najużyteczniejszy atrybut, jeżeli atrybuty mają wiele różnych wartości."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Drzewa decyzyjne a formuły logiczne\n",
|
||||
"\n",
|
||||
"Drzewo decyzyjne można pzekształcić na formułę logiczną w postaci normalnej (DNF):\n",
|
||||
"\n",
|
||||
"$$ Play={\\rm True} \\Leftrightarrow \\left( Outlook={\\rm Overcast} \\vee \\\\\n",
|
||||
"( Outlook={\\rm Rain} \\wedge Wind={\\rm Weak} ) \\vee \\\\\n",
|
||||
"( Outlook={\\rm Sunny} \\wedge Humidity={\\rm Normal} ) \\right) $$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Klasyfikacja wieloklasowa przy użyciu drzew decyzyjnych\n",
|
||||
"\n",
|
||||
"Algorytm przebiega analogicznie, zmienia się jedynie wzór na entropię:\n",
|
||||
"\n",
|
||||
"$$ H(S) = -\\sum_{y \\in Y} p_{(y)} \\log p_{(y)} $$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Skuteczność algorytmu ID3\n",
|
||||
"\n",
|
||||
"* Przyjmujemy, że wśród danych uczących nie ma duplikatów (tj. przykładów, które mają jednakowe cechy $x$, a mimo to należą do różnych klas $y$).\n",
|
||||
"* Wówczas algorytm drzew decyzyjnych zawsze znajdzie rozwiązanie, ponieważ w ostateczności będziemy mieli węzły 1-elementowe na liściach drzewa."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Nadmierne dopasowanie drzew decyzyjnych\n",
|
||||
"\n",
|
||||
"* Zauważmy, że w miarę postępowania algorytmu dokładność przewidywań drzewa (*accuracy*) liczona na zbiorze uczącym dąży do 100% (i w ostateczności osiąga 100%, nawet kosztem jednoelementowych liści).\n",
|
||||
"* Takie rozwiązanie niekoniecznie jest optymalne. Dokładność na zbiorze testowym może być dużo niższa, a to oznacza nadmierne dopasowanie."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"#### Jak zapobiec nadmiernemu dopasowaniu?\n",
|
||||
"\n",
|
||||
"Aby zapobiegać nadmiernemu dopasowaniu drzew decyzyjnych, należy je przycinać (*pruning*)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"Można tego dokonywać na kilka sposobów:\n",
|
||||
"* Można zatrzymywać procedurę podziału w pewnym momencie (np. kiedy podzbiory staja się zbyt małe).\n",
|
||||
"* Można najpierw wykonać algorytm ID3 w całości, a następnie przyciąć drzewo, np. kierując się wynikami uzyskanymi na zbiorze walidacyjnym.\n",
|
||||
"* Algorytm _sub-tree replacement pruning_ (algorytm zachłanny)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"#### Algorytm _Sub-tree replacement pruning_\n",
|
||||
"\n",
|
||||
"1. Dla każdego węzła:\n",
|
||||
" 1. Udaj, że usuwasz węzeł wraz z całym zaczepionym w nim poddrzewem.\n",
|
||||
" 1. Dokonaj ewaluacji na zbiorze walidacyjnym.\n",
|
||||
"1. Usuń węzeł, którego usunięcie daje największą poprawę wyniku.\n",
|
||||
"1. Powtarzaj, dopóki usuwanie węzłów poprawia wynik."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Zalety drzew decyzyjnych\n",
|
||||
"\n",
|
||||
"* Zasadę działania drzew decyzyjnych łatwo zrozumieć człowiekowi.\n",
|
||||
"* Atrybuty, które nie wpływają na wynik, mają _gain_ równy 0, zatem są od razu pomijane przez algorytm.\n",
|
||||
"* Po zbudowaniu, drzewo decyzyjne jest bardzo szybkim klasyfikatorem (złożoność $O(d)$, gdzie $d$ jest głębokościa drzewa)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Wady drzew decyzyjnych\n",
|
||||
"\n",
|
||||
"* ID3 jest algorytmem zachłannym – może nie wskazać najlepszego drzewa.\n",
|
||||
"* Nie da się otrzymać granic klas (*decision boundaries*), które nie są równoległe do osi wykresu."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Lasy losowe"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"#### Algorytm lasów losowych – idea\n",
|
||||
"\n",
|
||||
"* Algorytm lasów losowych jest rozwinięciem algorytmu ID3.\n",
|
||||
"* Jest to bardzo wydajny algorytm klasyfikacji.\n",
|
||||
"* Zamiast jednego, będziemy budować $k$ drzew."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"#### Algorytm lasów losowych – budowa lasu\n",
|
||||
"\n",
|
||||
"1. Weź losowy podzbiór $S_r$ zbioru uczącego.\n",
|
||||
"1. Zbuduj pełne (tj. bez przycinania) drzewo decyzyjne dla $S_r$, używając algorytmu ID3 z następującymi modyfikacjami:\n",
|
||||
" * podczas podziału używaj losowego $d$-elementowego podzbioru atrybutów,\n",
|
||||
" * obliczaj _gain_ względem $S_r$.\n",
|
||||
"1. Powyższą procedurę powtórz $k$-krotnie, otrzymując $k$ drzew ($T_1, T_2, \\ldots, T_k$)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "subslide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"#### Algorytm lasów losowych – predykcja\n",
|
||||
"\n",
|
||||
"1. Sklasyfikuj $x$ według każdego z drzew $T_1, T_2, \\ldots, T_k$ z osobna.\n",
|
||||
"1. Użyj głosowania większościowego: przypisz klasę przewidzianą przez najwięcej drzew."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"## 10.2. Maszyny wektorów nośnych"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"celltoolbar": "Slideshow",
|
||||
"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.10.6"
|
||||
},
|
||||
"livereveal": {
|
||||
"start_slideshow_at": "selected",
|
||||
"theme": "white"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
100
wyk/bayes_nasty.tsv
Normal file
100
wyk/bayes_nasty.tsv
Normal file
@ -0,0 +1,100 @@
|
||||
0 0.7544830909519196 -0.7557810097698512
|
||||
0 -0.401040192413354 0.05087719368515575
|
||||
0 -0.14557860894357444 -0.9167657103778997
|
||||
0 0.15606723792840116 0.7049866105111644
|
||||
0 0.595321005153232 -0.3993704503800295
|
||||
0 -0.21608773803320203 -0.9473358133826528
|
||||
1 -0.9991678089071083 -0.8203462932941652
|
||||
0 -0.29270128006691776 0.8999761729296656
|
||||
0 -0.3744408488491382 0.5298017577688894
|
||||
0 -0.13262908466039347 0.016485142896286442
|
||||
1 -0.45382240999178936 -0.6292411536948919
|
||||
1 0.8466491727357144 0.7677619536810258
|
||||
0 0.5640604742334225 -0.6415301955014154
|
||||
1 0.7652661495157325 0.9042394673218532
|
||||
0 0.027488607545269383 -0.8561480245619784
|
||||
0 0.8937874814271918 -0.568262764805403
|
||||
1 0.05865567400417637 0.1271824506485506
|
||||
0 0.1350578652393759 -0.8468795247716823
|
||||
0 -0.03351382194744046 0.7225677368658248
|
||||
0 0.031698854294282874 -0.1745522030261808
|
||||
0 0.9764007293531329 0.0407596854507819
|
||||
1 0.8575290920021019 0.5995196615047915
|
||||
1 -0.5942919380814724 -0.9173657127389143
|
||||
0 0.019297633607670894 0.7171922933333184
|
||||
0 0.23496958271638224 -0.4505947779446391
|
||||
0 -0.15627176851413638 -0.6255991840738957
|
||||
0 -0.5436468155122751 0.7321778365594638
|
||||
0 -0.0016772778866704918 0.9953499312779903
|
||||
0 -0.49022669174509304 0.7643365578090109
|
||||
0 0.9274390975500406 -0.16941260003761904
|
||||
0 0.517483672350449 -0.9259720728025793
|
||||
0 0.4993683788149732 -0.8086741166111076
|
||||
1 -0.8954705171891042 -0.8352780222016363
|
||||
1 -0.35723728886723927 -0.6472670626320902
|
||||
0 -0.45030919789416135 -0.014680291690282399
|
||||
1 -0.3149222964035554 -0.2363491678998142
|
||||
0 -0.21632030129179247 0.9937719759687991
|
||||
0 -0.3479296178713067 0.7754592480508431
|
||||
1 -0.39993029073188713 -0.4021302940990339
|
||||
0 0.22575455897529628 0.914503661895917
|
||||
0 0.7221094132486976 -0.07187829685579739
|
||||
1 0.8767936705571608 0.9516806200255943
|
||||
1 0.2252335689492453 0.7031994893573623
|
||||
0 0.742017840295591 -0.19165119600215896
|
||||
1 -0.18782565699518372 -0.1408083939313467
|
||||
0 -0.8222264182672563 0.17050362212981707
|
||||
0 -0.1701252998869296 0.3450076829291753
|
||||
0 -0.7342893613133503 0.40778605218980135
|
||||
0 0.042695758461734235 -0.1484132507659468
|
||||
1 0.3863429870565578 0.1571106834539837
|
||||
0 -0.015388135282204507 -0.3364073902228679
|
||||
0 -0.8487467820993619 0.1089427832313854
|
||||
1 -0.6329015029648661 -0.7736052613400564
|
||||
1 -0.858908407978868 -0.7378977770454969
|
||||
1 0.6990672273176652 0.9222225234574595
|
||||
0 -0.256431985135285 0.5758502205935434
|
||||
0 -0.17330338780141252 0.30560812863161035
|
||||
1 0.3523362003038917 0.4815180921326969
|
||||
0 -0.10269592106863401 -0.7847042700361848
|
||||
1 0.2559692323662084 0.048849842553034595
|
||||
0 -0.8044820701681799 0.504663314011591
|
||||
0 0.07877786671385811 0.9947392835524949
|
||||
0 -0.8828875946641657 0.39461445063748224
|
||||
0 -0.5143275957869704 0.09502394806995929
|
||||
1 -0.5268239422759475 -0.11354182377636213
|
||||
0 0.2946171361928087 -0.3186572090869646
|
||||
0 0.7198334843462129 -0.6141975273104947
|
||||
1 0.48428859765324495 0.8946857548947542
|
||||
0 0.4621095070919994 -0.8924571872043978
|
||||
0 0.4528371532815365 -0.5807667653397828
|
||||
0 -0.09742500656072872 0.4945581379995849
|
||||
1 0.777026015997778 0.3617742992147488
|
||||
0 0.7791679792171657 -0.9220886356412603
|
||||
0 -0.38876810387659977 0.6679551419391372
|
||||
0 -0.08472697987697475 0.275319596881203
|
||||
0 0.7822926875136844 0.17122659901899606
|
||||
1 -0.2657068543666481 -0.06008893404720328
|
||||
0 -0.6907681316607532 -0.14224587305734304
|
||||
0 0.8066439746610798 -0.4207539780920342
|
||||
1 0.8552075324891362 0.08669568026253027
|
||||
0 0.5491129985925067 -0.6071624569600662
|
||||
0 -0.9629615870383108 0.5418486267009242
|
||||
1 0.718585449653875 0.2289040416265995
|
||||
0 0.7097096024915686 0.15142630204453789
|
||||
0 0.001183772922738191 -0.21331149786657155
|
||||
0 -0.740163182486073 0.7856137973272908
|
||||
0 -0.4102935448809477 0.32577864184797
|
||||
0 0.2838108153224279 0.6955863026175773
|
||||
1 0.5260171668336517 0.31947619877005207
|
||||
1 0.39165592038557273 0.5903048315964989
|
||||
1 -0.5287850882839857 -0.709598294851151
|
||||
0 0.8801802111481849 0.1257963822980257
|
||||
0 0.7860399993656908 0.2917387997774099
|
||||
0 -0.31357941345778184 0.8173465016744779
|
||||
0 -0.24706729772892544 -0.5017567368968896
|
||||
0 -0.5077834677535535 0.734692375238988
|
||||
1 0.9180554343925105 0.7402607565839483
|
||||
0 0.7347556198277827 -0.8922440369193774
|
||||
0 0.05178553367177474 0.024867950728887367
|
||||
0 0.6123243631772981 -0.9310030202911994
|
|
20
wyk/classification.tsv
Normal file
20
wyk/classification.tsv
Normal file
@ -0,0 +1,20 @@
|
||||
0 -0.8014509894297421 -0.5994635333915026
|
||||
0 -0.7706966545879539 0.6368117894533625
|
||||
0 -0.27709533263047414 0.8256752096021349
|
||||
0 0.9930555307918127 0.36630467592076577
|
||||
1 -0.16225248935963799 0.4956311492381327
|
||||
0 0.934855703919385 0.8549023876664064
|
||||
0 -0.5145933151394193 -0.804772931556422
|
||||
1 0.10024139618609662 0.018730576213300765
|
||||
0 0.9713755569949907 0.16659909394686068
|
||||
1 -0.07322231752678521 -0.18763566969904533
|
||||
0 -0.5702785062714137 0.3522449667057965
|
||||
1 0.1848842019744028 0.4173729058647151
|
||||
0 0.24479522096847361 -0.7089634989586504
|
||||
0 0.6236644548417194 -0.1156611626471038
|
||||
0 -0.10592913601169007 -0.9980825893807068
|
||||
0 -0.23607206404847436 -0.7428335400803034
|
||||
0 -0.11951845657345062 -0.8219825834866892
|
||||
0 0.04590771234351232 -0.7564447785519108
|
||||
1 0.7967711966832445 -0.4352501064041614
|
||||
1 0.8053812216632301 0.1203107620499666
|
|
Loading…
Reference in New Issue
Block a user