Balíček scikit-learn: trénink a předpovědi modelů provádějících regresní analýzu

22. 8. 2024
Doba čtení: 39 minut

Sdílet

 Autor: Depositphotos
Dokončíme popis problematiky modelů provádějících regresní analýzu. Ukážeme si, jak tyto modely natrénovat, jak zjistit, které atributy způsobují špatné předpovědi modelu i to, jak zjistit atributy způsobující nestabilitu předpovědí.

Obsah

1. Balíček scikit-learn: trénink a předpovědi modelů provádějících regresní analýzu

2. Polynomická regrese nad údaji o souřadnicích bloků

3. Polynomická regrese s údaji, v nichž se vyskytují extrémní hodnoty

4. Preprocessing a filtering dat: odstranění mezních případů

5. Trénink modelu provádějícího regresní analýzu

6. Ukázka natrénování a predikce modelu s využitím všech dostupných údajů

7. Rozdělení dat na tréninkovou a testovací část

8. Ukázka natrénování a predikce modelu po rozdělení dat

9. Trénink modelu s vyloučením určitého atributu nebo atributů

10. Ukázka natrénování a predikce modelu po rozdělení dat a odstranění zvoleného atributu

11. Který atribut či atributy odstranit?

12. Skript, který odstraní vybraný atribut a poté provede otestování modelu s vyjádřením skóre

13. Chování modelu při opakovaném tréninku s náhodně vybranými daty

14. Zjištění, který atribut způsobuje špatné výsledky modelu

15. Graficky znázorněné výsledky měření

16. Výpočet základních statistických údajů o atributech

17. Vypočtené výsledky a identifikace problémových atributů

18. Výsledky získané po normalizaci hodnot

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

20. Odkazy na Internetu

1. Balíček scikit-learn: trénink a předpovědi modelů provádějících regresní analýzu

V dnešním článku o nástroji scikit-learn úzce navážeme na předchozí část. Dnes totiž dokončíme popis problematiky modelů provádějících regresní analýzu, což jsou modely odlišné od modelů provádějících klasifikaci. Nejdříve si ukážeme, jakým způsobem je možné tyto modely natrénovat. Poté si řekneme, jakým způsobem lze zjistit, které atributy způsobují špatné předpovědi modelu i to, jak detekovat ty atributy, které způsobují nestabilitu předpovědí. Jak je v tomto seriálu zvykem, použijeme namísto čistě teoretického popisu množství demonstračních příkladů. Na tento článek posléze navážeme, protože při výběru modelů a nastavování jejich hyperparametrů je většinou nutné ověřit, který model (a parametry) jsou nejlepší. K tomuto účelu se používá takzvaná křížová validace (cross-validaton nebo též jen crossvalidation).

2. Polynomická regrese nad údaji o souřadnicích bloků

Na předchozí článek o modelech provádějících regresní analýzu dnes navážeme. Nejprve si ukážeme, jakým způsobem lze proložit informace o souřadnicích obytných bloků úsečkou nebo nějakým polynomem. Jedná se o postupný přechod ke skutečnému tréninku modelu. Povšimněte si, že hodnoty je potřeba seřadit podle hodnot zobrazených na x-ové ose, protože jinak by docházelo k problémům při zobrazení pospojovaných vrcholů v korelačním diagramu:

import matplotlib.pyplot as plt
 
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
from sklearn.datasets import fetch_california_housing
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# serazeni dat (pro pekne grafy)
data = data[data[:,6].argsort()]
 
FIRST_DIM = 6
SECOND_DIM = 7
 
x = data[:, FIRST_DIM]
y = data[:, SECOND_DIM]
 
for degree in range(1, 11):
    # konstrukce modelu
    pr = linear_model.LinearRegression()
 
    poly = PolynomialFeatures(degree=degree)
 
    poly_features = poly.fit_transform(x.reshape(-1, 1))
 
    # trénink modelu
    pr.fit(poly_features, y)
 
    # predikce modelu
    y_pred = pr.predict(poly_features)
 
    # výpis vypočtených koeficientů modelu
    print("Coefficients: \n", pr.coef_)
    print("Intercept: \n", pr.intercept_)
 
    # vykreslení výsledku
    plt.scatter(x, y, color="black", s=1)
    plt.plot(x, y_pred, color="blue", linewidth=2)
 
    # titulek grafu
    plt.title(f"Degree={degree}")
 
    # osy
    plt.xlabel(housings.feature_names[FIRST_DIM])
    plt.ylabel(housings.feature_names[SECOND_DIM])
    plt.xticks(())
    plt.yticks(())
 
    # ulozeni diagramu do souboru
    plt.savefig(f"84_{degree}.png")
 
    # zobrazeni diagramu
    plt.show()

