Hlavní navigace

Křížová validace modelů v knihovně scikit-learn

29. 8. 2024
Doba čtení: 41 minut

Sdílet

 Autor: Depositphotos
Budeme se zabývat důležitou problematikou, konkrétně jak vybrat co nejvhodnější model, jak nastavit hyperparametry modelů a jak vlastně zjistit, které atributy se mají použít při tréninku modelu.

Obsah

1. Křížová validace modelů v knihovně scikit-learn

2. K-fold validace

3. Ukázka činnosti rozdělení datové sady na oddíly (foldy)

4. Výběr prvků do trénovací a testovací datové sady na základě algoritmu K-fold

5. Křížová validace KNN modelu pro datovou sadu Iris

6. Nalezení ideální hodnoty hyperparametru pro KNN model

7. Grafická vizualizace vlivu hodnoty hyperparametru na úspěšnost modelu

8. Zjištění, zda je lepší použít model KNN či LogisticRegression

9. Zjištění, které atributy je nejlepší použít pro trénink modelu

10. Výpočet všech možných variací atributů pro datovou sadu Iris

11. Výpis všech možných variací atributů v datové sadě Iris

12. Skript pro otestování modelu pro všechny možné variace atributů datové sady Iris

13. Porovnání kvality natrénování modelu na grafu

14. Výsledky činnosti skriptů v tabulkové i grafické podobě

15. Skript pro otestování modelu pro všechny možné variace atributů datové sady California Housings

16. Výsledky činnosti skriptu

17. Skript, který nalezne nejlepší variace atributů pro trénink modelu pro datovou sadu California Housings

18. Výsledky: nalezení nejlepší sady atributů pro natrénování modelu

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

20. Odkazy na Internetu

1. Křížová validace modelů v knihovně scikit-learn

V dnešním článku o nástroji scikit-learn úzce navážeme na všechny tři předchozí části. Zabývat se totiž budeme poměrně důležitou problematikou – jakým způsobem vybrat co nejvhodnější model, jak nastavit hyperparametry modelů a jak vlastně zjistit, které atributy se mají použít při tréninku modelu. Tato problematika je obecně dosti komplikovaná, ovšem k dispozici máme jeden velmi užitečný nástroj, který se nazývá křížová validace neboli cross-validation. V dnešním článku si ukážeme základní způsoby použití tohoto nástroje.

Při použití scikit-learn máme k dispozici poměrně velké množství modelů, z nichž je možné (a vlastně i nutné) si vybrat ten nejvhodnější model. Ovšem i když vybereme jeden model, musíme zjistit, jak nastavit jeho hyperparametry a jak rozdělit vstupní datovou sadu na trénovací a testovací část. Většinou se navíc chceme vyvarovat přetrénování modelu, použití příliš složitého modelu (u něj totiž není zřejmé, co se vlastně naučil – chová se jako černá skříňka) a taktéž může nastat situace, kterou jsme viděli minule – model může být pro náhodně vybrané vzorky natrénován korektně a pro jiné vzorky nikoli. Většinou tedy budeme potřebovat model natrénovat hned několikrát (pro různé hyperparametry atd.) a následně zjistit úspěšnost tréninku, například výpočtem průměru dosažených skóre.

2. K-fold validace

V knihovně scikit-learn nalezneme mj. i podporu pro takzvanou K-fold validaci. Při použití této formy validace dojde k rozdělení původní datové sady na K oddílů se stejnou velikostí (pokud to je možné, jinak se mohou velikosti lišit). Tyto oddíly se nazývají folds. Poté je model trénován a testován, přičemž vždy jeden z oddílů (foldů) bude použit pro testování, ostatní oddíly pro trénink – viz též grafická vizualizace. Následně se vypočítá přesnost odpovědí modelů. Celý cyklus výběru oddílu pro testování, trénink modelu, otestování modelu, výpočet skóre se opakuje (typicky 3K krát) a následně se vypočítá průměrná hodnota přesnosti odpovědí modelu. Celý postup je z pohledu programátora realizován funkcí cross_val_score.

Poznámka: většinou se volí K=10, která dává velmi dobré výsledky (není to ani malá, ale ani příliš velká hodnota).

Samotný algoritmus K-foldingu je realizován třídou KFold:

from sklearn.model_selection import KFold
 
help(KFold)

Tato třída je, ostatně jako většina tříd a funkcí ze scikit-learn, poměrně dobře zdokumentována:

Help on class KFold in module sklearn.model_selection._split:
 
