Hlavní navigace

Neuronové sítě v knihovně scikit-learn (2.část)

Dnes
Doba čtení: 52 minut

Sdílet

 Autor: Depositphotos
Budeme se opět zabývat neuronovými sítěmi. Ukážeme si změnu topologie neuronové sítě provádějící regresi, ale například i použití takzvané matice záměn (confusion matrix). Nakonec neuronovou síť naučíme malou násobilku.

Obsah

1. Neuronové sítě v knihovně scikit-learn (2.část)

2. Krátké zopakování z minula: neuronová síť provádějící regresi natrénovaná na datové sadě California Housings

3. Jakou strukturu neuronové sítě zvolit?

4. Změna počtu neuronů v jediné skryté vrstvě

5. Změna počtu neuronů ve větším množství skrytých vrstev

6. Vliv postupného zvyšování počtu skrytých vrstev na kvalitu odpovědí neuronové sítě

7. Zjištění kvality modelu s využitím matice záměn (confusion matrix)

8. Vizualizace matice záměn s absolutními i relativními odchylkami pro model lineární regrese

9. Získané a vizualizované výsledky

10. Matice záměn pro odlišný model: hledání K nejbližších sousedů

11. Získané a vizualizované výsledky

12. Matice záměn pro klasifikátor implementovaný pomocí neuronové sítě

13. Získané a vizualizované výsledky

14. Lze regresní neuronovou síť naučit malou násobilku?

15. Výsledek: neuronová síť na úrovni prváka

16. Vizualizace rozdílů předpovědí neuronové sítě od korektních výsledků

17. Numerické i grafické výsledky korektnosti výpočtů tabulky malé násobilky

18. Dokáže takto natrénovaná neuronová síť generalizovat?

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Neuronové sítě v knihovně scikit-learn (2.část)

Na předchozí článek o knihovně scikit-learn dnes přímo navážeme. Opět se totiž budeme zabývat problematikou konstrukce, učení a validace neuronových sítí. Nejprve si ukážeme, jakým způsobem je možné měnit resp. přesněji řečeno definovat topologii neuronové sítě provádějící regresi (tedy nikoli klasifikaci), ovšem v dalším pokračování nezapomeneme ani na problematiku volby takzvané aktivační funkce, která může ovlivnit globální chování celé neuronové sítě.

Obrázek 1: Idealizovaný model neuronu použitý v klasických neuronových sítích.

Pro zajímavost se pokusíme natrénovat si neuronovou síť pro výpočet malé i velké násobilky (tam lze dobře pochopit různá úskalí neuronových sítí, i když zrovna tento úkol se pro neuronové sítě příliš nehodí, což bude ostatně patrné i z výsledků). Ukážeme si například i použití takzvané matice záměn (confusion matrix), kterou lze využít proto, abychom dobře porozuměli, jakým způsobem se „pletou“ či naopak „trefují“ modely provádějící klasifikaci.

Obrázek 2: Idealizovaný model neuronu s biasem (což je vlastně konstantní vstup 1, který je váhován podobně, jako i ostatní vstupy).

2. Krátké zopakování z minula: neuronová síť provádějící regresi natrénovaná na datové sadě California Housings

Nejprve si připomeňme, jakým způsobem můžeme s využitím knihovny scikit-learn realizovat jednoduchou neuronovou sít provádějící regresi (tedy odhad numerické hodnoty z určitého rozsahu). Klasické neuronové sítě mají neurony uspořádány do vrstev, přičemž první vrstva se nazývá vstupní, poslední vrstva výstupní a mezivrstvy se nazývají skryté:

Obrázek 3: Uspořádání neuronů do vrstev ve feed-forward síti.

Naše konkrétní neuronová síť bude mít ve vstupní vrstvě osm neuronů, protože ve vstupní datové sadě je osm atributů. Výstupní vrstva bude obsahovat jen jeden neuron, neboť se jedná o výpočet jediné konkrétní hodnoty (ceny bytu resp. bloku). A jediná vnitřní vrstva bude obsahovat sto neuronů, protože se jedná o výchozí hodnotu dosazenou přímo knihovnou scikit-learn:

# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# ceny bloku
targets = housings["target"]
 
# X je matice, y je vektor
X = data
y = targets
 
# rozdeleni dat na treninkovou a testovaci mnozinu
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
 
# konstrukce modelu
nn = MLPRegressor(max_iter=5000)
 
# trénink modelu
nn.fit(X_train, y_train)
 
# predikce modelu
y_pred = nn.predict(X_test)
 
# chyba predikce
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
 
# 1 = nejlepší predikce modelu
print("Coefficient of determination: %.2f" % r2_score(y_test, y_pred))
 
print(f"Features: {nn.n_features_in_}")
print(f"Layers:   {nn.n_layers_}")
print(f"Outputs:  {nn.n_outputs_}")
print("Weights:")
 
for layer, weights in enumerate(nn.coefs_):
    print("\t", layer, weights.shape)
 
print("Biases:")
 
for layer, biases in enumerate(nn.intercepts_):
    print("\t", layer, biases.shape)

Po spuštění výše uvedeného skriptu se nejdříve zobrazí výsledek validace modelu, ovšem nutno dodat, že v tomto případě s nepříliš lichotivými výsledky (R2 skóre dokonce kleslo těsně pod nulu):

Mean squared error: 1.34
Coefficient of determination: -0.01

Posléze skript zobrazí informace o neuronové síti. Ze zpráv, které jsou vytisknuty, plyne, že ve vstupní vrstvě je osm neuronů, což odpovídá počtu atributů, na které byla síť natrénována. Výstupní vrstva má jeden neuron, což je opět pochopitelné, protože výstupem má být jediné reálné číslo. A celkový počet vrstev je roven třem – tedy kromě vstupní vrstvy a vrstvy výstupní máme jedinou skrytou vrstvu:

Features: 8
Layers:   3
Outputs:  1

Posledními údaji, které skript uvedený v této kapitole zobrazí, jsou tvary (shape) polí s váhami neuronů a taktéž pole s hodnotami bias. Tvary těchto polí plně odpovídají očekávané topologii neuronové sítě (tedy vazby 8:100:1 atd.):

Weights:
         0 (8, 100)
         1 (100, 1)
Biases:
         0 (100,)
         1 (1,)
Poznámka: z těchto údajů nepřímo plyne, že vnitřní (skrytá) vrstva obsahuje sto neuronů.

3. Jakou strukturu neuronové sítě zvolit?

Při konstrukci neuronové sítě musíme nějakým způsobem zjistit nebo alespoň odhadnout, kolik skrytých vrstev by se mělo použít a kolik neuronů by v každé z těchto vrstev mělo být. Taktéž je nutné vybrat vhodnou aktivační funkci, způsob realizace tréninkového algoritmu atd. Jedná se o velké množství proměnných hodnot, takže výběr může probíhat v několika kolech, které typicky obsahují křížovou validaci modelu.

Existuje několik více či méně kvalitních heuristik, které nám povídají, jakou zvolit topologii neuronové sítě. Vybírám ty nejjednodušší a nejznámější heuristiky:

  1. Počet neuronů ve skryté vrstvě by měl být zhruba 2/3 velikosti vstupní vrstvy (někdo udává rozsah 70%-90%).
  2. Počet neuronů ve skryté vrstvě by měl být menší, než dvojnásobek velikosti (počtu neuronů) ve vstupní vrstvě.
  3. Počet neuronů ve skryté vrstvě by měl ležet na rozsahu počtu neuronů vstupní a výstupní vrstvy (což platí pro sítě provádějící klasifikaci).
  4. Počet neuronů ve skrytých vrstvách by měl postupně klesat (někdy se uvádí exponenciální pokles, ovšem zde skutečně záleží na množství vstupů).
  5. Postupně přidávejte další skryté vrstvy až do chvíle, kdy se začne snižovat přesnost nebo R2 skóre (většinou najdeme skokovou změnu po přidání další vrstvy).
Poznámka: tyto heuristiky jsou většinou aplikovány v případě, že neuronové sítě mají velký počet vstupů, například když je vstupem rastrový obrázek atd. V našem konkrétním případě máme pouze osm vstupů, takže počty neuronů ve skrytých vrstvách vychází velmi malé.

4. Změna počtu neuronů v jediné skryté vrstvě

Pokusme se nyní zjistit, jakým způsobem se změní kvalita neuronové sítě (tedy přesnosti předpovědí při provádění regrese) v případě, že budeme měnit počet neuronů ve skryté vrstvě. Volba počtu neuronů je snadná, protože při konstrukci neuronové sítě můžeme použít parametr hidden_layer_sizes, kterému se předá n-tice obsahující počty neuronů ve skryté vrstvě (jednice) či ve více vrstvách:

nn = MLPRegressor(max_iter=5000, hidden_layer_sizes = (neurons, ))

Celý skript, který provádí konstrukci neuronové sítě, její natrénování a otestování, vypadá následovně:

import matplotlib.pyplot as plt
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# ceny bloku
targets = housings["target"]
 
# X je matice, y je vektor
X = data
y = targets
 
r = range(1, 12)
avg_scores = []
 
# hledani optimalniho poctu neuronu ve vrstvach
for i in r:
    # konstrukce modelu
    neurons = 2**i
    nn = MLPRegressor(max_iter=5000, hidden_layer_sizes = (neurons, ))
 
    scores = cross_val_score(nn, X, y, cv=10, scoring='r2')
 
    # vypsani prumerneho skore do tabulky
    avg_score = scores.mean()
    print(neurons, avg_score)
 
    avg_scores.append(avg_score)
 
plt.plot(r, avg_scores)
plt.xlabel("Změna počtu neuronů v jedné vrstvě")
plt.ylabel("R2")
 
# ulozeni grafu do souboru
plt.savefig("144.png")
 
# vykresleni grafu na obrazovku
#plt.show()

Výsledky výpočtu R2 skóre pro postupně se měnící počty neuronů vypadají takto:

2 -0.1454302734588354
4 -0.03707952396388188
8 0.024029461721653787
16 0.15975633333410563
32 0.0019421990876153927
64 0.2831746308829118
128 0.30220876727407814
256 -0.08924552002434508
512 -0.0007001958806893916
1024 -5.531109632506313
2048 -20.041735587898025

Obrázek 4: Závislost kvality odpovědí neuronové sítě s jednou skrytou vrstvou na počtu neuronů v této vrstvě.

Poznámka: můžeme zde skutečně vidět razantní pokles kvality neuronové sítě u velkého počtu neuronů. Je to způsobeno buď nedoučením neuronové sítě (je totiž příliš velká pro malý počet trénovacích dat) popř. tím, že pro malé změny očekávaných výstupů již trénovací algoritmus (backtracing) nedokáže měnit váhy jednotlivých neuronů (což je efekt nazývaný vanishing gradient).

5. Změna počtu neuronů ve větším množství skrytých vrstev

Naprosto stejným způsobem se můžeme pokusit o zjištění, jaký vliv má počet neuronů umístěných ve větším množství skrytých vrstev na kvalitu odhadů neuronové sítě. Pokusíme se zjistit tyto vlastnosti pro neuronové sítě se třemi a pěti skrytými vrstvami. Skript pro neuronovou síť se třemi vrstvami:

import matplotlib.pyplot as plt
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# ceny bloku
targets = housings["target"]
 
# X je matice, y je vektor
X = data
y = targets
 
r = range(1, 12)
avg_scores = []
 
# hledani optimalniho poctu neuronu ve vrstvach
for i in r:
    # konstrukce modelu
    neurons = 2**i
    nn = MLPRegressor(max_iter=5000, hidden_layer_sizes = (neurons, neurons, neurons))
 
    scores = cross_val_score(nn, X, y, cv=10, scoring='r2')
 
    # vypsani prumerneho skore do tabulky
    avg_score = scores.mean()
    print(neurons, avg_score)
 
    avg_scores.append(avg_score)
 
plt.plot(r, avg_scores)
plt.xlabel("Změna počtu neuronů ve třech vrstvách")
plt.ylabel("R2")
 
# ulozeni grafu do souboru
plt.savefig("145.png")
 
# vykresleni grafu na obrazovku
#plt.show()

Výsledky již nyní nejsou tak jednoznačné, jako tomu bylo v předchozím příkladu, protože i neuronová síť se zbytečně velkým počtem neuronů dokázala tuto nevýhodu do určité míry kompenzovat:

2 -0.283005105231359
4 0.148825137624293
8 0.3334395444819797
16 0.14779810169991886
32 -0.14617386521960413
64 0.17143912954224527
128 -0.35915114561290196
256 0.028327261438945373
512 -0.5219569442908789
1024 0.22234451593419272
2048 0.32266508344685396

Obrázek 5: Závislost kvality odpovědí neuronové sítě se třemi skrytými vrstvami na počtu neuronů v této vrstvě.

Realizace téhož příkladu, nyní ovšem pro pět skrytých vrstev vypadá následovně:

import matplotlib.pyplot as plt
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# ceny bloku
targets = housings["target"]
 
# X je matice, y je vektor
X = data
y = targets
 
r = range(1, 12)
avg_scores = []
 
# hledani optimalniho poctu neuronu ve vrstvach
for i in r:
    # konstrukce modelu
    neurons = 2**i
    nn = MLPRegressor(max_iter=5000, hidden_layer_sizes = (neurons, neurons, neurons, neurons, neurons))
 
    scores = cross_val_score(nn, X, y, cv=10, scoring='r2', n_jobs=-1)
 
    # vypsani prumerneho skore do tabulky
    avg_score = scores.mean()
    print(neurons, avg_score)
 
    avg_scores.append(avg_score)
 
plt.plot(r, avg_scores)
plt.xlabel("Změna počtu neuronů v pěti vrstvách")
plt.ylabel("R2")
 
# ulozeni grafu do souboru
plt.savefig("146.png")
 
# vykresleni grafu na obrazovku
#plt.show()

Numerické výsledky v tabulkové podobě:

2 -0.0754384824557155
4 -0.14798990918251986
8 0.3995421626439365
16 0.010342881370922475
32 0.19336159679802659
64 0.17877679646955416
128 0.2820772221907199
256 0.5288142058348293
512 0.44223558072990465
1024 0.44861141341888383
2048 0.40412403628968663

Obrázek 6: Závislost kvality odpovědí neuronové sítě s pěti skrytými vrstvami na počtu neuronů v této vrstvě.

6. Vliv postupného zvyšování počtu skrytých vrstev na kvalitu odpovědí neuronové sítě

Z výsledků, které jsme získali z předchozí trojice skriptů, by se mohlo zdát, že spíše než zvyšování počtu neuronů ve skrytých vrstvách může být výhodnější spíše zvýšit počet těchto vrstev s menším počtem neuronů. Zkusme si tuto domněnku ověřit, a to tak, že ponecháme počet neuronů v každé skryté vrstvě konstantní, ale budeme zvyšovat počet těchto vrstev. Využijeme přitom možnosti „opakování“ prvků v n-tici:

NEURONS = 5
 
layer_sizes = (NEURONS, ) * layers
nn = MLPRegressor(max_iter=5000, hidden_layer_sizes = layer_sizes)

Celý skript, který postupně zvyšuje počet vrstev a následně ověřuje kvalitu neuronové sítě, vypadá následovně:

import matplotlib.pyplot as plt
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# ceny bloku
targets = housings["target"]
 
# X je matice, y je vektor
X = data
y = targets
 
NEURONS = 5
r = range(1, 40)
 
avg_scores = []
 
# hledani optimalniho poctu neuronu ve vrstvach
for layers in r:
    # konstrukce modelu
    layer_sizes = (NEURONS, ) * layers
    nn = MLPRegressor(max_iter=5000, hidden_layer_sizes = layer_sizes)
 
    # vypocet skore
    scores = cross_val_score(nn, X, y, cv=10, scoring='r2', n_jobs=-1)
 
    # vypsani prumerneho skore do tabulky
    avg_score = scores.mean()
    print(layers, avg_score)
 
    avg_scores.append(avg_score)
 
plt.plot(r, avg_scores)
plt.xlabel("Změna počtu vrstev")
plt.ylabel("R2")
 
# ulozeni grafu do souboru
plt.savefig("147.png")
 
# vykresleni grafu na obrazovku
plt.show()

Opět si nejprve uveďme výsledky v numerické podobě:

1 0.3756102466117746
2 0.33435201837938544
3 0.12054109495792083
4 0.09916830519723958
5 0.3239525018951458
6 0.06484265048651823
7 -0.10421240952695066
8 0.27187249385037804
9 0.2882272162105404
10 0.14207548441647116
11 0.2264986054565991
12 0.0731174214139199
13 0.13308221750444812
14 0.19895244674967708
15 0.1294763780958599
16 -0.12671951662229197
17 0.17829603759203674
18 0.12295044855822954
19 0.3231971403204573
20 0.08460788802486123
21 0.1255234820631603
22 0.22386452833322137
23 0.08215259556813452
24 -0.09532343419407868
25 -0.10410875091569269
26 -0.14048312380932332
27 -0.2770565595807387
28 -0.20586069878082425
29 -0.0911768500198286
30 -0.2797797072289029
31 -0.2698970179654826
32 -0.27684226485857805
33 -0.13352979202774717
34 -0.27688492300614664
35 -0.198615684982469
36 -0.18700389633765757
37 -0.264543446558973
38 -0.2696700809142521
39 -0.21418061259668536

Obrázek 7: Závislost kvality odpovědí neuronové sítě na počtu skrytých vrstev.

Poznámka: ani tento předpoklad tedy není zcela pravdivý. Vždy dříve či později narazíme na limit způsobený nedoučením sítě nebo efektem vanishing gradientu, o němž jsme se již zmiňovali.

7. Zjištění kvality modelu s využitím matice záměn (confusion matrix)

Při zjišťování kvality modelů, které provádí klasifikaci, se s úspěchem používá takzvaná matice záměn neboli confusion matrix. Jedná se o matici, která ve sloupcích obsahuje očekávané hodnoty a v řádcích pak předpovědi/odpovědi modelu. Pokud model odpoví ve všech případech správně, bude matice obsahovat nenulové hodnoty pouze na hlavní diagonále a tyto hodnoty budou znamenat „očekávalo se X odpovědí A a model takto odpověděl skutečně X-krát“. Ovšem ve chvíli, kdy se model splete, vypíše se tato hodnota mimo hlavní diagonálu; tj. hodnoty mimo hlavní diagonálu znamenají chyby a navíc můžeme zjistit, které odpovědi způsobují modelu největší problémy (tj. například které druhy květin z datové sady Iris zaměňuje a které naopak nalezne vždy bez problémů).

Podívejme se na příklad modelu, který vždy odpoví korektně:

  | A    B   C
--+------------
A | 10   0   0
B |  0  20   0
C |  0   0  30

Model pro 10 očekávaných odpovědí A skutečně desetkrát odpověděl „A“ atd. Celkem se provedlo 10+20+30 testů.

Naopak může model nesprávně rozlišovat mezi odpověďmi A a B. Potom může matice vypadat například takto:

  | A    B   C
--+------------
A |  7   3   0
B |  0  20   0
C |  0   0  30

Nebo takto:

  | A    B   C
--+------------
A | 10   0   0
B | 10  10   0
C |  0   0  30

Zkoumáním obsahu matice záměn můžeme zjistit nejenom citlivost modelu, ale i specificitu modelu (což je mnohdy důležitější atribut – ještě se k němu vrátíme).

Matice záměn může obsahovat i relativní hodnoty, které jsou nezávislé na počtu měření. Maximální hodnota prvku v takové matici je rovna 1.0 a minimální pochopitelně 0.0.

8. Vizualizace matice záměn s absolutními i relativními odchylkami pro model lineární regrese