Výsledné proložení bude vypadat následovně:

Obrázek 1: Polynom stupně 1 – úsečka.

Obrázek 2: Polynom stupně 2.

Obrázek 3: Polynom stupně 3.

Obrázek 4: Polynom stupně 4.

Obrázek 5: Polynom stupně 5.

Obrázek 6: Polynom stupně 6.

Obrázek 7: Polynom stupně 7.

Obrázek 8: Polynom stupně 8.

Obrázek 9: Polynom stupně 9.

Obrázek 10: Polynom stupně 10.

3. Polynomická regrese s údaji, v nichž se vyskytují extrémní hodnoty

Pokusme se nyní demonstrační příklad z úvodní kapitoly nepatrně poupravit, a to tak, že budeme polynomem n-tého stupně prokládat body představující vztah mezi počtem místností v bloku a počtem ložnic. Zdánlivě se jedná o triviální úlohu, ovšem (jak ještě uvidíme dále), mají některé bloky významně větší množství místností, než většina ostatních bloků a proto máme pro tyto extrémní případy jen malé množství hodnot. Výsledky nebudou dokonalé, o čemž se lze velmi snadno přesvědčit:

import matplotlib.pyplot as plt
 
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
from sklearn.datasets import fetch_california_housing
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# serazeni dat (pro pekne grafy)
data = data[data[:,2].argsort()]
 
FIRST_DIM = 2
SECOND_DIM = 3
 
x = data[:, FIRST_DIM]
y = data[:, SECOND_DIM]
 
for degree in range(1, 11):
    # konstrukce modelu
    pr = linear_model.LinearRegression()
 
    poly = PolynomialFeatures(degree=degree)
 
    poly_features = poly.fit_transform(x.reshape(-1, 1))
 
    # trénink modelu
    pr.fit(poly_features, y)
 
    # predikce modelu
    y_pred = pr.predict(poly_features)
 
    # výpis vypočtených koeficientů modelu
    print("Coefficients: \n", pr.coef_)
    print("Intercept: \n", pr.intercept_)
 
    # vykreslení výsledku
    plt.scatter(x, y, color="black", s=1)
    plt.plot(x, y_pred, color="blue", linewidth=2)
 
    # titulek grafu
    plt.title(f"Degree={degree}")
 
    # osy
    plt.xlabel(housings.feature_names[FIRST_DIM])
    plt.ylabel(housings.feature_names[SECOND_DIM])
    plt.xticks(())
    plt.yticks(())
 
    # ulozeni diagramu do souboru
    plt.savefig(f"84_{degree}.png")
 
    # zobrazeni diagramu
    plt.show()

A takto vypadají vypočtené výsledky. Je z nich patrné, že pro oblast v pravém horním rohu máme k dispozici tak málo hodnot, že proložení nebude příliš úspěšné:

Obrázek 11: Polynom stupně 1 – úsečka.

Obrázek 12: Polynom stupně 2.

Obrázek 13: Polynom stupně 3.

Obrázek 14: Polynom stupně 4.

Obrázek 15: Polynom stupně 5.

Obrázek 16: Polynom stupně 6.

Obrázek 17: Polynom stupně 7.

Obrázek 18: Polynom stupně 8.

Obrázek 19: Polynom stupně 9.

Obrázek 20: Polynom stupně 10.

4. Preprocessing a filtering dat: odstranění mezních případů

V některých případech, což může být konkrétně právě problém s hodnotami místností (a ložnic) v obytných blocích, může být výhodné provést nějakou formu preprocessingu a filteringu dat. Pomoci nám může přímo nástroj scikit-learn, ovšem pokusme se o filtering sami. Bude to prozatím velmi jednoduché, protože odstraníme 30 posledních hodnot (po jejich seřazení), což právě představuje ony mezní případy. Otázkou zůstává, jestli je zvolená hodnota 30 ideální, příliš malá nebo naopak příliš velká. To nám do určité míry napoví grafy:

import matplotlib.pyplot as plt
 
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
from sklearn.datasets import fetch_california_housing
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
# urcenych pro trenink, validaci atd.
data = housings["data"]
 
# serazeni dat (pro pekne grafy)
data = data[data[:,2].argsort()]
data = data[:-30]
 
FIRST_DIM = 2
SECOND_DIM = 3
 
x = data[:, FIRST_DIM]
y = data[:, SECOND_DIM]
 