class KFold(_BaseKFold)
 |  KFold(n_splits=5, *, shuffle=False, random_state=None)
 |
 |  K-Fold cross-validator.
 |
 |  Provides train/test indices to split data in train/test sets. Split
 |  dataset into k consecutive folds (without shuffling by default).
 |
 |  Each fold is then used once as a validation while the k - 1 remaining
 |  folds form the training set.
 |
 |  Read more in the :ref:`User Guide <k_fold>`.
 |
 |  For visualisation of cross-validation behaviour and
 |  comparison between common scikit-learn split methods
 |  refer to :ref:`sphx_glr_auto_examples_model_selection_plot_cv_indices.py`
 |
 |  Parameters
 |  ----------
 |  n_splits : int, default=5
 |      Number of folds. Must be at least 2.
 |
 |      .. versionchanged:: 0.22
 |          ``n_splits`` default value changed from 3 to 5.
 |
 |  shuffle : bool, default=False
 |      Whether to shuffle the data before splitting into batches.
 |      Note that the samples within each split will not be shuffled.
 |
 |  random_state : int, RandomState instance or None, default=None
 |      When `shuffle` is True, `random_state` affects the ordering of the
 |      indices, which controls the randomness of each fold. Otherwise, this
 |      parameter has no effect.
 |      Pass an int for reproducible output across multiple function calls.
 |      See :term:`Glossary <random_state>`.

3. Ukázka činnosti rozdělení datové sady na oddíly (foldy)

V některé dokumentaci a knihách se setkáte s dnes již nepodporovaným způsobem použití algoritmu K-fold. Uvádím ho zde jen kvůli úplnosti, ale nejedná se o kód, který je nekompatibilní s novějšími verzemi scikit-learnu:

# puvodni zpusob pouziti tridy KFold
 
from sklearn.cross_validation import KFold
kf = KFold(20, n_fonds=5, shuffle=False)
 
# iteration   training set   testing set
for iteration, data in enumerate(kf, start=1)
    print(iteration, data[0], data[1])

Podívejme se na způsob, který je podporován. Budeme chtít rozdělit datovou sadu s deseti hodnotami (záznamy) do celkem pěti oddílů (foldů) a následně projdeme všemi kombinacemi [trénovací oddíl + testovací oddíly], které budou algoritmem K-foldu vygenerovány:

import numpy as np
from sklearn.model_selection import KFold
 
k_fold = KFold(n_splits=5, shuffle=False)
 
print(k_fold)
 
X = 1000 * np.linspace(1, 10, 10)
print(f"Original X: {X}")
 
for i, (train_index, test_index) in enumerate(k_fold.split(X)):
    print(f"Fold {i}:")
    print(f"  Train: index={train_index}")
    print(f"  Test:  index={test_index}")

Výsledek získaný po spuštění tohoto skriptu bude vypadat následovně:

KFold(n_splits=5, random_state=None, shuffle=False)
Original X: [ 1000.  2000.  3000.  4000.  5000.  6000.  7000.  8000.  9000. 10000.]
Fold 0:
  Train: index=[2 3 4 5 6 7 8 9]
  Test:  index=[0 1]
Fold 1:
  Train: index=[0 1 4 5 6 7 8 9]
  Test:  index=[2 3]
Fold 2:
  Train: index=[0 1 2 3 6 7 8 9]
  Test:  index=[4 5]
Fold 3:
  Train: index=[0 1 2 3 4 5 8 9]
  Test:  index=[6 7]
Fold 4:
  Train: index=[0 1 2 3 4 5 6 7]
  Test:  index=[8 9]

Povšimněte si, že vůbec nezáleží na obsahu vstupní datové sady, pouze na počtu záznamů. Dále je vytvořeno celkem pět oddílů obsahujících nikoli přímo hodnoty z datové sady, ale „pouze“ jejich indexy. Jedná se o oddíly, z nichž každý obsahuje 10/5=2 indexy: [0, 1], [2 3], [4, 5], [6, 7] a [8, 9]. A v posledním kroku se zobrazí indexy záznamů použitých pro trénink (vždy osm) a indexy záznamů použitých pro testování (vždy jen dva).

V některých případech není možné, aby měly všechny oddíly stejný počet prvků (resp. indexů), což si můžeme ukázat při pokusu o rozdělení deseti prvků na tři oddíly:

import numpy as np
from sklearn.model_selection import KFold
 
k_fold = KFold(n_splits=3, shuffle=False)
 
print(k_fold)
 
X = 1000 * np.linspace(1, 10, 10)
print(f"Original X: {X}")
 
for i, (train_index, test_index) in enumerate(k_fold.split(X)):
    print(f"Fold {i}:")
    print(f"  Train: index={train_index}")
    print(f"  Test:  index={test_index}")

V tomto případě má první oddíl více prvků, než ostatní dva oddíly:

KFold(n_splits=3, random_state=None, shuffle=False)
Original X: [ 1000.  2000.  3000.  4000.  5000.  6000.  7000.  8000.  9000. 10000.]
Fold 0:
  Train: index=[4 5 6 7 8 9]
  Test:  index=[0 1 2 3]
Fold 1:
  Train: index=[0 1 2 3 7 8 9]
  Test:  index=[4 5 6]
Fold 2:
  Train: index=[0 1 2 3 4 5 6]
  Test:  index=[7 8 9]