Podívejme se nyní na způsob výpočtu a vizualizace matice záměn (confusion matrix). Nejprve zkonstruujeme nějaký model, natrénujeme ho běžným způsobem a taktéž ho necháme odhadnout výsledky pro testovací (nikoli trénovací!) data. Tyto kroky již velmi dobře známe:

# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = LogisticRegression(max_iter=1000)
 
# trening modelu (se vsemi dostupnymi daty)
classifier.fit(trainX, trainY)
 
y_pred = classifier.predict(testX)

Následně si na základě testovacích dat necháme vypočítat matici záměn. Ta může obsahovat buď absolutní hodnoty (tedy jednotlivé testy a jejich výsledky odhadnuté modelem) nebo hodnoty relativní. Matici záměn s absolutními hodnotami získáme takto:

# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)

Naopak matici s relativními hodnotami (nezávislými na počtu testů) si necháme vypočítat tímto způsobem:

# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)

Úplný zdrojový kód skriptu, který tyto výpočty provádí a obě matice následně zobrazí, vypadá následovně:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import ConfusionMatrixDisplay
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.7)
 
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = LogisticRegression(max_iter=1000)
 
# trening modelu (se vsemi dostupnymi daty)
classifier.fit(trainX, trainY)
 
y_pred = classifier.predict(testX)
 
print(classification_report(testY, y_pred))
 
class_names = iris.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("148_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("148_2.png")
 
# vizualizace matice
plt.show()

9. Získané a vizualizované výsledky

Po spuštění skriptu z předchozí kapitoly se nejdříve zobrazí vypočtené informace o validaci modelu, které byly získané zavoláním classification_report (tyto informace nás však prozatím nebudou zajímat, vyžadují totiž hlubší porozumění jednotlivým veličinám):

              precision    recall  f1-score   support
 
           0       1.00      1.00      1.00        39
           1       1.00      0.94      0.97        35
           2       0.94      1.00      0.97        31
 
    accuracy                           0.98       105
   macro avg       0.98      0.98      0.98       105
weighted avg       0.98      0.98      0.98       105

Důležitější je samotná matice záměn, která vypadá následovně:

[[39  0  0]
 [ 0 33  2]
 [ 0  0 31]]

Z matice je patrné, že se celkem otestovalo 39+33+31+2=105 vstupů, což odpovídá nastavení test_size=0.7. Přitom první druh květiny byl rozeznán vždy, ale u dalších dvou druhů se model ve dvou případech spletl. Ideálně by totiž tato matice měla vypadat takto:

[[39  0  0]
 [ 0 33  0]
 [ 0  0 33]]

Aby byly výsledky nezávislé na počtu otestovaných záznamů, je lepší použít relativní vyjádření, které dopadne následovně:

[[1.         0.         0.        ]
 [0.         0.94285714 0.05714286]
 [0.         0.         1.        ]]

Opět platí, že v ideálním případě by se mělo jednat o jednotkovou matici.

Vizuální výsledky ve formě diagramu jsou ještě názornější, neboť jsou přidány i popisky jednotlivých os:

Obrázek 8: Matice záměn s absolutními odchylkami.

Obrázek 9: Matice záměn s relativními odchylkami.

10. Matice záměn pro odlišný model: hledání K nejbližších sousedů

Samozřejmě nám vůbec nic nebrání v tom, abychom se pokusili matici záměn vypočítat i pro odlišné modely. Společně s datovou sadou Iris jsme již několikrát použili model KNeighborsClassifier, který provádí klasifikaci na základě nalezení K sousedů k testovanému bodu (atributy leží v n-rozměrném prostoru a od testovaného bodu postupně rozšiřujeme oblast a hledáme sousedy). Tento model by mohl být přesnější, než model lineární regrese, takže si to ověřme:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn.metrics import ConfusionMatrixDisplay
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.5)
 
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = KNeighborsClassifier(n_neighbors=5)
 
# trening modelu (se vsemi dostupnymi daty)
classifier.fit(trainX, trainY)
 
y_pred = classifier.predict(testX)
 
print(classification_report(testY, y_pred))
 
class_names = iris.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("149_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("149_2.png")
 
# vizualizace matice
plt.show()

11. Získané a vizualizované výsledky

Opět se podívejme na výsledky, které jsme získali po spuštění skriptu z předchozí kapitoly. Podle očekávání budou výsledky nepatrně odlišné, protože je jiný i model, který testujeme:

              precision    recall  f1-score   support
 
           0       1.00      1.00      1.00        18
           1       0.89      0.94      0.91        33
           2       0.91      0.83      0.87        24
 
    accuracy                           0.92        75
   macro avg       0.93      0.92      0.93        75
weighted avg       0.92      0.92      0.92        75

Z maticí záměn je patrné, že se opět model nemohl vždy správně rozhodnout mezi druhým a třetím druhem květin, zatímco druh první rozpoznal vždy na 100%:

[[18  0  0]
 [ 0 31  2]
 [ 0  4 20]]
 
[[1.         0.         0.        ]
 [0.         0.93939394 0.06060606]
 [0.         0.16666667 0.83333333]]

A jak správně tušíte, je vizualizace matice záměn formou diagramu ještě názornější:

Obrázek 10: Matice záměn s absolutními odchylkami.

Obrázek 11: Matice záměn s relativními odchylkami.

12. Matice záměn pro klasifikátor implementovaný pomocí neuronové sítě

Napotřetí si matici záměn necháme zobrazit pro klasifikátor, který je implementovaný s využitím neuronové sítě. Jedná se tedy o model typu MLPClassifier, s nímž jsme se podrobně seznámili v předchozím článku:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import ConfusionMatrixDisplay
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPClassifier
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
# rozdělení dat
trainX, testX, trainY, testY = train_test_split(X, y, test_size = 0.5)
 
# konstrukce klasifikatoru
# (s hyperparametrem)
classifier = MLPClassifier(max_iter=5000)
 
# trening modelu (se vsemi dostupnymi daty)
classifier.fit(trainX, trainY)
 
y_pred = classifier.predict(testX)
 
print(classification_report(testY, y_pred))
 
class_names = iris.target_names
 
# absolutni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("150_1.png")
 
# vizualizace matice
plt.show()
 
# relativni hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    display_labels=class_names,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazeni matice
print(disp.confusion_matrix)
 
# ulozeni vysledku
plt.savefig("150_2.png")
 
# vizualizace matice
plt.show()

13. Získané a vizualizované výsledky

A opět se podívejme na výsledky získané skriptem uvedeným v předchozí kapitole:

              precision    recall  f1-score   support
 
           0       1.00      1.00      1.00        25
           1       0.96      0.96      0.96        23
           2       0.96      0.96      0.96        27
 
    accuracy                           0.97        75
   macro avg       0.97      0.97      0.97        75
weighted avg       0.97      0.97      0.97        75

Z matice záměn je patrné, že i neuronová síť má, podobně jako ostatní dva modely, problém rozlišit druhé dva druhy květin, zatímco první druh odliší ve všech případech (což mnohé napovídá o volbě atributů):

[25  0  0]
 [ 0 22  1]
 [ 0  1 26]]
 
[[1.         0.         0.        ]
 [0.         0.95652174 0.04347826]
 [0.         0.03703704 0.96296296]]

A takto vypadá vizualizovaný výsledek obou matic záměn (s absolutními i relativními odchylkami):

Obrázek 12: Matice záměn s absolutními odchylkami.

Obrázek 13: Matice záměn s relativními odchylkami.

14. Lze regresní neuronovou síť naučit malou násobilku?

Nyní již známe způsob konstrukce a tréninku neuronové sítě provádějící regresi. To znamená, že dokážeme zkonstruovat model, který na základě několika numerických vstupů vypočte jeden numerický výstup. Je tedy možné například vytvořit neuronovou síť, která dokáže vypočítat malou násobilku? Nejedná se o typický případ využití neuronových sítí, ale o něco podobného se samozřejmě můžeme pokusit. Tato sít bude mít dva vstupy (tedy dva neurony ve vstupní vrstvě) a jeden výstup (jediný neuron ve výstupní vrstvě). A zvolme například, že síť bude obsahovat dvě skryté vrstvy, každou se 100 neurony:

# konstrukce modelu
nn = MLPRegressor(max_iter=5000, hidden_layer_sizes=(100, 100))

Tréninková a validační data budou tvořena maticí vstupů, tedy všech kombinací celočíselných hodnot 0..10. A výstupy (trénovací hodnoty) budou tvořeny součinem vstupů:

# X je matice, y je vektor
X = np.zeros( (MAX_N*MAX_N, 2) )   # kombinace cinitelu
y = np.zeros( (MAX_N*MAX_N, ))     # vektor soucinu
i = 0
for a in range(1, MAX_N+1):
    for b in range(1, MAX_N+1):
        X[i, 0] = a                # cinitel
        X[i, 1] = b                # cinitel
        y[i] = a * b               # soucin
        i+=1
Poznámka: naplnění matice X a vektoru y lze v Numpy provést i kratším způsobem, takto je však více názorné, jaké výpočty se vlastně provádí.

Model následně natrénujeme a otestujeme ho na několika zadaných hodnotách a a b. Teoreticky by měl model odpovědět celým číslem, ovšem regresní sítě vrací reálné hodnoty, takže musíme provést zaukrouhlení:

import numpy as np
 
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
# velikost tabulky soucinu
MAX_N = 10
 
# X je matice, y je vektor
X = np.zeros( (MAX_N*MAX_N, 2) )     # kombinace cinitelu
y = np.zeros( (MAX_N*MAX_N, ))       # vektor soucinu
i = 0
for a in range(1, MAX_N+1):
    for b in range(1, MAX_N+1):
        X[i, 0] = a                  # cinitel
        X[i, 1] = b                  # cinitel
        y[i] = a * b                 # soucin
        i+=1
 
# rozdeleni dat na treninkovou a testovaci mnozinu
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
 
# konstrukce modelu
nn = MLPRegressor(max_iter=5000, hidden_layer_sizes=(100, 100))
 