for degree in range(1, 11):
    # konstrukce modelu
    pr = linear_model.LinearRegression()
 
    poly = PolynomialFeatures(degree=degree)
 
    poly_features = poly.fit_transform(x.reshape(-1, 1))
 
    # trénink modelu
    pr.fit(poly_features, y)
 
    # predikce modelu
    y_pred = pr.predict(poly_features)
 
    # výpis vypočtených koeficientů modelu
    print("Coefficients: \n", pr.coef_)
    print("Intercept: \n", pr.intercept_)
 
    # vykreslení výsledku
    plt.scatter(x, y, color="black", s=1)
    plt.plot(x, y_pred, color="blue", linewidth=2)
 
    # titulek grafu
    plt.title(f"Degree={degree}")
 
    # osy
    plt.xlabel(housings.feature_names[FIRST_DIM])
    plt.ylabel(housings.feature_names[SECOND_DIM])
    plt.xticks(())
    plt.yticks(())
 
    # ulozeni diagramu do souboru
    plt.savefig(f"84_{degree}.png")
 
    # zobrazeni diagramu
    plt.show()

Opět se podíváme na výsledné grafy. Z nich jsou patrné dvě věci – korelace v tomto případě není tak zřejmá, jako tomu bylo v úvodní kapitole a odstranění mezních hodnot skutečně částečně pomohlo:

Obrázek 21: Polynom stupně 1 – úsečka.

Obrázek 22: Polynom stupně 2.

Obrázek 23: Polynom stupně 3.

Obrázek 24: Polynom stupně 4.

Obrázek 25: Polynom stupně 5.

Obrázek 26: Polynom stupně 6.

Obrázek 27: Polynom stupně 7.

Obrázek 28: Polynom stupně 8.

Obrázek 29: Polynom stupně 9.

Obrázek 30: Polynom stupně 10.

5. Trénink modelu provádějícího regresní analýzu

Nyní se konečně dostáváme k ústřední části dnešního článku, a to konkrétně k tomu, jakým způsobem lze natrénovat model provádějící regresní analýzu a jak lze zjistit, které atributy jsou pro tento účel vhodné a které naopak nikoli (prakticky vždy je nutné experimentovat a vybrat nějakou rozumnou „střední cestu“). Přípravu na trénink modelu již dobře známe – postačí si připravit n-rozměrné pole s atributy a jednorozměrný vektor s očekávanými výsledky, což je v našem případě cena domů. Tyto údaje jsou dostupné v původní datové sadě, takže:

# 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"]

Jak je zvykem, pojmenujeme matici s atributy X (velké písmeno) a vektor s očekávanými výsledky se bude jmenovat y (malé písmeno):

# trening bude proveden se VSEMI zaznamy
# testovani taktez (prozatim)
X = data
y = targets

V posledním kroku model natrénujeme a využijeme (alespoň nyní) všechna dostupná data:

# konstrukce modelu
lr = linear_model.LinearRegression()
 
# trénink modelu
lr.fit(X, y)

6. Ukázka natrénování a predikce modelu s využitím všech dostupných údajů

Jak bude vypadat predikce takového modelu, jeho MSE (Mean Squared Error) a vypočtené skóre? To zjistíme velmi snadno, protože již tyto kroky známe:

from sklearn import linear_model
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error, r2_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"]
 
# trening bude proveden se VSEMI zaznamy
# testovani taktez (prozatim)
X = data
y = targets
 
# konstrukce modelu
lr = linear_model.LinearRegression()
 
# trénink modelu
lr.fit(X, y)
 
# predikce modelu
y_pred = lr.predict(X)
 
# výpis vypočtených koeficientů modelu
print("Coefficients: \n", lr.coef_)
print("Intercept: \n", lr.intercept_)
 
# chyba predikce
print("Mean squared error: %.2f" % mean_squared_error(y, y_pred))
 
# 1 = nejlepší predikce modelu
print("Coefficient of determination: %.2f" % r2_score(y, y_pred))

Výsledky budou vypadat následovně:

Coefficients:
 [ 4.36693293e-01  9.43577803e-03 -1.07322041e-01  6.45065694e-01
 -3.97638942e-06 -3.78654265e-03 -4.21314378e-01 -4.34513755e-01]
Intercept:
 -36.94192020718441
Mean squared error: 0.52
Coefficient of determination: 0.61