4. Výběr prvků do trénovací a testovací datové sady na základě algoritmu K-fold

Vzhledem k tomu, že algoritmus K-foldu generuje vektory indexů a nikoli přímo záznamů z původní datové sady, můžeme v případě potřeby tento další krok realizovat vlastními silami. Je to vlastně velmi jednoduché, a to z toho důvodu, že ze záznamů z datové sady můžeme provést vícenásobný výběr tak, že namísto jediného indexu (ten by vybral n-tý záznam) použijeme vektor indexů, což je funkcionalita nabízená n-rozměrnými poli knihovny Numpy. Pokud tento vektor bude obsahovat například indexes=[2, 3, 4] provedeme výběr prvků s indexy 2, 3 a 4 takto:

X[indexes]

Jak tedy bude celý postup probíhat v případě vstupní datové sady obsahující hodnoty 1000, 2000, … 10000?:

import numpy as np
from sklearn.model_selection import KFold
 
k_fold = KFold(n_splits=3, shuffle=False)
 
print(k_fold)
 
X = 1000 * np.linspace(1, 10, 10)
print(f"Original X: {X}")
 
for i, (train_index, test_index) in enumerate(k_fold.split(X)):
    print(f"Fold {i}:")
    print(f"  Train data: index={X[train_index]}")
    print(f"  Test data:  index={X[test_index]}")

Výsledky mohou vypadat následovně (požadovali jsme rozdělení do tří oddílů):

KFold(n_splits=3, random_state=None, shuffle=False)
Original X: [ 1000.  2000.  3000.  4000.  5000.  6000.  7000.  8000.  9000. 10000.]
Fold 0:
  Train data: index=[ 5000.  6000.  7000.  8000.  9000. 10000.]
  Test data:  index=[1000. 2000. 3000. 4000.]
Fold 1:
  Train data: index=[ 1000.  2000.  3000.  4000.  8000.  9000. 10000.]
  Test data:  index=[5000. 6000. 7000.]
Fold 2:
  Train data: index=[1000. 2000. 3000. 4000. 5000. 6000. 7000.]
  Test data:  index=[ 8000.  9000. 10000.]

5. Křížová validace KNN modelu pro datovou sadu Iris

Nyní již do jisté míry známe teorii, která se za křížovou validací skrývá, takže se podívejme na první ze způsobů jejího praktického použití. Zjistíme úspěšnost modelu KNN (KNeighborsClassifier) pro K=5 (pozor, toto K nemá nic společného s K-foldy, je to jen čistě náhodou stejný symbol, který dokonale mate). Jak budeme postupovat? Nejdříve vytvoříme instanci modelu s nastavením jeho hyperparametrů (tedy K=5) a následně využijeme funkci cross_val_score pro automatické rozdělení datové sady do K-foldů, opakovaný trénink modelu, opakované vyhodnocení modelu atd. atd. – vše je provedeno za nás, takže tyto části nemusíme programovat. Následně jen vypíšeme zjištěná skóre (čím vyšší, tím lepší) a vypočteme jejich průměr:

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
 
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
# konstrukce klasifikatoru
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print("Scores:")
for i, score in enumerate(scores):
    print(i, score)
 
# prumer skore
print()
print("Average score:", scores.mean())
 
# search for an optimal value of K for KNN
k_range = list(range(1, 31))
k_scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
    k_scores.append(scores.mean())
print(k_scores)

Výsledky mohou vypadat následovně (je z nich patrné, že někdy byl model více úspěšný a někdy méně, to ovšem u tak malé datové sady není překvapující):

Scores:
0 1.0
1 0.9333333333333333
2 1.0
3 1.0
4 0.8666666666666667
5 0.9333333333333333
6 0.9333333333333333
7 1.0
8 1.0
9 1.0

Průměrné skóre modelu pro K=5 (tedy pět sousedů):

Average score: 0.9666666666666668

Následně zjistíme průměrná skóre pro K=1 až K=31, tedy v případě, kdy měníme hyperparametry modelu:

[0.96, 0.9533333333333334, 0.9666666666666666, 0.9666666666666666,
0.9666666666666668, 0.9666666666666668, 0.9666666666666668, 0.9666666666666668,
0.9733333333333334, 0.9666666666666668, 0.9666666666666668, 0.9733333333333334,
0.9800000000000001, 0.9733333333333334, 0.9733333333333334, 0.9733333333333334,
0.9733333333333334, 0.9800000000000001, 0.9733333333333334, 0.9800000000000001,
0.9666666666666666, 0.9666666666666666, 0.9733333333333334, 0.96,
0.9666666666666666, 0.96, 0.9666666666666666, 0.9533333333333334,
0.9533333333333334, 0.9533333333333334]

6. Nalezení ideální hodnoty hyperparametru pro KNN model