# trénink modelu
nn.fit(X_train, y_train)
 
# predikce modelu
y_pred = nn.predict(X_test)
 
# chyba predikce
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
 
# 1 = nejlepší predikce modelu
print("Coefficient of determination: %.2f" % r2_score(y_test, y_pred))
 
# zobrazit parametry neuronove site
print(f"Features: {nn.n_features_in_}")
print(f"Layers:   {nn.n_layers_}")
print(f"Outputs:  {nn.n_outputs_}")
print("Weights:")
 
# vahy neuronu
for layer, weights in enumerate(nn.coefs_):
    print("\t", layer, weights.shape)
 
# posuny (dalsi vstup do neuronu)
print("Biases:")
for layer, biases in enumerate(nn.intercepts_):
    print("\t", layer, biases.shape)
 
# nezname vstupy
inputs = [[1, 1], [2,  3], [5, 5], [4, 10], [10, 4], [9, 9], [10, 10]]
predicted = nn.predict(inputs)
 
# odhady neuronove site bez dalsich uprav
print("w/o rounding:")
for i, p in zip(inputs, predicted):
    print(f"{i[0]:2} * {i[1]:2} = {p:6.2f}")
 
# odhady neuronove site po zaokrouhleni
print("rounded:")
for i, p in zip(inputs, predicted):
    print(f"{i[0]:2} * {i[1]:2} = {int(p):2}")

15. Výsledek: neuronová síť na úrovni prváka

Při numerickém vyjádření kvality modelu (tedy neuronové sítě) dostaneme skóre 1.0, což je podezřele dobrý výsledek (ovšem trénujeme i validujeme nad stejnými daty!):

Mean squared error: 0.34
Coefficient of determination: 1.00

Vlastnosti neuronové sítě odpovídají hodnotám, které jsme zadali konstruktoru MLPClassifier:

Features: 2
Layers:   4
Outputs:  1
Weights:
         0 (2, 100)
         1 (100, 100)
         2 (100, 1)
Biases:
         0 (100,)
         1 (100,)
         2 (1,)

Zajímavější jsou však výsledky neuronové sítě pro zadané hodnoty a a b. Síť vrátí reálné číslo, které by se mělo přibližovat korektnímu výsledku součinu:

w/o rounding:
 1 *  1 =  -0.12
 2 *  3 =   6.50
 5 *  5 =  24.62
 4 * 10 =  40.02
10 *  4 =  40.73
 9 *  9 =  81.74
10 * 10 =  98.44

Po zaokrouhlení získáme sérii zcela korektních výsledků, ale i výsledky, které se (nepatrně) odlišují od korektního součinu. Problémy nastávají zejména na obou „mezích“ tabulky malé násobilky, tj. pro hodnoty blízké jedničce a naopak pro hodnoty blízké 100:

rounded:
 1 *  1 =  0    špatně
 2 *  3 =  6
 5 *  5 = 24    špatně
 4 * 10 = 40
10 *  4 = 40
 9 *  9 = 81
10 * 10 = 98    špatně
Poznámka: jedná se o pochopitelné výsledky, zejména když si uvědomíme, že neuronová síť je tvořena množinou uzlů, které provádí váhování svých vstupů s jejich následným součtem a na takto získanou sumu aplikují zvolenou aktivační funkci. V obou mezních stavech tedy skutečně může docházet k chybám – a to platí i pro reálně používané neuronové sítě.

16. Vizualizace rozdílů předpovědí neuronové sítě od korektních výsledků

Pro model provádějící regresi a nikoli klasifikaci sice nemůžeme použít matici záměn, ale můžeme si pomoci jiným způsobem. Vypočteme si například rozdíl mezi očekávanými výsledky a výsledky vypočtenými modelem. Bude se opět jednat o matici 10×10:

# korektni tabulka male nasobilky
W = y.reshape((MAX_N, MAX_N))
 
print("Relative errors:")
errors = (100*(Z-W)/W).astype("int")
print(errors)

A takovou matici již můžeme zobrazit i formou grafu:

# vizualizace chyb
plt.matshow(Z-W)

Podívejme se tedy na skript, který nejprve natrénuje neuronovou síť na výpočet malé násobilky, potom nechá tuto síť vytvořit tabulku (matici) malé násobilky a následně zobrazí chyby (jak ve tvaru matice, tak i grafu):

import numpy as np
import matplotlib.pyplot as plt
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
# velikost tabulky soucinu
MAX_N = 10
 
# X je matice, y je vektor
X = np.zeros( (MAX_N*MAX_N, 2) )     # kombinace cinitelu
y = np.zeros( (MAX_N*MAX_N, ))       # vektor soucinu
i = 0
for a in range(1, MAX_N+1):
    for b in range(1, MAX_N+1):
        X[i, 0] = a                  # cinitel
        X[i, 1] = b                  # cinitel
        y[i] = a * b                 # soucin
        i+=1
 
# konstrukce modelu
nn = MLPRegressor(max_iter=5000, hidden_layer_sizes=(100, 100))
 
# trénink modelu nad vsemi daty
nn.fit(X, y)
 
# zobrazit parametry neuronove site
print(f"Features: {nn.n_features_in_}")
print(f"Layers:   {nn.n_layers_}")
print(f"Outputs:  {nn.n_outputs_}")
print("Weights:")
 
# vahy neuronu
for layer, weights in enumerate(nn.coefs_):
    print("\t", layer, weights.shape)
 
# posuny (dalsi vstup do neuronu)
print("Biases:")
for layer, biases in enumerate(nn.intercepts_):
    print("\t", layer, biases.shape)
 
# odhady (odpovedi) neuronove site po uprave do matice 10x10
Z = nn.predict(X).round().reshape((MAX_N, MAX_N))
 
print("Prediction:")
print(Z)
 
# korektni tabulka male nasobilky
W = y.reshape((MAX_N, MAX_N))
 
print("Relative errors:")
errors = (100*(Z-W)/W).astype("int")
print(errors)
 
# vizualizace chyb
plt.matshow(Z-W)
 
# ulozeni vysledku
plt.savefig("152.png")
 
# zobrazeni
plt.show()

17. Numerické i grafické výsledky korektnosti výpočtů tabulky malé násobilky

Po spuštění výše uvedeného skriptu se nejprve zobrazí parametry neuronové sítě, což již dobře známe:

Features: 2
Layers:   4
Outputs:  1
Weights:
         0 (2, 100)
         1 (100, 100)
         2 (100, 1)
Biases:
         0 (100,)
         1 (100,)
         2 (1,)

Dále se zobrazí tabulka malé násobilky vypočtená neuronovou sítí (s chybami!):

Prediction:
[[-0.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
 [ 2.  4.  6.  8. 10. 12. 14. 16. 18. 20.]
 [ 3.  6.  9. 12. 15. 18. 21. 24. 27. 30.]
 [ 4.  8. 12. 16. 20. 24. 28. 32. 36. 40.]
 [ 5. 10. 15. 20. 25. 30. 35. 40. 45. 50.]
 [ 6. 12. 18. 24. 30. 36. 42. 48. 54. 60.]
 [ 7. 14. 21. 28. 35. 42. 49. 56. 63. 70.]
 [ 8. 15. 24. 32. 40. 48. 57. 65. 73. 80.]
 [ 9. 18. 27. 36. 45. 54. 63. 73. 82. 89.]
 [10. 20. 30. 40. 50. 61. 70. 80. 89. 98.]]

Relativní chyby vyjádřené v procentech nejsou většinou příliš velké, až na ten nejjednodušší výpočet 1×1 :-)

Relative errors:
[[-100    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0   -6    0    0    0    0    1    1    1    0]
 [   0    0    0    0    0    0    0    1    1   -1]
 [   0    0    0    0    0    1    0    0   -1   -2]]

Vizuální zobrazení chyb pro čtyři běhy skriptu (síť se pokaždé natrénuje odlišně):

Obrázek 14: Z grafu je patrné, ve kterých místech neuronová síť nejvíce chybuje (horní a dolní roh).

Obrázek 15: Výsledky pro nepatrně odlišně natrénovanou sít.

Obrázek 16: Výsledky pro nepatrně odlišně natrénovanou sít.

Obrázek 17: Výsledky pro nepatrně odlišně natrénovanou sít.

18. Dokáže takto natrénovaná neuronová síť generalizovat?

Nyní si otestujme, jestli neuronová síť natrénovaná pouze na výpočet malé násobilky dokáže provádět součiny i pro větší hodnoty (například od 1 do 20, tedy nejvyšším očekávaným výsledkem bude 20×20=400). Otestujeme tedy, jestli neuronová síť dokáže nějakým způsobem generalizovat to, co se naučila (a jestli si jako celek udělala správný „mentální model“ řešeného problému). Předchozí skript tedy upravíme tak, že nejdříve neuronovou síť běžným způsobem natrénujeme pro malou násobilku a posléze jí pošleme pro ohodnocení matici s kombinacemi činitelů 0 až 20, což znamená, že jen 25% vstupů tato síť „viděla“ při tréninku (MAXN se liší od MAX_TO_COMPUTE):

import numpy as np
import matplotlib.pyplot as plt
 
# model zalozeny na neuronove siti
from sklearn.neural_network import MLPRegressor
 
# velikost tabulky soucinu
MAX_N = 10
 
# X je matice, y je vektor
X = np.zeros( (MAX_N*MAX_N, 2) )     # kombinace cinitelu
y = np.zeros( (MAX_N*MAX_N, ))       # vektor soucinu
i = 0
for a in range(1, MAX_N+1):
    for b in range(1, MAX_N+1):
        X[i, 0] = a                  # cinitel
        X[i, 1] = b                  # cinitel
        y[i] = a * b                 # soucin
        i+=1
 
# konstrukce modelu
nn = MLPRegressor(max_iter=5000, hidden_layer_sizes=(100, 100))
 
# trénink modelu nad vsemi daty
nn.fit(X, y)
 