Jak tyto výsledky interpretovat?

  1. Koeficientů je osm, což je korektní, protože se zpracovává osm atributů a model při tréninku našel osm reálných koeficientů, které mu umožnily proložit všemi atributy vhodný „lineární objekt“ s minimálním MSE (v tomto případě jde vlastně o hyperrovinu v osmidimenzionálním prostoru!).
  2. Posun je roven přibližně –37 jednotkám, takže ona hyperrovina je posunuta (což je ovšem při více rozměrech matoucí, proto je dobré si vynutit vycentrování při tréninku).
  3. Skóre je relativně dobré, ale už vzdálenější od ideální hodnoty 1.0. To znamená, že závislost, kterou jsme se snažili zjistit, není ve skutečnosti čistě lineární, popř. menší přesnost způsobuje nějaký „nelineární“ atribut.

7. Rozdělení dat na tréninkovou a testovací část

Jak již dobře víme, musí být korektní trénink modelu prováděn pouze s částí dat, přičemž zbylá část bude použita pro otestování, jak dobře či špatně byl model natrénován. Celý postup opět dobře známe, takže jen krátce – pro rozdělení dat použijeme funkci train_test_split, které určíme, kolik údajů (relativně) se má použít pro testování; zbytek bude pochopitelně použit pro trénink:

from sklearn.model_selection import train_test_split

Samotné rozdělení dat je snadné:

# rozdeleni dat na treninkovou a testovaci mnozinu
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.6)

Konkrétní rozměry polí pro trénink a testování:

print("Array sizes:")
print(f"x_train: {len(X_train)}")
print(f"y_train: {len(y_train)}")
print(f"x_test:  {len(X_test)}")
print(f"y_test:  {len(y_test)}")

Výsledky:

Array sizes:
x_train: 8256
y_train: 8256
x_test:  12384
y_test:  12384

8. Ukázka natrénování a predikce modelu po rozdělení dat

Opět se podívejme, jak dopadne natrénování a následné otestování predikce modelu ve chvíli, kdy data rozdělíme na trénovací a testovací část:

from sklearn import linear_model
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.6)
 
# konstrukce modelu
lr = linear_model.LinearRegression()
 
# trénink modelu
lr.fit(X_train, y_train)
 
# predikce modelu
y_pred = lr.predict(X_test)
 
# výpis vypočtených koeficientů modelu
print("Coefficients: \n", lr.coef_)
print("Intercept: \n", lr.intercept_)
 
# 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))

Výsledky budou v tomto případě nepatrně horší, což je však očekávané, protože nyní model neměl při tréninku k dispozici všechny údaje a naopak při testování dostával k ohodnocení dříve neznámé záznamy:

Coefficients:
 [ 4.44247517e-01  9.78922329e-03 -1.10983616e-01  5.92399058e-01
 -1.66083700e-06 -4.66414487e-03 -4.10094011e-01 -4.23896551e-01]
Intercept:
 -36.03496303337858
Mean squared error: 0.53
Coefficient of determination: 0.60

9. Trénink modelu s vyloučením určitého atributu nebo atributů

Datová sada California housings obsahuje celkem osm atributů, zvaných taktéž proměnné (oboje označení je v kontextu IT poněkud matoucí):

    - MedInc        median income in block group
    - HouseAge      median house age in block group
    - AveRooms      average number of rooms per household
    - AveBedrms     average number of bedrooms per household
    - Population    block group population
    - AveOccup      average number of household members
    - Latitude      block group latitude
    - Longitude     block group longitude

Při tréninku interně tak jednoduchého modelu, jakým je i model pro lineární regresi, se může stát, že nějaký atribut ve skutečnosti předpovědi (a tím pádem i skóre) modelu zhorší, protože pro n atributů celé „naučení modelu“ spočívá v nalezení osmi reálných hodnot. To může být málo pro atribut či atributy, které jsou náhodné či do značné míry nelineární. A právě z tohoto důvodu se můžeme pokusit o odstranění těchto atributů z procesu učení. Z n-rozměrného pole odstraníme n-tý sloupec následovně:

# ceny bloku
targets = housings["target"]
 
X = np.delete(data, n, axis=1) # smazat jeden sloupec

kde za n dosadíme index příslušeného sloupce nebo vektor indexů sloupců.

10. Ukázka natrénování a predikce modelu po rozdělení dat a odstranění zvoleného atributu

Opět si vyzkoušejme, jak dobře či špatně bude model natrénován, pokud z procesu učení nějaký atribut odstraníme. Zde se konkrétně bude jednat o první sloupec s indexem 0:

import numpy as np
 
from sklearn import linear_model
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 = np.delete(data, 0, axis=1) # smazat jeden sloupec
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.6)
 