Velmi jednoduše lze nalézt ideální hodnotu hyperparametru K (tedy počtu sousedů) pro KNN model, a to jen nepatrnou úpravou předchozího skriptu. S využitím křížové validace budeme trénovat a testovat model pro K=1 až K=50 a zapamatujeme si to K, pro které bylo výsledné skóre nejlepší. A jak bude z výsledků patrné, zdaleka neplatí, že čím vyšší K (tedy čím „složitější“ model) použijeme, tím lépe bude odpovídat. Naopak – větší K znamená i vyšší riziko přeučení modelu:

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
 
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
best_score = 0
best_index = -1
 
# hledani optimalniho poctu regionu pro KNN
for k in range(1, 50):
    # konstrukce klasifikatoru
    knn = KNeighborsClassifier(n_neighbors=k)
 
    # vypocet skore
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
 
    avg_score = scores.mean()
 
    # dosahli jsme lepsiho ohodnoceni?
    if avg_score > best_score:
        best_index = k
        best_score = avg_score
 
    # vypsani prumerneho skore do tabulky
    print(k, avg_score)
 
print()
print(f"Best score {best_score} for K={best_index}")

Vypočtené a vypsané výsledky:

1 0.96
2 0.9533333333333334
3 0.9666666666666666
4 0.9666666666666666
5 0.9666666666666668
6 0.9666666666666668
7 0.9666666666666668
8 0.9666666666666668
9 0.9733333333333334
10 0.9666666666666668
11 0.9666666666666668
12 0.9733333333333334
13 0.9800000000000001
14 0.9733333333333334
15 0.9733333333333334
16 0.9733333333333334
17 0.9733333333333334
18 0.9800000000000001
19 0.9733333333333334
20 0.9800000000000001
21 0.9666666666666666
22 0.9666666666666666
23 0.9733333333333334
24 0.96
25 0.9666666666666666
26 0.96
27 0.9666666666666666
28 0.9533333333333334
29 0.9533333333333334
30 0.9533333333333334
31 0.9466666666666667
32 0.9466666666666667
33 0.9466666666666667
34 0.9466666666666667
35 0.9466666666666667
36 0.9466666666666667
37 0.9466666666666667
38 0.9466666666666667
39 0.9533333333333334
40 0.9533333333333334
41 0.9533333333333334
42 0.9533333333333334
43 0.9466666666666667
44 0.9400000000000001
45 0.9333333333333333
46 0.9333333333333333
47 0.9333333333333333
48 0.9333333333333333
49 0.9400000000000001

Následně se vypíše nejlepší hodnota hyperparametru modelu, což je konkrétně hodnota K=13. Model zde dosahuje úspěšnosti téměř 99%:

Best score 0.9800000000000001 for K=13

7. Grafická vizualizace vlivu hodnoty hyperparametru na úspěšnost modelu

Při postupné změně nějakého hyperparametru má většinou grafický průběh s přesností/úspěšností modelu tvar obráceného písmena U, tj. typicky zde nalezneme nějakou hodnotu, pro niž má model nejlepší předpovědi. Pokusme se tedy předchozí skript nepatrně vylepšit: dosažené skóre modelu si necháme vizualizovat, opět (prozatím) s využitím základní knihovny Matplotlib. A předpokládáme přitom, že pro K=13 bude v grafu maximum (nikoli lokální, ale globální):

import matplotlib.pyplot as plt
 
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
 
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
avg_scores = []
 
r = range(1, 70)
 
# hledani optimalniho poctu regionu pro KNN
for k in r:
    # konstrukce klasifikatoru
    knn = KNeighborsClassifier(n_neighbors=k)
 
    # vypocet skore
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
 
    avg_score = scores.mean()
 
    # vypsani prumerneho skore do tabulky
    print(k, avg_score)
 
    avg_scores.append(avg_score)
 
plt.plot(r, avg_scores)
plt.xlabel("Změna K pro KNN")
plt.ylabel("Přesnost modelu")
 
# ulozeni grafu do souboru
plt.savefig("105.png")
 
# vykresleni grafu na obrazovku
plt.show()

Vypočtený a zobrazený výsledek by měl vypadat následovně:

Obrázek 1: Graf s přibližným tvarem obráceného U s maximem pro K=13 (což není v tak malém rozlišení příliš patrné).

8. Zjištění, zda je lepší použít model KNN či LogisticRegression

Křížovou validaci můžeme použít i pro zjištění, který z dostupných modelů použít. Již v předchozích článcích jsme podobnou úlohu řešili, a to „ručními“ výpočty:

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
 