# zobrazit parametry neuronove site
print(f"Features: {nn.n_features_in_}")
print(f"Layers:   {nn.n_layers_}")
print(f"Outputs:  {nn.n_outputs_}")
print("Weights:")
 
# vahy neuronu
for layer, weights in enumerate(nn.coefs_):
    print("\t", layer, weights.shape)
 
# posuny (dalsi vstup do neuronu)
print("Biases:")
for layer, biases in enumerate(nn.intercepts_):
    print("\t", layer, biases.shape)
 
MAX_TO_COMPUTE = 20
 
X2 = np.zeros( (MAX_TO_COMPUTE*MAX_TO_COMPUTE, 2) )     # kombinace cinitelu
y2 = np.zeros( (MAX_TO_COMPUTE*MAX_TO_COMPUTE, ))       # vektor soucinu
i = 0
for a in range(1, MAX_TO_COMPUTE+1):
    for b in range(1, MAX_TO_COMPUTE+1):
        X2[i, 0] = a                  # cinitel
        X2[i, 1] = b                  # cinitel
        y2[i] = a * b                 # soucin
        i+=1
 
# odhady (odpovedi) neuronove site po uprave do matice 10x10
Z = nn.predict(X2).round().reshape((MAX_TO_COMPUTE, MAX_TO_COMPUTE))
 
print("Prediction:")
print(Z)
 
# korektni tabulka male nasobilky
W = y2.reshape((MAX_TO_COMPUTE, MAX_TO_COMPUTE))
 
print("Relative errors:")
errors = (100*(Z-W)/W).astype("int")
print(errors)
 
# vizualizace chyb
plt.matshow(Z-W)
 
# ulozeni vysledku
plt.savefig("153.png")
 
# zobrazeni
plt.show()

Skript po svém spuštění opět zobrazí základní parametry neuronové sítě (ta se přitom nijak nezměnila):

Features: 2
Layers:   4
Outputs:  1
Weights:
     0 (2, 100)
     1 (100, 100)
     2 (100, 1)
Biases:
     0 (100,)
     1 (100,)
     2 (1,)

Výsledky pro vyšší činitele již nejsou nijak oslňující – tuto část se neuronová síť evidentně nenaučila ani neprovedla generalizaci:

Prediction:
[[  0.   2.   3.   4.   5.   6.   7.   8.   9.  10.  12.  13.  15.  18.  20.  22.  25.  27.  29.  32.]
 [  1.   4.   7.   8.  10.  12.  14.  16.  18.  20.  22.  24.  26.  28.  31.  33.  35.  38.  40.  42.]
 [  3.   6.   9.  12.  15.  18.  21.  24.  27.  30.  33.  35.  37.  40.  42.  44.  47.  49.  51.  54.]
 [  4.   8.  12.  16.  19.  24.  28.  32.  36.  40.  44.  47.  50.  52.  54.  56.  59.  61.  63.  66.]
 [  5.  10.  15.  20.  25.  30.  35.  40.  45.  50.  54.  58.  62.  65.  67.  69.  71.  73.  76.  78.]
 [  6.  12.  18.  24.  30.  36.  42.  48.  54.  60.  65.  70.  73.  77.  80.  83.  85.  87.  89.  91.]
 [  7.  14.  21.  28.  35.  42.  49.  56.  64.  70.  75.  81.  86.  90.  93.  97.  99. 101. 103. 105.]
 [  8.  16.  24.  32.  40.  48.  57.  66.  73.  80.  86.  92.  97. 102.  106. 110. 113. 116. 118. 120.]
 [  9.  18.  27.  36.  45.  54.  63.  73.  82.  89.  96. 102. 108. 113.  118. 122. 126. 129. 132. 135.]
 [ 10.  20.  30.  40.  50.  60.  70.  80.  89.  98. 106. 112. 118. 123.  129. 134. 138. 142. 145. 148.]
 [ 12.  22.  33.  44.  54.  65.  76.  86.  96. 105. 114. 121. 128. 133.  139. 144. 150. 154. 158. 162.]
 [ 15.  25.  36.  47.  59.  70.  81.  92. 102. 112. 121. 129. 137. 143.  149. 154. 160. 165. 170. 174.]
 [ 17.  28.  39.  50.  62.  74.  86.  97. 108. 117. 127. 136. 145. 152.  159. 164. 170. 175. 181. 186.]
 [ 20.  31.  41.  53.  65.  78.  90. 102. 113. 123. 133. 142. 151. 160.  167. 174. 180. 185. 191. 196.]
 [ 23.  33.  44.  56.  67.  81.  94. 106. 118. 129. 139. 148. 157. 166.  175. 182. 189. 195. 200. 206.]
 [ 26.  36.  47.  58.  70.  83.  97. 111. 122. 133. 144. 154. 163. 173.  181. 190. 198. 204. 210. 216.]
 [ 28.  39.  50.  61.  73.  86. 100. 114. 126. 138. 149. 159. 169. 179.  188. 196. 205. 213. 220. 226.]
 [ 31.  42.  53.  64.  76.  89. 102. 117. 131. 142. 154. 165. 175. 185.  194. 203. 212. 220. 228. 235.]
 [ 34.  45.  55.  67.  79.  91. 105. 119. 133. 147. 158. 169. 180. 190.  200. 209. 218. 227. 235. 243.]
 [ 37.  47.  58.  70.  81.  94. 108. 121. 136. 150. 163. 174. 185. 196.  206. 215. 224. 233. 242. 250.]]

Ještě více je to patrné při vyjádření relativní chyby:

Relative errors:
[[-100    0    0    0    0    0    0    0    0    0    9    8   15   28 33   37   47   50   52   60]
 [ -50    0   16    0    0    0    0    0    0    0    0    0    0    0 3    3    2    5    5    5]
 [   0    0    0    0    0    0    0    0    0    0    0   -2   -5   -4 -6   -8   -7   -9  -10  -10]
 [   0    0    0    0   -5    0    0    0    0    0    0   -2   -3   -7 -10  -12  -13  -15  -17  -17]
 [   0    0    0    0    0    0    0    0    0    0   -1   -3   -4   -7 -10  -13  -16  -18  -20  -22]
 [   0    0    0    0    0    0    0    0    0    0   -1   -2   -6   -8 -11  -13  -16  -19  -21  -24]
 [   0    0    0    0    0    0    0    0    1    0   -2   -3   -5   -8 -11  -13  -16  -19  -22  -25]
 [   0    0    0    0    0    0    1    3    1    0   -2   -4   -6   -8 -11  -14  -16  -19  -22  -25]
 [   0    0    0    0    0    0    0    1    1   -1   -3   -5   -7  -10 -12  -15  -17  -20  -22  -25]
 [   0    0    0    0    0    0    0    0   -1   -2   -3   -6   -9  -12 -14  -16  -18  -21  -23  -26]
 [   9    0    0    0   -1   -1   -1   -2   -3   -4   -5   -8  -10  -13 -15  -18  -19  -22  -24  -26]
 [  25    4    0   -2   -1   -2   -3   -4   -5   -6   -8  -10  -12  -14 -17  -19  -21  -23  -25  -27]
 [  30    7    0   -3   -4   -5   -5   -6   -7  -10  -11  -12  -14  -16 -18  -21  -23  -25  -26  -28]
 [  42   10   -2   -5   -7   -7   -8   -8  -10  -12  -13  -15  -17  -18 -20  -22  -24  -26  -28  -30]
 [  53   10   -2   -6  -10  -10  -10  -11  -12  -14  -15  -17  -19  -20 -22  -24  -25  -27  -29  -31]
 [  62   12   -2   -9  -12  -13  -13  -13  -15  -16  -18  -19  -21  -22 -24  -25  -27  -29  -30  -32]
 [  64   14   -1  -10  -14  -15  -15  -16  -17  -18  -20  -22  -23  -24 -26  -27  -29  -30  -31  -33]
 [  72   16   -1  -11  -15  -17  -19  -18  -19  -21  -22  -23  -25  -26 -28  -29  -30  -32  -33  -34]
 [  78   18   -3  -11  -16  -20  -21  -21  -22  -22  -24  -25  -27  -28 -29  -31  -32  -33  -34  -36]
 [  85   17   -3  -12  -19  -21  -22  -24  -24  -25  -25  -27  -28  -30 -31  -32  -34  -35  -36  -37]]

Poslední věcí, kterou si dnes ukážeme, je vizualizace chyb na grafu:

Obrázek 18: Vizualizace chyb pro vstupní činitele od 1 do 20.

CS24 tip temata

19. Repositář s demonstračními příklady

Všechny demonstrační příklady využívající knihovnu Scikit-learn lze nalézt v repositáři https://github.com/tisnik/most-popular-python-libs. Následují odkazy na jednotlivé příklady i na (Jupyter) diáře s postupem výpočtů a analýz:

# Příklad Stručný popis Adresa příkladu
1 01_show_matrix.py kooperace mezi knihovnami Matplotlib a NumPy: vizualizace obsahu 2D matice https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/01_show_ma­trix.py
2 02_get_digits.py datová množina obsahující naskenované ručně napsané číslice https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/02_get_di­gits.py
3 03_get_features.py další atributy datové množiny, které použijeme při trénování https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/03_get_fe­atures.py
4 04_get_images.py přečtení a následné vykreslení jednotlivých ručně nakreslených číslic https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/04_get_i­mages.py
5 05_show_grayscale_matrix.py odstranění umělé aplikované barvové palety (obrázky ve stupních šedi) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/05_show_gra­yscale_matrix.py
6 06_grayscale_images.py vykreslení ručně nakreslených číslic ve formě obrázků ve stupních šedi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/06_gra­yscale_images.py
7 07_multiplot.py rozdělení plochy grafu do oblastí; vykreslení více obrázků do jediného grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/07_mul­tiplot.py
8 08_model_preperation1.py obrázky s jejich ohodnocením https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/08_mo­del_preperation1.py
9 09_training_set.py příprava dat pro trénink https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/09_tra­ining_set.py
10 10_classification.py klasifikace obrázků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/10_clas­sification.py
11 11_results.py vykreslení obrázků společně s jejich klasifikací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/11_results.py
12 12_change_training_set.py změna poměru rozdělení dat na tréninkovou a testovací množinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/12_chan­ge_training_set.py
       