# konstrukce modelu
lr = linear_model.LinearRegression()
 
# trénink modelu
lr.fit(X_train, y_train)
 
# predikce modelu
y_pred = lr.predict(X_test)
 
# výpis vypočtených koeficientů modelu
print("Coefficients: \n", lr.coef_)
print("Intercept: \n", lr.intercept_)
 
# 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))

Výsledky ukazují, že v tomto konkrétním případě jsme situaci značně zhoršili, protože se zvýšila MSE a snížilo skóre!:

Coefficients:
 [ 5.37611342e-03  3.58845604e-01 -1.37584051e+00  2.14637514e-05
 -1.67202994e-01 -7.42206013e-01 -7.27320486e-01]
Intercept:
 -58.5715835183449
Mean squared error: 5.73
Coefficient of determination: -3.34
Poznámka: jen na okraj – nyní se nalezlo jen sedm koeficientů, opět podle očekávání.

11. Který atribut či atributy odstranit?

Jak ale zjistíme, který atribut nebo dokonce které atributy je vhodné z datové sady odstranit, aby model predikoval lepší výsledky? Můžeme se například pokusit postupně odstraňovat všechny kombinace atributů a zjišťovat výsledek tréninku modelu atd. A nebo ještě lépe – můžeme použít takzvanou crossvalidaci, což je velmi důležité téma, kterému bude věnován navazující článek. Prozatím si ovšem ukažme velmi jednoduchý přístup, v němž vždy odstraníme jediný atribut (sloupec) a následně provedeme trénink a testování modelu:

# nacteni datove sady
housings = fetch_california_housing()
 
# jmena promennych/atributu
names = housings["feature_names"]
 
for column_to_delete in range(len(names)):
    # X je matice, y je vektor
    X = np.delete(data, column_to_delete, axis=1) # smazat jeden vybrany sloupec
    y = targets
    ...
    ...
    ...
    následuje běžný trénink modelu, jeho otestování a zjištění MSE a skóre
    ...
    ...
    ...

12. Skript, který odstraní vybraný atribut a poté provede otestování modelu s vyjádřením skóre

Úplný skript, jenž vždy z datové sady odstraní jeden z atributů (tedy celý sloupec) a následně provede trénink i otestování modelu, může vypadat následovně (ideální bude skript rozšířit tak, aby dokázal pracovat i s kombinacemi atributů):

import numpy as np
 
from sklearn import linear_model
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"]
 
# jmena promennych/atributu
names = housings["feature_names"]
 
print("Ignored attribute\tMSE\tr2 score")
 
for column_to_delete in range(len(names)):
    # X je matice, y je vektor
    X = np.delete(data, column_to_delete, axis=1) # smazat jeden vybrany sloupec
    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.6)
 
    # konstrukce modelu
    lr = linear_model.LinearRegression()
 
    # trénink modelu
    lr.fit(X_train, y_train)
 
    # predikce modelu
    y_pred = lr.predict(X_test)
 
    # výpis vypočtených koeficientů modelu
    #print("Coefficients: \n", lr.coef_)
    #print("Intercept: \n", lr.intercept_)
 
    column = names[column_to_delete]
    mse = mean_squared_error(y_test, y_pred)
    score = r2_score(y_test, y_pred)
 
    print(f"{column:16}\t{mse:0.3f}\t{score:0.3f}")

Výsledky mohou vypadat takto:

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
Poznámka: z těchto výsledků spíše vyplývá, které atributy jsou užitečné a nikoli které jsou nadbytečné. Užitečný je zejména hned první atribut (medián příjmů), který – zdá se – velmi dobře koresponduje s cenou bytů.

13. Chování modelu při opakovaném tréninku s náhodně vybranými daty

Připomeňme si, že náš model natrénovaný nad osmi atributy, měl MSE rovno 0,53 a skóre 0,6:

Mean squared error: 0.53
Coefficient of determination: 0.60

To jsou relativně dobré hodnoty, ovšem bude chování modelu konzistentní i ve chvíli, kdy budeme trénink opakovat? Vyzkoušejme si to – provedeme celkem 200 natrénování modelu s opakovaným testováním, přičemž víme, že funkce train_test_split vybírá data pro trénink a testování náhodně:

import numpy as np
import matplotlib.pyplot as plt
 
from sklearn import linear_model
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"]
 
# jmena promennych/atributu
names = housings["feature_names"]
 
print("MSE\tr2 score")
 
# X je matice, y je vektor
X = data
y = targets
 
mses = []
r2_scores = []
 
MEASUREMENTS = 200
 