# nacteni datove sady
iris = load_iris()
 
 
# konstrukce klasifikatoru
# (s hyperparametrem)
knn_1_classifier = KNeighborsClassifier(n_neighbors=1)
knn_2_classifier = KNeighborsClassifier(n_neighbors=5)
lr_classifier_1 = LogisticRegression(max_iter=1)
lr_classifier_2 = LogisticRegression(max_iter=1000)
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
# trening modelu (se vsemi dostupnymi daty)
knn_1_classifier.fit(X, y)
knn_2_classifier.fit(X, y)
lr_classifier_1.fit(X, y)
lr_classifier_2.fit(X, y)
 
 
def score(model):
    # očekávané výsledky
    expexted_labels = iris.target
 
    # výsledky modelu (predikované výsledky)
    predicted_labels = model.predict(iris.data)
 
    # jak je náš model úspěšný?
    total = 0
    same = 0
 
    # porovnání predikce s očekáváním
    for (expected, predicted) in zip(expexted_labels, predicted_labels):
        if expected==predicted:
            same+=1
        total+=1
    return 100.0*same/total
 
 
print(f"KNN classifier with K=1:               {score(knn_1_classifier):5.2f}%")
print(f"KNN classifier with K=5:               {score(knn_2_classifier):5.2f}%")
print(f"LogisticRegression with max_iter=1:    {score(lr_classifier_1):5.2f}%")
print(f"LogisticRegression with max_iter=1000: {score(lr_classifier_2):5.2f}%")

Mnohem kratší (a přesnější!) je využití křížové validace a funkce cross_val_score:

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
iris = load_iris()
 
 
# konstrukce klasifikatoru
# (s hyperparametrem)
knn_1_classifier = KNeighborsClassifier(n_neighbors=1)
knn_2_classifier = KNeighborsClassifier(n_neighbors=5)
lr_classifier_1 = LogisticRegression(max_iter=1)
lr_classifier_2 = LogisticRegression(max_iter=1000)
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
 
def score(model):
    scores = cross_val_score(model, X, y, cv=10, scoring='accuracy')
    return scores.mean()
 
 
print(f"KNN classifier with K=1:               {score(knn_1_classifier):5.2f}%")
print(f"KNN classifier with K=5:               {score(knn_2_classifier):5.2f}%")
print(f"LogisticRegression with max_iter=1:    {score(lr_classifier_1):5.2f}%")
print(f"LogisticRegression with max_iter=1000: {score(lr_classifier_2):5.2f}%")

Výsledky by měly vypadat následovně:

KNN classifier with K=1:                0.96%
KNN classifier with K=5:                0.97%
LogisticRegression with max_iter=1:     0.33%
LogisticRegression with max_iter=1000:  0.97%
Poznámka: již víme, že ještě lepšího skóre dosáhneme u KNN modelu pro K=13.

9. Zjištění, které atributy je nejlepší použít pro trénink modelu

Křížovou validaci je možné využít mnoha různými způsoby. Například můžeme zjistit, jakou kombinaci atributů je nejlepší použít pro natrénování modelu – může se totiž stát, že některé atributy způsobí, že model bude natrénován hůře, než v případě, že tento atribut či atributy vůbec nepoužijeme. Nejprve tedy musíme získat všechny možné variace atributů. Pro n atributů je těchto variací 2n-1, což například pro datovou sadu Iris znamená patnáct variací.

10. Výpočet všech možných variací atributů pro datovou sadu Iris

Jedno z možných řešení výpočtů všech variací je ukázáno v následujícím skriptu, který nejprve vypočte hodnotu 1..2n a tu následně použije jako bitovou masku určující, které atributy se mají v dané iteraci použít a které nikoli (ovšem možných řešení existuje celá řada):

import numpy as np
from sklearn.datasets import load_iris
 
# nacteni datove sady
iris = load_iris()
 
feature_names = np.array(iris.feature_names)
 
print("n", "selectors", "features")
 
for i in range(1, 2**len(feature_names)):
    indexes = []
    n = i
    for j in range(len(feature_names)):
        if n % 2 == 1:
            indexes.append(j)
        n //= 2
    selectors = np.array(indexes, dtype=int)
    print(i, selectors, feature_names[selectors])

11. Výpis všech možných variací atributů v datové sadě Iris

Podívejme se nyní na to, jak může vypadat výsledek činnosti skriptu, jehož úplný zdrojový kód byl uveden v předchozí kapitole. Celkem se vypíše všech patnáct možných variací, protože jsme vynechali variantu, v níž není použit žádný atribut. Taková varianta nemá v praxi žádný význam:

n selectors features
1  [0]        ['sepal length (cm)']
2  [1]        ['sepal width (cm)']
3  [0 1]      ['sepal length (cm)' 'sepal width (cm)']
4  [2]        ['petal length (cm)']
5  [0 2]      ['sepal length (cm)' 'petal length (cm)']
6  [1 2]      ['sepal width (cm)' 'petal length (cm)']
7  [0 1 2]    ['sepal length (cm)' 'sepal width (cm)' 'petal length (cm)']
8  [3]        ['petal width (cm)']
9  [0 3]      ['sepal length (cm)' 'petal width (cm)']
10 [1 3]      ['sepal width (cm)' 'petal width (cm)']
11 [0 1 3]    ['sepal length (cm)' 'sepal width (cm)' 'petal width (cm)']
12 [2 3]      ['petal length (cm)' 'petal width (cm)']
13 [0 2 3]    ['sepal length (cm)' 'petal length (cm)' 'petal width (cm)']
14 [1 2 3]    ['sepal width (cm)' 'petal length (cm)' 'petal width (cm)']
15 [0 1 2 3]  ['sepal length (cm)' 'sepal width (cm)' 'petal length (cm)' 'petal width (cm)']