13 13_blobs.py použití funkce make_blobs pro vygenerování sady bodů v rovině sdružených do oblastí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/13_blobs.py
14 14_swap_coords.py úprava předchozího příkladu: prohození souřadnic na osách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/14_swap_co­ords.py
15 15_blobs_scatter_plot.py základní podoba bodového diagramu (scatter plot) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/15_blob­s_scatter_plot.py
16 16_blobs_scatter_plot.py úprava bodového diagramu při zobrazení většího množství bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/16_blob­s_scatter_plot.py
17 17_colorized_blobs.py obarvení bodů podle oblastí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/17_co­lorized_blobs.py
18 18_k-means.py základní použití algoritmu K-means pro clustering https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/18_k-means.py
19 19_combination.py zobrazení centroidů společně s původními body https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/19_com­bination.py
20 20_combinations.py vizualizace clusteringu původní množiny bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/20_com­binations.py
21 21_other_settings.py vizualizace clusteringu původní množiny bodů pro odlišnou množinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/21_ot­her_settings.py
22 22_random_points.py clustering pro náhodná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/22_ran­dom_points.py
       
23 23_circles.py pseudonáhodné rozmístění bodů do kružnic, menší náhodnost výsledku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/23_circles.py
24 24_more_noise_circles.py pseudonáhodné rozmístění bodů do kružnic, větší náhodnost výsledku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/24_mo­re_noise_circles.py
25 25_moons.py pseudonáhodné rozmístění bodů do tvaru dvou půlměsíců, menší náhodnost https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/25_moons.py
26 26_more_noisy_moons.py pseudonáhodné rozmístění bodů do tvaru dvou půlměsíců, větší náhodnost https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/26_mo­re_noisy_moons.py
27 27_circles_kmeans.py výsledek clusteringu provedeného algoritmem K-means na „kružnice“ https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/27_cir­cles_kmeans.py
28 28_moons_kmeans.py výsledek clusteringu provedeného algoritmem K-means na „půlměsíce“ https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/28_mo­ons_kmeans.py
29 29_blobs_spectral_clustering.py spectral clustering pro body rozmístěné pomocí make_blobs https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/29_blob­s_spectral_clustering.py
30 30_circles_spectral_clustering.py spectral clustering pro body rozmístěné do kružnic https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/30_cir­cles_spectral_clustering.py
31 31_moons_spectral_clustering.py spectral clustering pro body rozmístěné do půlměsíců https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/31_mo­ons_spectral_clustering.py
32 32_moons_spectral_clustering_limits.py vyhledání limitů algoritmu spectral clustering https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/32_mo­ons_spectral_clustering_li­mits.py
       
33 33_particles_load.py načtení souřadnic částic uložených v souboru formátu CSV https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/33_par­ticles_load.py
       
34 34_lorenz_attractor.py zobrazení Lorenzova atraktoru formou bodů propojených úsečkami https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/34_lo­renz_attractor.py
35 35_lorenz_attractor_points.py Lorenzův atraktor vykreslený formou jednotlivých bodů s definovaným stylem zobrazení a velikostí stopy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/35_lo­renz_attractor_points.py
36 36_blobs_3d.py vygenerování a zobrazení sady bodů v 3D prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/36_blob­s_3d.py
37 37_spread_blobs_3d.py vygenerování a zobrazení sady bodů v 3D prostoru, odlišné parametry při generování https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/37_spre­ad_blobs_3d.py
38 38_views.py různé pohledy na 3D graf https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/38_views.py
39 39_colorized_3d_blobs.py obarvení bodů v prostoru na základě vstupních dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/39_co­lorized_3d_blobs.py
40 40_kmeans_3d_blobs.py shluková analýza v 3D prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/40_kme­ans_3d_blobs.py
41 41_kmeans_spread_3d_blobs.py shluková analýza v 3D prostoru pro odlišnou množinu bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/41_kme­ans_spread_3d_blobs.py
42 42_kmeans_random_3d.py shluková analýza pro body rozmístěné zcela náhodně v omezeném prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/42_kme­ans_random_3d.py
       
43 43_speed_measurements.py benchmark pro postupně rostoucí počet bodů tvořících shluky https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/43_spe­ed_measurements.py
44 44_speed_measurements.py benchmark pro postupně rostoucí počet bodů rozmístěných náhodně https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/44_spe­ed_measurements.py
45 45_speed_measurements.py benchmark pro stále stejný počet bodů, u jejichž rozmístění v prostoru se používá stále větší směrodatná odchylka https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/45_spe­ed_measurements.py
       
46 46_iris_dataset.py načtení datové kolekce https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/46_i­ris_dataset.py
47 47_iris_description.py metadata o datové kolekci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/47_i­ris_description.py
48 48_iris_data.py tvar dat – počet záznamů a počet proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/48_i­ris_data.py
49 49_iris_targets.py jména atributů, vztah mezi numerickou hodnotou atributu a jeho jménem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/49_i­ris_targets.py
       
50 50_iris_scatter_plot1.py korelační diagram pro dvojici vybraných proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/50_i­ris_scatter_plot1.py
51 51_iris_scatter_plot2.py příprava pro tvorbu složitějších grafů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/51_i­ris_scatter_plot2.py
52 52_iris_mutliplot.py mřížka obsahující více korelačních diagramů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/52_i­ris_mutliplot.py
       
53 53_iris_histograms.py zobrazení základního histogramu pro data v sadě Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/53_i­ris_histograms.py
54 54_iris_histograms.py úprava histogramu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/54_i­ris_histograms.py
       
55 55_pca.py analýza hlavních komponent (PCA), výsledek zobrazený v 2D grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/55_pca.py
56 56_pca_3d.py analýza hlavních komponent (PCA), výsledek zobrazený v 3D grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/56_pca_3d.py
57 57_kmeans.py základní shluková analýza https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/57_kmeans.py
58 58_multiple_kmeans.py větší množství výsledků shlukové analýzy pro různé atributy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/58_mul­tiple_kmeans.py
59 59_kmeans_errors.py korektní a nekorektní výsledky základní shlukové analýzy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/59_kme­ans_errors.py
       
60 60_basic_classifier.py aplikace jednoduchého modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/60_ba­sic_classifier.py
61 61_changed_model_parameters.py změna parametrů modelu pro zjištění druhů rostil https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/61_chan­ged_model_parameters.py
62 62_different_model.py použití odlišného modelu pro zjištění druhů rostlin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/62_dif­ferent_model.py
       