for i in range(MEASUREMENTS):
    # rozdeleni dat na treninkovou a testovaci mnozinu
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.6)
 
    # konstrukce modelu
    lr = linear_model.LinearRegression()
 
    # trénink modelu
    lr.fit(X_train, y_train)
 
    # predikce modelu
    y_pred = lr.predict(X_test)
 
    # výpis vypočtených koeficientů modelu
    #print("Coefficients: \n", lr.coef_)
    #print("Intercept: \n", lr.intercept_)
 
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    mses.append(mse)
    r2_scores.append(r2)
 
    print(f"{mse:0.3f}\t{r2:0.3f}")
 
plt.plot(range(MEASUREMENTS), mses, range(MEASUREMENTS), r2_scores)
 
# titulek grafu
plt.title(f"Mode prediction")
plt.legend(["MSE", "R2 score"])
 
# osy
plt.xticks()
plt.yticks()
 
# ulozeni diagramu do souboru
plt.savefig(f"93.png")
 
# zobrazeni diagramu
plt.show()

Numerické výsledky naznačují, že v některých případech má model výrazně menší skóre:

MSE     r2 score
0.520   0.605
0.525   0.605
0.527   0.601
0.523   0.608
0.520   0.610
0.549   0.594
0.594   0.552
0.527   0.604
0.537   0.599
0.538   0.600
0.533   0.597
1.381   -0.038
0.527   0.600
0.530   0.606
0.533   0.598
0.530   0.604
0.533   0.607
0.536   0.605
0.532   0.602
0.530   0.605
0.527   0.598
0.510   0.613
0.538   0.589
0.523   0.605
0.520   0.606
0.521   0.606
0.525   0.597
0.518   0.609
0.528   0.599
0.524   0.601
0.529   0.601
2.998   -1.306
0.535   0.602
0.531   0.604
0.529   0.605
0.524   0.603
0.518   0.616
0.539   0.599
0.623   0.541
0.525   0.608
0.532   0.599
0.525   0.605
0.541   0.599
0.524   0.603
0.526   0.604
1.898   -0.411
0.527   0.605
0.630   0.523
0.526   0.606
0.526   0.603
0.524   0.610
0.630   0.531
3.950   -1.943
0.648   0.514
5.817   -3.349
0.520   0.611
0.525   0.605
0.592   0.554
0.545   0.595
0.530   0.605
1.694   -0.262
0.526   0.605
0.545   0.596
0.525   0.601
0.614   0.544
0.522   0.608
0.521   0.607
0.535   0.596
2.867   -1.131
3.662   -1.777
0.524   0.609
0.533   0.602
0.530   0.604
0.533   0.593
0.532   0.602
0.593   0.551
0.651   0.510
0.643   0.516
0.544   0.593
3.178   -1.413
0.639   0.517
0.529   0.600
0.530   0.605
0.533   0.602
0.532   0.604
0.522   0.607
0.521   0.603
0.521   0.609
0.532   0.599
0.525   0.604
0.529   0.601
0.540   0.596
0.521   0.602
0.525   0.604
0.603   0.551
0.519   0.607
0.620   0.531
0.524   0.605
0.522   0.612
0.510   0.611
0.521   0.610
0.611   0.542
0.528   0.604
0.611   0.541
0.519   0.614
0.522   0.609
2.062   -0.532
2.612   -0.950
0.529   0.599
0.527   0.608
0.521   0.613
0.531   0.603
0.525   0.607
0.539   0.594
0.535   0.595
2.300   -0.719
0.528   0.605
0.526   0.605
0.529   0.603
0.520   0.612
0.522   0.608
0.524   0.607
1.792   -0.355
0.531   0.602
0.612   0.537
0.514   0.614
0.529   0.604
0.529   0.599
0.526   0.602
0.612   0.545
4.819   -2.612
0.520   0.611
0.524   0.607
14.495  -9.852
0.519   0.606
0.527   0.604
0.531   0.601
0.527   0.607
0.526   0.602
0.524   0.603
13.456  -9.121
0.624   0.532
0.532   0.598
10.395  -6.754
3.510   -1.613
0.533   0.592
0.531   0.601
0.527   0.605
4.240   -2.155
0.524   0.602
0.522   0.604
0.526   0.609
2.633   -0.987
0.517   0.615
0.647   0.515
2.295   -0.715
0.610   0.548
0.530   0.599
0.628   0.531
0.527   0.607
0.531   0.602
0.524   0.602
0.530   0.603
0.536   0.603
0.520   0.614
0.523   0.609
0.622   0.539
0.521   0.604
0.533   0.604
0.548   0.595
0.538   0.595
9.867   -6.412
0.533   0.600
0.528   0.596
0.528   0.604
0.535   0.601
3.044   -1.312
0.629   0.525
2.402   -0.823
0.520   0.608
0.531   0.603
0.532   0.605
0.514   0.608
0.522   0.602
3.210   -1.418
2.814   -1.115
0.527   0.604
0.526   0.602
0.532   0.596
0.510   0.612
0.524   0.605
2.094   -0.579
0.520   0.604
0.534   0.596
0.526   0.610
1.825   -0.353
0.523   0.604
0.536   0.598
0.539   0.600
0.521   0.608