12. Skript pro otestování modelu pro všechny možné variace atributů datové sady Iris

Nyní již máme k dispozici všechny informace potřebné pro otestování modelu pro všechny možné variace atributů vstupní datové sady (použité částečně pro trénink a částečně pro otestování). Nejprve využijeme datovou sadu Iris se čtyřmi atributy. Model je tedy možné natrénovat s využitím patnácti variací těchto atributů (viz předchozí kapitolu). Necháme si tedy postupně vygenerovat všechny variace těchto atributů a pro každou variaci spustíme křížovou validaci modelu. Výsledkem bude tabulka s patnácti řádky obsahující vždy názvy všech použitých atributů a dosažený průměr přesnosti modelu:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
feature_names = np.array(iris.feature_names)
 
print("n", "selectors", "features")
 
for i in range(1, 2**len(feature_names)):
    indexes = []
    n = i
    for j in range(len(feature_names)):
        if n % 2 == 1:
            indexes.append(j)
        n //= 2
    selectors = np.array(indexes, dtype=int)
    knn_classifier = KNeighborsClassifier(n_neighbors=5)
    selected_features = X[:, selectors]
    scores = cross_val_score(knn_classifier, selected_features, y, cv=10, scoring='accuracy')
    print(i, selectors, feature_names[selectors], scores.mean())

13. Porovnání kvality natrénování modelu na grafu

V případě, že je variací větší množství, je výhodnější porovnání výsledků modelu na grafu. V tomto případě použijeme sloupcový graf, který lze vygenerovat skriptem, jenž se do značné míry podobá skriptu z předchozí kapitoly, pouze je dopsáno vykreslení grafu a nastavení jeho atributů:

import matplotlib.pyplot as plt
 
import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
iris = load_iris()
 
# X je matice (feature matrix)
X = iris.data
 
# y je vektor (response vector)
y = iris.target
 
feature_names = np.array(iris.feature_names)
 
print("n", "selectors", "features")
 
attributes = []
final_scores = []
 
for i in range(1, 2**len(feature_names)):
    indexes = []
    n = i
    for j in range(len(feature_names)):
        if n % 2 == 1:
            indexes.append(j)
        n //= 2
    selectors = np.array(indexes, dtype=int)
    knn_classifier = KNeighborsClassifier(n_neighbors=5)
    selected_features = X[:, selectors]
    scores = cross_val_score(knn_classifier, selected_features, y, cv=10, scoring='accuracy')
    attributes.append("\n".join(feature_names[selectors]))
    avg_score = scores.mean()
    final_scores.append(avg_score)
    print(i, selectors, feature_names[selectors], avg_score)
 
fig = plt.figure()
fig.set_figwidth(14)
fig.set_figheight(6)
fig.subplots_adjust(bottom=0.3)
 
plt.bar(attributes, final_scores)
plt.xticks(rotation=90)
plt.xlabel("Atributy")
plt.ylabel("Přesnost modelu")
 
# ulozeni grafu do souboru
plt.savefig("111.png")
 
# vykresleni grafu na obrazovku
plt.show()

14. Výsledky činnosti skriptů v tabulkové i grafické podobě

Nejprve se podívejme na tabulku vypsanou předchozími skripty a jen nepatrně upravenou pro vyšší čitelnost:

n selectors    features                                                    average score
1   [0]       ['sepal length (cm)']                                        0.6533333333333333
2   [1]       ['sepal width (cm)']                                         0.5199999999999999
3   [0 1]     ['sepal length (cm)' 'sepal width (cm)']                     0.76
4   [2]       ['petal length (cm)']                                        0.9533333333333334
5   [0 2]     ['sepal length (cm)' 'petal length (cm)']                    0.9400000000000001
6   [1 2]     ['sepal width (cm)' 'petal length (cm)']                     0.9533333333333334
7   [0 1 2]   ['sepal length (cm)' 'sepal width (cm)' 'petal length (cm)'] 0.9466666666666667
8   [3]       ['petal width (cm)']                                         0.96
9   [0 3]     ['sepal length (cm)' 'petal width (cm)']                     0.96
10  [1 3]     ['sepal width (cm)' 'petal width (cm)']                      0.9533333333333334
11  [0 1 3]   ['sepal length (cm)' 'sepal width (cm)' 'petal width (cm)']  0.9533333333333334
12  [2 3]     ['petal length (cm)' 'petal width (cm)']                     0.9666666666666666
13  [0 2 3]   ['sepal length (cm)' 'petal length (cm)' 'petal width (cm)'] 0.96
14  [1 2 3]   ['sepal width (cm)' 'petal length (cm)' 'petal width (cm)']  0.9666666666666668
15  [0 1 2 3] ['sepal length (cm)' 'sepal width (cm)' 'petal length (cm)' 'petal width (cm)'] 0.9666666666666668
Poznámka: je zajímavé, jak malý vliv mají některé atributy pro trénink modelu. To plyne z jeho jednoduchosti.