63 63_verify_on_whole_data1.py otestování naučeného modelu s využitím tréninkových dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/63_ve­rify_on_whole_data1.py
64 64_verify_on_whole_data2.py využití funkce metrics.accuracy_score pro zjištění kvality modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/64_ve­rify_on_whole_data2.py
65 65_basic_comparison.py porovnání vlastností různých modelů (prozatím nekorektní řešení) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/65_ba­sic_comparison.py
66 66_training_testing_split1.py rozdělení datové sady na trénovací data a testovací data (základní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/66_tra­ining_testing_split1.py
67 67_training_testing_split2.py rozdělení datové sady na trénovací data a testovací data (náhodné rozdělení sady) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/67_tra­ining_testing_split2.py
68 68_training_testing_split3.py rozdělení datové sady na trénovací data a testovací data (využití vestavěné funkce) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/68_tra­ining_testing_split3.py
69 69_better_comparison.py vylepšené porovnání vlastností různých modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/69_bet­ter_comparison.py
70 70_multiple_runs.py vliv generátoru náhodných čísel na změřené výsledky https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/70_mul­tiple_runs.py
71 71_stable_multiple_runs.py generátor náhodných čísel a použití hodnoty random_state https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/71_sta­ble_multiple_runs.py
       
72 72_housings_dataset.py načtení datové sady California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/72_hou­sings_dataset.py
73 73_housings_dataset_description.py metainformace o datové sadě California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/73_hou­sings_dataset_description­.py
74 74_housings_data.py n-rozměrné pole s atributy jednotlivých domů/bloků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/74_hou­sings_data.py
75 75_housings_targets.py jména atributů, ceny domů atd. https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/75_hou­sings_targets.py
76 76_housings_scatter_plot.py korelační diagram pro dvojici vybraných proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/76_hou­sings_scatter_plot.py
77 77_housings_mutliplot.py korelační diagram pro všechny kombinace dvojic proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/77_hou­sings_mutliplot.py
78 78_scatter.py dvourozměrné hodnoty reprezentované jako dvojice atributů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/78_scatter.py
79 79_linear_regression_gen_data.py model LinearRegression nad uměle vytvořenými daty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/79_li­near_regression_gen_data.py
80 80_linear_regression_predictions.py predikce modelu provádějícího lineární regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/80_li­near_regression_prediction­s.py
81 81_linear_regression_random_data.py chování modelu pro zcela náhodná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/81_li­near_regression_random_da­ta.py
82 82_linear_regression_housings.py model LinearRegression pro datovou sadu California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/82_li­near_regression_housings.py
83 83_polynomial_regression_gen_data.py polynomiální regrese (základní příklad) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/83_po­lynomial_regression_gen_da­ta.py
84 84_polynomial_regression_housings.py polynomiální regrese a datová sada California housings, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/84_po­lynomial_regression_housin­gs.py
85 85_polynomial_regression_housings2.py polynomiální regrese a datová sada California housings, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/85_po­lynomial_regression_housin­gs2.py
86 86_polynomial_regression_housings3.py polynomiální regrese a datová sada California housings, třetí příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/86_po­lynomial_regression_housin­gs3.py
87 87_linear_regression_errors.py výpočet chyby a skóre modelu lineární regrese https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/87_li­near_regression_errors.py
88 88_linear_regression_non_linear_data.py lineární regrese nad nelineárními daty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/88_li­near_regression_non_linear_da­ta.py
89 89_polynomial_regression_error.py https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/89_po­lynomial_regression_error­.py
       
90 90_housings_prediction1.py regresní analýza nad daty California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/90_hou­sings_prediction1.py
91 91_housings_prediction2.py korektní natrénování modelu pro regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/91_hou­sings_prediction2.py
92 92_housings_prediction3.py omezení množství atributů (proměnných), na kterých je model natrénován https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/92_hou­sings_prediction3.py
93 93_housings_prediction_errors1.py chybně natrénovaný model při náhodné volbě dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/93_hou­sings_prediction_errors1.py
94 94_housings_prediction_errors2.py omezení atributů + chybně natrénovaný model https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/94_hou­sings_prediction_errors2.py
95 95_housings_histograms.py histogramy pro jednotlivé atributy (proměnné) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/95_hou­sings_histograms.py
96 96_housings_statistic.py statistické údaje pro jednotlivé atributy (proměnné) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/96_hou­sings_statistic.py
97 97_housings_statistic_normalized.py statistické údaje získané po normalizaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/97_hou­sings_statistic_normalized­.py
       
98 98_k_fold_help.py zobrazení nápovědy ke třídě s realizací k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/98_k_fol­d_help.py
99 99_k_fold_old.py původní (nepodporovaná) varianta provedení k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/99_k_fol­d_old.py
100 100_k_fold1.py interní chování algoritmu k-foldingu (základní parametry) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/100_k_fol­d1.py
101 101_k_fold2.py interní chování algoritmu k-foldingu (odlišné parametry) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/101_k_fol­d2.py
102 102_k_fold_selection.py k-folding a výběr dat pro otestování modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/102_k_fol­d_selection.py
103 103_average_score.py realizace výpočtu průměrného skóre pro otestování modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/103_a­verage_score.py
104 104_hyperparams_score.py změna hyperparametrů s výpočtem průměrného skóre (tabulka) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/104_hy­perparams_score.py
105 105_hyperparams_score_plot.py změna hyperparametrů s výpočtem průměrného skóre (graf) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/105_hy­perparams_score_plot.py
106 106_model_selection.py výběr nejlepšího modelu s využitím k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/106_mo­del_selection.py
107 107_features_selection_basic.py výběr atributů (proměnných) pro trénink modelu (základní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/107_fe­atures_selection_basic.py
108 108_features_selection_iris.py výběr atributů (proměnných) pro trénink modelu (datová sada Iris) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/108_fe­atures_selection_iris.py
109 109_features_selection_houses.py výběr atributů (proměnných) pro trénink modelu (datová sada California Housings) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/109_fe­atures_selection_houses.py
110 110_best_features_selection_houses.py získání nejlepší sady atributů (proměnných) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/110_bes­t_features_selection_houses­.py
111 111_features_selection_graphical.py výběr atributů (proměnných) pro trénink modelu (datová sada Iris), grafický výstup https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/111_fe­atures_selection_graphical­.py
       
112 112_simplest_linear_regression.py lineární regrese bodů ležících v rovině https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/112_sim­plest_linear_regression.py
113 113_linear_regression_no_intercept.py lineární regrese při vynucení w0=0 pro obecná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/113_li­near_regression_no_intercep­t.py
114 114_linear_regression_from0_0.py lineární regrese při vynucení w0=0 v případě, že vstupní body obsahují počátek souřadného systému https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/114_li­near_regression_from0_0.py
115 115_linear_regression_multiple_y.py model předpovídající pro každou vstupní hodnotu dvě výstupní hodnoty (odpovědi) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/115_li­near_regression_multiple_y­.py
116 116_grid_operations.py konstrukce matice obsahující souřadnice bodů v mřížce https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/116_grid_o­perations.py
117 117_linear_regression_multiple_x.py proložení bodů v prostoru rovinou https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/117_li­near_regression_multiple_x­.py
118 118_linear_regression_multiple_x.py proložení bodů s náhodnou výškou rovinou https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/118_li­near_regression_multiple_x­.py
119 119_linear_regression_mul­tiple_x_and_y.py proložení dvou sad bodů dvojicí rovin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/119_li­near_regression_multiple_x_an­d_y.py
120 120_linear_regression_mul­tiple_x_and_y.py proložení dvou sad bodů dvojicí rovin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/120_li­near_regression_multiple_x_an­d_y.py
121 121_linear_regression_poly.py základní polynomická regrese https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/121_li­near_regression_poly.py
122 122_linear_regression_poly_mul­tiple_x.py polynomická regrese a body v prostoru, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/122_li­near_regression_poly_multi­ple_x.py
123 123_linear_regression_poly_mul­tiple_x.py polynomická regrese a body v prostoru, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/123_li­near_regression_poly_multi­ple_x.py
       
124 124_iris_set_statistic.py získání statistických informací o datové sadě Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/124_i­ris_set_statistic.py
125 125_california_housings_statistic.py získání statistických informací o datové sadě California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/125_ca­lifornia_housings_statistic­.py
126 126_variance_threshold1.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/126_va­riance_threshold1.py
127 127_variance_threshold2.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/127_va­riance_threshold2.py
128 128_variance_threshold3.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/128_va­riance_threshold3.py
129 129_select_best_iris.py výběr nejvhodnějších atributů pro datovou sadu Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/129_se­lect_best_iris.py
130 130_select_best_housings.py výběr nejvhodnějších atributů pro datovou sadu California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/130_se­lect_best_housings.py
131 131_select_k_best_housings.py výběr K nejvhodnějších atributů pro datovou sadu California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/131_se­lect_k_best_housings.py
132 132_select_from_model.py výběr atributů na základě k tomu určeného modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/132_se­lect_from_model.py
133 133_cross_validation1.py křížová validace po výběru (filtraci) modelů (datová sada Iris) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/133_cros­s_validation1.py
134 134_cross_validation2.py křížová validace po výběru (filtraci) modelů (datová sada California Housings) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/134_cros­s_validation2.py
135 135_cross_validation3.py křížová validace po výběru (filtraci) modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/135_cros­s_validation3.py
       
136 136_mlp_classifier01.py použití neuronové sítě pro klasifikaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/136_mlp_clas­sifier01.py
137 137_mlp_classifier02.py výpočet úspěšnosti modelu založeného na neuronové síti https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/137_mlp_clas­sifier02.py
138 138_mlp_classifier03.py konfigurace vrstev neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/138_mlp_clas­sifier03.py
139 139_mlp_classifier04.py proměnný počet neuronů ve vrstvách neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/139_mlp_clas­sifier04.py
140 140_mlp_classifier05.py proměnný počet neuronů ve více vrstvách neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/140_mlp_clas­sifier05.py
       
141 141_mlp_regression1.py použití neuronové sítě pro regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/141_mlp_re­gression1.py
142 142_mlp_regression2.py modifikace parametrů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/142_mlp_re­gression2.py
143 143_mlp_regression2.py další modifikace parametrů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/143_mlp_re­gression2.py
144 144_mlp_regression3.py postupná změna počtu neuronů v jedné skryté vrstvě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/144_mlp_re­gression3.py
145 145_mlp_regression4.py postupná změna počtu neuronů ve třech skrytých vrstvách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/145_mlp_re­gression4.py
146 146_mlp_regression5.py postupná změna počtu neuronů v pěti skrytých vrstvách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/146_mlp_re­gression5.py
147 147_mlp_regression6.py postupná změna počtu skrytých vrstev při zachování počtu neuronů v každé vrstvě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/147_mlp_re­gression6.py
       
148 148_confusion_matrix1.py zjištění kvality modelu s využitím matice záměn (confusion matrix) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/148_con­fusion_matrix1.py
149 149_confusion_matrix2.py zjištění kvality modelu hledajícího K nejbližších sousedů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/149_con­fusion_matrix2.py
150 150_confusion_matrix3.py zjištění kvality modelu tvořeného neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/150_con­fusion_matrix3.py
       
151 151_multiplication_table.py využití neuronové sítě pro odhad výsledků součinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/151_mul­tiplication_table.py
152 152_multiplication_table.py odhad/vygenerování celé matice malé násobilky neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/152_mul­tiplication_table.py
153 153_multiplication_table.py rozšíření výpočtu součinu na rozsah 20×20 (při zachování původní sítě) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/153_mul­tiplication_table.py

V repositáři nalezneme taktéž projektový soubor a Jupyter Notebook s vysvětlením, jak lze modely využít pro rozpoznávání obsahu rastrových obrázků:

# Příklad Stručný popis Adresa příkladu
1 pyproject.toml projektový soubor (pro PDM) se všemi závislostmi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/py­project.toml
       
2 pdm.lock lock soubor s konkrétními verzemi všech přímých i tranzitivních závislostí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/pdm.lock
       
3 Rozpoznání_obrazu_scikit-learn.ipynb Jupyter notebook s celým postupem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/Roz­poznání_obrazu_scikit-learn.ipynb
       
4 particle_life.py emergence: příklad vzniku struktury https://github.com/tisnik/most-popular-python-libs/blob/master/particles/par­ticle_life.py

20. Odkazy na Internetu

  1. Shluková analýza (clustering) a knihovna Scikit-learn
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn/
  2. Shluková analýza (clustering) a knihovna Scikit-learn (2)
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn-2/
  3. Shluková analýza (clustering) a knihovna Scikit-learn (z plochy do 3D prostoru)
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn-z-plochy-do-3d-prostoru/
  4. Rozpoznávání obrázků knihovnou Scikit-learn: první kroky
    https://www.root.cz/clanky/roz­poznavani-obrazku-knihovnou-scikit-learn-prvni-kroky/
  5. scikit-learn: Machine Learning in Python
    https://scikit-learn.org/stable/index.html
  6. Sklearn-pandas
    https://github.com/scikit-learn-contrib/sklearn-pandas
  7. sklearn-xarray
    https://github.com/phausamann/sklearn-xarray/
  8. Clustering
    https://scikit-learn.org/stable/modules/clus­tering.html
  9. Cluster analysis (Wikipedia)
    https://en.wikipedia.org/wi­ki/Cluster_analysis
  10. Shluková analýza (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Shlukov%C3%A1_anal%C3%BDza
  11. K-means
    https://cs.wikipedia.org/wiki/K-means
  12. k-means clustering
    https://en.wikipedia.org/wiki/K-means_clustering
  13. Spectral clustering
    https://en.wikipedia.org/wi­ki/Spectral_clustering
  14. Emergence
    https://cs.wikipedia.org/wi­ki/Emergence
  15. Particle Life: Vivid structures from rudimentary rules
    https://particle-life.com/
  16. Hertzsprungův–Russellův diagram
    https://cs.wikipedia.org/wi­ki/Hertzsprung%C5%AFv%E2%80%93Rus­sell%C5%AFv_diagram
  17. Using Machine Learning in an HR Diagram
    https://cocalc.com/share/pu­blic_paths/08b6e03583cbdef3cdb98­13a54ec68ff773c747f
  18. Gaia H-R diagrams: Querying Gaia data for one million nearby stars
    https://vlas.dev/post/gaia-dr2-hrd/
  19. The Hertzsprung–Russell diagram
    https://scipython.com/book2/chapter-9-data-analysis-with-pandas/problems/p92/the-hertzsprung-russell-diagram/
  20. Animated Hertzsprung-Russell Diagram with 119,614 datapoints
    https://github.com/zonination/h-r-diagram
  21. Neuraxle Pipelines
    https://github.com/Neuraxio/Neuraxle
  22. scikit-learn: Getting Started
    https://scikit-learn.org/stable/getting_started.html
  23. Support Vector Machines
    https://scikit-learn.org/stable/modules/svm.html
  24. Use Deep Learning to Detect Programming Languages
    http://searene.me/2017/11/26/use-neural-networks-to-detect-programming-languages/
  25. Natural-language processing
    https://en.wikipedia.org/wiki/Natural-language_processing
  26. THE MNIST DATABASE of handwritten digits
    http://yann.lecun.com/exdb/mnist/
  27. MNIST database (Wikipedia)
    https://en.wikipedia.org/wi­ki/MNIST_database
  28. MNIST For ML Beginners
    https://www.tensorflow.or­g/get_started/mnist/begin­ners
  29. Stránka projektu Torch
    http://torch.ch/
  30. Torch: Serialization
    https://github.com/torch/tor­ch7/blob/master/doc/seria­lization.md
  31. Torch: modul image
    https://github.com/torch/i­mage/blob/master/README.md
  32. Data pro neuronové sítě
    http://archive.ics.uci.edu/ml/in­dex.php
  33. Torch na GitHubu (několik repositářů)
    https://github.com/torch
  34. Torch (machine learning), Wikipedia
    https://en.wikipedia.org/wi­ki/Torch_%28machine_learnin­g%29
  35. Torch Package Reference Manual
    https://github.com/torch/tor­ch7/blob/master/README.md
  36. Torch Cheatsheet
    https://github.com/torch/tor­ch7/wiki/Cheatsheet
  37. Neural network containres (Torch)
    https://github.com/torch/nn/blob/mas­ter/doc/containers.md
  38. Simple layers
    https://github.com/torch/nn/blob/mas­ter/doc/simple.md#nn.Line­ar
  39. Transfer Function Layers
    https://github.com/torch/nn/blob/mas­ter/doc/transfer.md#nn.tran­sfer.dok
  40. Feedforward neural network
    https://en.wikipedia.org/wi­ki/Feedforward_neural_net­work
  41. Biologické algoritmy (4) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-4-neuronove-site/
  42. Biologické algoritmy (5) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-5-neuronove-site/
  43. Umělá neuronová síť (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Um%C4%9Bl%C3%A1_neuronov%C3%A1_s%C3%AD%C5%A5
  44. PyTorch
    http://pytorch.org/
  45. JupyterLite na PyPi
    https://pypi.org/project/jupyterlite/
  46. JupyterLite na GitHubu
    https://github.com/jupyter­lite/jupyterlite
  47. Dokumentace k projektu JupyterLite
    https://github.com/jupyter­lite/jupyterlite
  48. Matplotlib Home Page
    http://matplotlib.org/
  49. Matplotlib (Wikipedia)
    https://en.wikipedia.org/wi­ki/Matplotlib
  50. Popis barvových map modulu matplotlib.cm
    https://gist.github.com/en­dolith/2719900#id7
  51. Ukázky (palety) barvových map modulu matplotlib.cm
    http://matplotlib.org/exam­ples/color/colormaps_refe­rence.html
  52. Galerie grafů vytvořených v Matplotlibu
    https://matplotlib.org/3.2.1/gallery/
  53. 3D rendering
    https://en.wikipedia.org/wi­ki/3D_rendering
  54. 3D computer graphics
    https://en.wikipedia.org/wi­ki/3D_computer_graphics
  55. Primary 3D view planes
    https://matplotlib.org/sta­ble/gallery/mplot3d/view_pla­nes_3d.html
  56. Getting started in scikit-learn with the famous iris dataset
    https://www.youtube.com/wat­ch?v=hd1W4CyPX58
  57. Training a machine learning model with scikit-learn
    https://www.youtube.com/wat­ch?v=RlQuVL6-qe8
  58. Iris (plant)
    https://en.wikipedia.org/wi­ki/Iris_(plant)
  59. Kosatec
    https://cs.wikipedia.org/wiki/Kosatec
  60. Iris setosa
    https://en.wikipedia.org/wi­ki/Iris_setosa
  61. Iris versicolor
    https://en.wikipedia.org/wi­ki/Iris_versicolor
  62. Iris virginica
    https://en.wikipedia.org/wi­ki/Iris_virginica
  63. Druh
    https://cs.wikipedia.org/wiki/Druh
  64. Iris subg. Limniris
    https://en.wikipedia.org/wi­ki/Iris_subg._Limniris
  65. Iris Dataset Classification with Python: A Tutorial
    https://www.pycodemates.com/2022/05/i­ris-dataset-classification-with-python.html
  66. Iris flower data set
    https://en.wikipedia.org/wi­ki/Iris_flower_data_set
  67. List of datasets for machine-learning research
    https://en.wikipedia.org/wi­ki/List_of_datasets_for_machi­ne-learning_research
  68. Analýza hlavních komponent
    https://cs.wikipedia.org/wi­ki/Anal%C3%BDza_hlavn%C3%AD­ch_komponent
  69. Principal component analysis
    https://en.wikipedia.org/wi­ki/Principal_component_ana­lysis
  70. Scikit-learn Crash Course – Machine Learning Library for Python
    https://www.youtube.com/wat­ch?v=0B5eIE_1vpU
  71. calm-notebooks
    https://github.com/koaning/calm-notebooks
  72. Should you teach Python or R for data science?
    https://www.dataschool.io/python-or-r-for-data-science/
  73. nbviewer: A simple way to share Jupyter Notebooks
    https://nbviewer.org/
  74. AI vs Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=4RixMPF4×is
  75. Machine Learning | What Is Machine Learning? | Introduction To Machine Learning | 2024 | Simplilearn (Youtube)
    https://www.youtube.com/wat­ch?v=ukzFI9rgwfU
  76. A Gentle Introduction to Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=Gv9_4yMHFhI
  77. Machine Learning vs Deep Learning
    https://www.youtube.com/wat­ch?v=q6kJ71tEYqM
  78. Umělá inteligence (slajdy)
    https://slideplayer.cz/sli­de/12119218/
  79. Úvod do umělé inteligence
    https://slideplayer.cz/slide/2505525/
  80. Umělá inteligence I / Artificial Intelligence I
    https://ktiml.mff.cuni.cz/~bartak/ui/
  81. Matplotlib vs. seaborn vs. Plotly vs. MATLAB vs. ggplot2 vs. pandas
    https://ritza.co/articles/matplotlib-vs-seaborn-vs-plotly-vs-MATLAB-vs-ggplot2-vs-pandas/
  82. Matplotlib, Seaborn or Plotnine?
    https://www.reddit.com/r/da­tascience/comments/jvrqxt/mat­plotlib_seaborn_or_plotni­ne/
  83. @Rabeez: Rabeez/plotting_comparison.ipynb
    https://gist.github.com/Ra­beez/ffc0b59d4a41e20fa8d94­4c44a96adbc
  84. Matplotlib, Seaborn, Plotly and Plotnine Comparison
    https://python.plainenglish­.io/matplotlib-seaborn-plotly-and-plotnine-comparison-baf2db5a9c40
  85. Data Visualization 101: How to Choose a Python Plotting Library
    https://towardsdatascience.com/data-visualization-101-how-to-choose-a-python-plotting-library-853460a08a8a
  86. Data science in Python: pandas, seaborn, scikit-learn
    https://www.youtube.com/wat­ch?v=3ZWuPVWq7p4
  87. 7.2. Real world datasets
    https://scikit-learn.org/stable/datasets/re­al_world.html#california-housing-dataset
  88. 7.2.7. California Housing dataset
    https://scikit-learn.org/stable/datasets/re­al_world.html#california-housing-dataset
  89. Comprehensive Guide to Classification Models in Scikit-Learn
    https://www.geeksforgeeks­.org/comprehensive-guide-to-classification-models-in-scikit-learn/
  90. Tidy Data Visualization: ggplot2 vs seaborn
    https://blog.tidy-intelligence.com/posts/ggplot2-vs-seaborn/
  91. seaborn: statistical data visualization
    https://seaborn.pydata.org/
  92. Linear regression (Wikipedia)
    https://en.wikipedia.org/wi­ki/Linear_regression
  93. Lineární regrese (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_regre­se
  94. Iris Flower Classification with MLP Classifier
    https://www.metriccoders.com/post/iris-flower-classification-with-mlp-classifier

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.