Ještě více je tento problém patrný při grafickém znázornění chyby (MSE) i skóre:

Obrázek 31: V některých případech má model výrazně horší skóre.

Poznámka: to ovšem znamená, že některý atribut či atributy nám trénink modelů zhoršují, protože obsahují „divná“ data. K tomuto problému se vrátíme v další kapitole.

14. Zjištění, který atribut způsobuje špatné výsledky modelu

Předchozí demonstrační skript nyní upravíme, a to takovým způsobem, že postupně vždy odstraníme jeden z atributů a následně provedeme opakovaný trénink a následné otestování modelu. V případě, že bude odstraněn onen hledaný „problémový“ atribut, projeví se to tak, že graf s MSE a skóre modelu bude obsahovat průběh bez nežádoucích výchylek (jedná se o výchylky špatným směrem, tedy k vyšší MSE a nižšímu skóre):

import numpy as np
import matplotlib.pyplot as plt
 
from sklearn import linear_model
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"]
 
# jmena promennych/atributu
names = housings["feature_names"]
 
print("Ignored attribute\tMSE\tr2 score")
 
MEASUREMENTS = 200
 
for column_to_delete in range(len(names)):
    # X je matice, y je vektor
    X = np.delete(data, column_to_delete, axis=1) # smazat jeden vybrany sloupec
    y = targets
 
    column = names[column_to_delete]
 
    mses = []
    r2_scores = []
 
    for i in range(MEASUREMENTS):
        # rozdeleni dat na treninkovou a testovaci mnozinu
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.6)
 
        # konstrukce modelu
        lr = linear_model.LinearRegression()
 
        # trénink modelu
        lr.fit(X_train, y_train)
 
        # predikce modelu
        y_pred = lr.predict(X_test)
 
        # výpis vypočtených koeficientů modelu
        #print("Coefficients: \n", lr.coef_)
        #print("Intercept: \n", lr.intercept_)
 
        mse = mean_squared_error(y_test, y_pred)
        r2 = r2_score(y_test, y_pred)
        mses.append(mse)
        r2_scores.append(r2)
 
        print(f"{column:16}\t{mse:0.3f}\t{r2:0.3f}")
 
    plt.plot(range(MEASUREMENTS), mses, range(MEASUREMENTS), r2_scores)
 
    # titulek grafu
    plt.title(f"Mode prediction without column {column}")
    plt.legend(["MSE", "R2 score"])
 
    # osy
    plt.xticks()
    plt.yticks()
 
    # ulozeni diagramu do souboru
    plt.savefig(f"94_{column}.png")
 
    # zobrazeni diagramu
    plt.show()

15. Graficky znázorněné výsledky měření

Podívejme se nejprve na graficky znázorněné výsledky měření; poté se je pokusíme nějakým způsobem interpretovat:

Obrázek 31: Výsledky měření při vyloučení atributu „AveBedrms“.

Obrázek 32: Výsledky měření při vyloučení atributu „AveOccup“.

Obrázek 33: Výsledky měření při vyloučení atributu „AveRooms“.

Obrázek 34: Výsledky měření při vyloučení atributu „HouseAge“.

Obrázek 35: Výsledky měření při vyloučení atributu „Latitude“.

Obrázek 36: Výsledky měření při vyloučení atributu „Longitude“.

Obrázek 37: Výsledky měření při vyloučení atributu „MedInc“.

Obrázek 38: Výsledky měření při vyloučení atributu „Population“.

Ze zobrazených výsledků je patrné, že po odstranění atributu „AveOccup“ se již při tréninku modelu nebudou uplatňovat náhodné velké chyby. Zdá se tedy, že právě tento atribut je vhodné z datové sady odstranit, resp. přesněji řečeno ho nepoužívat při tréninku modelu. A nutno říci, že máme štěstí – odstranit je nutné jen jediný atribut, přičemž se nemusíme zabývat jejich kombinacemi.