Grafická podoba výsledků vypadá takto:

Obrázek 2: Vliv výběru atributů pro trénink modelu na jeho přesnost.

15. Skript pro otestování modelu pro všechny možné variace atributů datové sady California Housings

Prakticky stejným způsobem, jakým jsme zjistili, které variace atributů je vhodné použít pro natrénování modelu daty z datové sady Iris, můžeme postupovat u datové sady California Housings. Ta má více atributů (osm namísto čtyř) a navíc odhadujeme cenu, takže použijeme model pro provedení regrese a nikoli klasifikace. Ovšem důležitější změnou je odlišné otestování modelu, protože nyní použijeme metodu pro výpočet MSE (tedy střední kvadratické chyby). Při výpočtu se vrací záporná hodnota, protože čím větší je MSE, tím je model hůře natrénován a většina postupů se snaží o vyhledání maximální hodnoty (tedy vlastně v tomto případě nejmenší chyby):

import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# X je matice (feature matrix)
X = housings.data
 
# y je vektor (response vector)
y = housings.target
 
feature_names = np.array(housings.feature_names)
 
print("n", "selectors", "features")
 
for i in range(1, 2**len(feature_names)):
    indexes = []
    n = i
    for j in range(len(feature_names)):
        if n % 2 == 1:
            indexes.append(j)
        n //= 2
    selectors = np.array(indexes, dtype=int)
    # konstrukce modelu
    lr = linear_model.LinearRegression()
    selected_features = X[:, selectors]
    scores = -cross_val_score(lr, selected_features, y, cv=10, scoring='neg_mean_squared_error')
    print(i, selectors, feature_names[selectors], scores.mean())

Alternativně můžeme počítat r2_score namísto MSE:

import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# X je matice (feature matrix)
X = housings.data
 
# y je vektor (response vector)
y = housings.target
 
feature_names = np.array(housings.feature_names)
 
print("n", "selectors", "features")
 
for i in range(1, 2**len(feature_names)):
    indexes = []
    n = i
    for j in range(len(feature_names)):
        if n % 2 == 1:
            indexes.append(j)
        n //= 2
    selectors = np.array(indexes, dtype=int)
    # konstrukce modelu
    lr = linear_model.LinearRegression()
    selected_features = X[:, selectors]
    scores = -cross_val_score(lr, selected_features, y, cv=10, scoring='r2')
    print(i, selectors, feature_names[selectors], scores.mean())

16. Výsledky činnosti skriptu

Pokud skript z předchozí kapitoly spustíme, měl by se model postupně natrénovat se všemi možnými variacemi atributů (tedy „sloupců“). Pro trénink a otestování modelu se používá nám již známá technika křížové validace s využitím K-fold a s ohodnocením toho, jak dobře či naopak špatně byl model natrénován. Vzhledem k tomu, že datová sada California Housings má osm atributů, bude model natrénován 255× a výsledky by měly vypadat zhruba následovně:

n selectors features
1 [0] ['MedInc'] 0.7264558762632901
2 [1] ['HouseAge'] 1.3722534258632304
3 [0 1] ['MedInc' 'HouseAge'] 0.67769950759471
4 [2] ['AveRooms'] 1.3648838707766504
5 [0 2] ['MedInc' 'AveRooms'] 0.7278034142338758
6 [1 2] ['HouseAge' 'AveRooms'] 1.35356204264345
...
...
...
 'Longitude'] 0.5634932212002323