16. Výpočet základních statistických údajů o atributech

Pokusme se o zobrazení histogramu pro jednotlivé atributy (resp. přesněji řečeno pro jejich hodnoty). Každý atribut je představován vektorem 26000 hodnot, takže je to snadné:

import matplotlib.pyplot as plt
 
from sklearn import linear_model
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"]
 
# vykresleni sady histogramu do mrizky
fig, axes = plt.subplots(nrows=4, ncols=2)
fig.set_figheight(15)
fig.set_figwidth(15)
 
# vykresleni jednotlivych histogramu do mrizky
for i in range(8):
    column = data[:, i]
    feature = housings.feature_names[i]
    ax = axes[i//2][i%2]
    # modifikace zpusobu vypoctu a zobrazeni histogrami
    ax.hist(column, bins=100, histtype="step")
    ax.set(xlabel=feature)
 
 
# zbavit se prazdneho mista okolo bunek mrizky
plt.tight_layout()
 
# ulozeni diagramu do souboru
plt.savefig("95.png")
 
# zobrazeni diagramu
plt.show()

Výsledky:

Obrázek 39: Histogramy pro všechny atributy z datové sady.

Alternativně si můžeme pro jednotlivé atributy vypočítat základní statistické údaje, zejména minimum, maximum, průměr a směrodatnou odchylku. Tyto údaje nám naznačí, které atributy budou při tréninku modelu „problémové“. Výpočet je snadný, protože potřebné metody a funkce nám poskytuje přímo knihovna Numpy:

import numpy as np
 
from sklearn import linear_model
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
data = housings["data"]
 
print("Feature              Min         Max           Avg         Std")
 
for i in range(8):
    column = data[:, i]
    feature = housings.feature_names[i]
    print(f"{feature:12}   {column.min():10.3f}   {column.max():10.3f}   {np.mean(column):10.3f}  {np.std(column):10.3f}")

17. Vypočtené výsledky a identifikace problémových atributů

Nyní se podívejme na výsledky získané po spuštění předchozího skriptu. Zejména nás bude zajímat údaj o směrodatné odchylce, který je nejvyšší pro atribut Population. Navíc pouze jen několik bloků má velmi vysokou hodnotu AveOccup, což znamená, že právě tento atribut může způsobit to, že model bude natrénován na jiné parametry lineární regrese a bude v některých případech velmi chybový (což uvidíme po normalizaci):

Feature              Min         Max           Avg         Std
MedInc              0.500       15.000        3.871       1.900
HouseAge            1.000       52.000       28.639      12.585
AveRooms            0.846      141.909        5.429       2.474
AveBedrms           0.333       34.067        1.097       0.474
Population          3.000    35682.000     1425.477    1132.435
AveOccup            0.692     1243.333        3.071      10.386
Latitude           32.540       41.950       35.632       2.136
Longitude        -124.350     -114.310     -119.570       2.003

18. Výsledky získané po normalizaci hodnot

Jednotlivé hodnoty z předchozí tabulky samozřejmě není možné přímo porovnávat, protože každý atribut je reprezentován v odlišných jednotkách a má i jiná měřítka. Porovnávání by bylo možné pouze po normalizaci hodnot v jednotlivých sloupcích, takže si ji proveďme, a to opět s využitím funkcí a tříd nabízených knihovnou Scikit-learn, zde konkrétně pomocí třídy MinMaxScaler:

import numpy as np
 
from sklearn import linear_model
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn import preprocessing as pre
 
# nacteni datove sady
housings = fetch_california_housing()
 
# precteni dat z datove sady
data = housings["data"]
 
print("Feature              Min         Max           Avg         Std")
 
for i in range(8):
    column = data[:, i]
    column = pre.MinMaxScaler().fit_transform(column.reshape(-1,1))
    feature = housings.feature_names[i]
    print(f"{feature:12}   {column.min():10.3f}   {column.max():10.3f}   {np.mean(column):10.3f}  {np.std(column):10.3f}")

Nyní je problémový atribut AveOccup jasně rozeznatelný:

ict ve školství 24

Feature              Min         Max           Avg         Std
MedInc              0.000        1.000        0.232       0.131
HouseAge            0.000        1.000        0.542       0.247
AveRooms            0.000        1.000        0.032       0.018
AveBedrms           0.000        1.000        0.023       0.014
Population          0.000        1.000        0.040       0.032
AveOccup            0.000        1.000        0.002       0.008 <-----
Latitude            0.000        1.000        0.329       0.227
Longitude           0.000        1.000        0.476       0.200

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

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.