248 [3 4 5 6 7] ['AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 1.0375854748138316
249 [0 3 4 5 6 7] ['MedInc' 'AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 0.5697840889091118
250 [1 3 4 5 6 7] ['HouseAge' 'AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 1.0446449942331266
251 [0 1 3 4 5 6 7] ['MedInc' 'HouseAge' 'AveBedrms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.559583975584127
252 [2 3 4 5 6 7] ['AveRooms' 'AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 0.8464478540402298
253 [0 2 3 4 5 6 7] ['MedInc' 'AveRooms' 'AveBedrms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.5609103612635253
254 [1 2 3 4 5 6 7] ['HouseAge' 'AveRooms' 'AveBedrms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.851004133606707
255 [0 1 2 3 4 5 6 7] ['MedInc' 'HouseAge' 'AveRooms' 'AveBedrms' 'Population' 'AveOccup'
 'Latitude' 'Longitude'] 0.5509524296956632

17. Skript, který nalezne nejlepší variace atributů pro trénink modelu pro datovou sadu California Housings

Nyní si ukažme skript, jenž otestuje, která z 255 možných variací atributů datové sady California Housings je nejvýhodnější pro trénink modelu provádějícího lineární regresi (tedy vlastně toho nejjednoduššího modelu vůbec). Skript je založen na předchozím příkladu, ovšem nyní dokáže nalézt nejlepší skóre s odpovídající zvolenou variací atributů:

import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
 
# nacteni datove sady
housings = fetch_california_housing()
 
# X je matice (feature matrix)
X = housings.data
 
# y je vektor (response vector)
y = housings.target
 
feature_names = np.array(housings.feature_names)
 
print("n", "selectors", "features")
 
best_score = -1e10
best_selectors = []
 
for i in range(1, 2**len(feature_names)):
    indexes = []
    n = i
    for j in range(len(feature_names)):
        if n % 2 == 1:
            indexes.append(j)
        n //= 2
    selectors = np.array(indexes, dtype=int)
    # konstrukce modelu
    lr = linear_model.LinearRegression()
    selected_features = X[:, selectors]
    scores = cross_val_score(lr, selected_features, y, cv=10, scoring='r2')
    avg_scores = scores.mean()
    if avg_scores > best_score:
        best_score = avg_scores
        best_selectors = selectors
    print(i, selectors, feature_names[selectors], avg_scores)
 
print()
print("Best score:", best_score)
print("With features", feature_names[best_selectors])

18. Výsledky: nalezení nejlepší sady atributů pro natrénování modelu

Po spuštění skriptu popsaného v předchozí kapitole by se měl trénink a ověření modelu spustit s 255 možnými variacemi atributů, které budou použity. Průběžně se sleduje i chyba odhadu modelu a následně se vybere taková variace atributů, která model natrénuje nejlépe:

n selectors features
1 [0] ['MedInc'] 0.3483800124754965
2 [1] ['HouseAge'] -0.2676224311757101
3 [0 1] ['MedInc' 'HouseAge'] 0.3895907438613606
4 [2] ['AveRooms'] -0.2614288891724069
5 [0 2] ['MedInc' 'AveRooms'] 0.34491558678359774
6 [1 2] ['HouseAge' 'AveRooms'] -0.2553626424315237
7 [0 1 2] ['MedInc' 'HouseAge' 'AveRooms'] 0.3866358153843511
8 [3] ['AveBedrms'] -0.2734471504229889
9 [0 3] ['MedInc' 'AveBedrms'] 0.3480449795351417
10 [1 3] ['HouseAge' 'AveBedrms'] -0.2682477414184001
...
...
...
247 [0 1 2 4 5 6 7] ['MedInc' 'HouseAge' 'AveRooms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.503734153650471
248 [3 4 5 6 7] ['AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 0.06304487614251124
249 [0 3 4 5 6 7] ['MedInc' 'AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 0.5005616909146572
250 [1 3 4 5 6 7] ['HouseAge' 'AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 0.05875309913453884
251 [0 1 3 4 5 6 7] ['MedInc' 'HouseAge' 'AveBedrms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.5059557816071801
252 [2 3 4 5 6 7] ['AveRooms' 'AveBedrms' 'Population' 'AveOccup' 'Latitude' 'Longitude'] 0.253637001880857
253 [0 2 3 4 5 6 7] ['MedInc' 'AveRooms' 'AveBedrms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.5052686713242268
254 [1 2 3 4 5 6 7] ['HouseAge' 'AveRooms' 'AveBedrms' 'Population' 'AveOccup' 'Latitude'
 'Longitude'] 0.24749723159992967
255 [0 1 2 3 4 5 6 7] ['MedInc' 'HouseAge' 'AveRooms' 'AveBedrms' 'Population' 'AveOccup'
 'Latitude' 'Longitude'] 0.5110068610523775

Nejlepší je kombinace sedmi atributů (s vynecháním atributu Population), což je ostatně patrné i z následujícího výpisu:

CS24 tip temata

Best score: 0.5115316995802758
With features ['MedInc' 'HouseAge' 'AveRooms' 'AveBedrms' 'AveOccup' 'Latitude' 'Longitude']
Poznámka: podobný výsledek jsme už získali minule, kdy jsme ovšem odstraňovali vždy jen jediný atribut a neprováděla se korektní křížová validace. I přesto však vedlo odstranění atributu Population k nejmenší chybě a největšímu skóre:
Ignored attribute   MSE r2 score
MedInc              0.805   0.392
HouseAge            0.535   0.601
AveRooms            0.536   0.596
AveBedrms           0.541   0.598
Population          0.525   0.605
AveOccup            0.539   0.596
Latitude            0.617   0.535
Longitude           0.619   0.538

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

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/

Autor článku

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