Využití knihovny scikit-learn pro zpracování a analýzu přirozeného jazyka (NLP), 3.část

26. 11. 2024
Doba čtení: 72 minut

Sdílet

 Autor: Depositphotos
Budeme se zabývat velmi často řešenou úlohou: analýzou, zda je předložený text spam nebo se jedná o jiný typ textu (ham). Při vektorizaci textu využijeme takzvané n-gramy.

Obsah

1. Využití knihovny scikit-learn pro zpracování a analýzu přirozeného jazyka (NLP), 3.část

2. Získání datové sady a slovníku se slopslovy

3. Pokus o načtení datové sady do datového rámce (dataframe)

4. Specifikace kódování znaků v CSV souboru při jeho načítání do datového rámce

5. Zjištění statistiky o ohodnocení textu

6. Sloupce s očekávanými výsledky i s vlastním textem SMS

7. Vektorizace dat SMSek s výpisem výsledného slovníku

8. Výpis obsahu slovníku ve více sloupcích

9. Vektorizace všech SMSek z datové sady

10. Preprocesing textů z SMSsek s vyčištěním dat

11. Vektorizace textových dat po jejich filtraci

12. Trénink a predikce modelu nad vektorizovanými daty založený na třídě CountVectorizer

13. Trénink a predikce modelu nad vektorizovanými daty založený na třídě TfidfVectorizer

14. Jak pracovat s kontextem: řešení založené na n-gramech

15. Vektorizace textových dat s použitím n-gramů o délce 1–2 slov s výpisem výsledného slovníku

16. Trénink a predikce modelu s využitím třídy CountVectorizer při vektorizaci n-gramů

17. Trénink a predikce modelu s využitím třídy TfidfVectorizer při vektorizaci n-gramů

18. Zjištění vlivu minimální a maximální délky n-gramů na kvalitu modelu

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

20. Odkazy na Internetu

1. Využití knihovny scikit-learn pro zpracování a analýzu přirozeného jazyka (NLP), 3.část

Již potřetí se dnes vrátíme k problematice zpracování a analýzy přirozeného jazyka (Natural Language Processing neboli NLP) v Pythonu s využitím knihovny scikit-learn. Budeme se zabývat velmi často řešenou úlohou – a to konkrétně analýzou, zda je předložený text spam nebo se jedná o jiný typ textu (označuje se termínem ham). A aby nebyl objem zpracovávaných dat obrovský, budeme tuto analýzu provádět nad datovou sadou obsahující anglicky psané SMSky, tj. relativně krátké texty. Jedná se tedy o zadání, které se do jisté míry podobá úloze, kterou jsme již řešili, konkrétně k vytvoření modelu pro zjištění, zda jsou tweety laděny pozitivně, negativně nebo neutrálně.

Při řešení dnes použijeme novou techniku vektorizace, která není založena na vektorizaci jednotlivých slov, ale na zjištění, jaké kombinace slov se v textu vyskytují. Vektorizovat se budou právě tyto kombinace slov, tj. například „dobrý den“ by byl samostatný záznam ve slovníku. Díky tomu bude možné lépe podchytit kontext a (možná) tak zlepšit predikční schopnosti modelu (i když, jak uvidíme dále, pro krátké SMSky od mnoha autorů to nebude tak výrazné). Ovšem v oboru NLP se s n-gramy pracuje poměrně často.

Poznámka: udává se, že nejúspěšnější je použití bigramů, tj. dvojic slov.

2. Získání datové sady a slovníku se slopslovy

V prvním kroku si, jak je již v tomto seriálu zvykem, stáhneme datovou sadu, kterou použijeme pro trénink a validaci modelu. Tato datová sada je tvořena jediným souborem ve formátu CSV, který je dostupný na adrese https://www.kaggle.com/da­tasets/uciml/sms-spam-collection-dataset?resource=download (ve skutečnosti je nutné si projít potvrzovacím dialogem, na druhou stranu celá platforma Kaggle nabízí i další užitečné materiály a dokonce i celé Jupyter notebooky, takže je vhodné tento krok „přetrpět“).

Obrázek 1: Obsah staženého souboru CSV po jeho importu do spreadsheetu.

Dále budeme v některých skriptech vyžadovat slovník s takzvanými stopslovy (stopwords), o nichž jsme se již zmínili předminule a minule. Jedná se o slova, která v textu nenesou žádnou skutečně užitečnou informaci a mohou být odfiltrována. Tento slovník stáhneme jednoduchým skriptem založeným na knihovně NLTK. Vše se stáhne do adresáře ntkl_data umístěného v domovském adresáři:

# Stažení slovníku, který bude použit pro předzpracování textu v dalších
# demonstračních příkladech.
 
import nltk
 
# tento příkaz zajistí stažení příslušných datových souborů
nltk.download("stopwords")

3. Pokus o načtení datové sady do datového rámce (dataframe)

Již při analýze datové sady s tweety o dopravcích jsme celý soubor ve formátu CSV nejprve (před jeho dalším zpracováním) načetli do datového rámce (dataframe) s využitím knihovny Pandas. Toto načtení se obešlo bez problémů, takže se pokusme o provedení naprosto stejné operace, ovšem nyní nad souborem spam.csv získaným v rámci předchozí kapitoly:

# Pokus o načtení datové sady a zjištění základních údajů
 
import pandas as pd
 
# načtení tabulky do datového rámce
spam = pd.read_csv("spam.csv")
 
# základní informace o datovém rámci
print(spam.describe())

Nyní ovšem tato operace vyvolá výjimku, která by měla vypadat zhruba následovně:

Traceback (most recent call last):
  File "/home/ptisnovs/xy/205_spam_read.py", line 6, in <module>
    spam = pd.read_csv("spam.csv")
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1026, in read_csv
    return _read(filepath_or_buffer, kwds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 620, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1620, in __init__
    self._engine = self._make_engine(f, self.engine)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1898, in _make_engine
    return mapping[engine](f, **self.options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py", line 93, in __init__
    self._reader = parsers.TextReader(src, **kwds)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "parsers.pyx", line 574, in pandas._libs.parsers.TextReader.__cinit__
  File "parsers.pyx", line 663, in pandas._libs.parsers.TextReader._get_header
  File "parsers.pyx", line 874, in pandas._libs.parsers.TextReader._tokenize_rows
  File "parsers.pyx", line 891, in pandas._libs.parsers.TextReader._check_tokenize_status
  File "parsers.pyx", line 2053, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 606-607: invalid continuation byte
Poznámka: tato výjimka možná není příliš čitelná, protože si musíme uvědomit, že knihovnu Pandas používají i lidé, pro které není vývoj primárním cílem práce. Ovšem z posledního řádku je patrné, jaký problém nastal – v souboru CSV se objevují sekvence bajtů, které není možné dekódovat jako UTF-8 znak. Konkrétně se jedná o tento úsek: „å£1.5“0, ale s velkou pravděpodobností takových problémů nalezneme větší množství.

4. Specifikace kódování znaků v CSV souboru při jeho načítání do datového rámce

Pokusme se nyní o načtení souboru ve formátu CSV do datového rámce se specifikací kódování znaků. Již víme, že soubor, který jsme stáhli, nepoužívá UTF-8 a vlastně i nepřímo víme, že se nejedná o čisté ASCII (to je totiž podmnožinou UTF-8). Pokusme se tedy použít nějaké osmibitové kódování, kdy Pandas ve skutečnosti nemůže zjistit žádné chyby – každý bajt je převeden do jednoho znaku, ať již obsahuje jakoukoli hodnotu. Případné „paznaky“ později odfiltrujeme. Vzhledem k tomu, že kódování jen odhadujeme, zkusme například zadat latin1, což je jedno ze základních osmibitových rozšíření původní sedmibitové znakové sady ASCII:

# Načtení datové sady a zjištění základních údajů o načteném datovém rámci
 
import pandas as pd
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# základní informace o datovém rámci
print(spam.describe())

Nyní se soubor načte a vytvoří se z něho kýžený datový rámec. Z jeho popisu je patrné, že obsahuje dva skutečné datové sloupce nazvané v1 a v2 a taktéž je patrné, že některé řádky (ale je jich jen 12 z celkového počtu 5572) jsou uloženy tak netypickým způsobem, že byl programový kód načítající CSV při dekódování tak zmaten, že předpokládal, že věta obsahuje oddělovač jednotlivých buněk (což je ostatně pro formát CSV typické – tento formát nabízí velkou volnost a není tak dobře přenositelný, jak bychom si přáli):

          v1                      v2  ...             Unnamed: 3 Unnamed: 4
count   5572                    5572  ...                     12          6
unique     2                    5169  ...                     10          5
top      ham  Sorry, I'll call later  ...   MK17 92H. 450Ppw 16"    GNT:-)"
freq    4825                      30  ...                      2          2
 
[4 rows x 5 columns]

Pro zajímavost se na jeden z problémových řádků podívejme:

spam,"Your free ringtone is waiting to be collected. Simply text the password \MIX\"" to 85069 to verify. Get Usher and Britney. FML",  PO Box 5249," MK17 92H. 450Ppw 16""",

To je skutečně pro většinou „načítačů“ CSV matoucí.

5. Zjištění statistiky o ohodnocení textu

Další postup již vlastně známe. Zjistíme, jaké údaje jsou zapsány v prvním sloupci datového rámce. Předpokladem přitom je, že tento sloupec bude obsahovat pouze dvě možné hodnoty, konkrétně „ham“ nebo „spam“. Údaje o tom, jaké hodnoty jsou v tomto sloupci uloženy a navíc i informace o počtu těchto hodnot (frekvenci) zjistíme s využitím metody value_counts() zavolané nad objektem představujícím sloupec v1 (což je objekt typu datové řady – Serie)

# Načtení datové sady do datového rámce a zjištění statistiky o ohodnocení textu
 
import pandas as pd
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# početm spamů a hamů
print(spam.v1.value_counts())

Z výsledků je patrné, že v tomto sloupci jsou skutečně (korektně) uloženy pouze dvě možné hodnoty. Navíc je patrné, že více SMS není ohodnoceno jako spam (spamu je pouze 15%), což v důsledku ovlivní i trénink modelu a vypočtené matice záměn (viz další text):

v1
ham     4825
spam     747
Name: count, dtype: int64

6. Sloupce s očekávanými výsledky i s vlastním textem SMS

Vzhledem k tomu, že sloupce datové sady (přesněji řečeno první dva sloupce) mají taková jména, která jsou v jazyce Python platnými identifikátory, můžeme snadno přečíst hodnoty uložené v těchto sloupcích – názvy těchto sloupců jsou totiž současně i názvy atributů datového rámce spam. První sloupec přitom obsahuje očekávané výsledky (ohodnocení textu) a druhý sloupec vlastní, nijak nezpracovaný text SMS:

# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values

Další skript zobrazí jak několik vybraných hodnot z obou sloupců, tak i počet zde uložených hodnot:

# Načtení datové sady, charakteristiky sloupců s návěstím a vlastním textem
 
import pandas as pd
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))

První sloupec (včetně počtu hodnot):

Labels:
['ham' 'ham' 'spam' ... 'ham' 'ham' 'ham']
Number of labels: 5572

Druhý sloupec:

Features:
['Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...'
 'Ok lar... Joking wif u oni...'
 "Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's"
 ... 'Pity, * was in mood for that. So...any other suggestions?'
 "The guy did some bitching but I acted like i'd be interested in buying something else next week and he gave it to us for free"
 'Rofl. Its true to its name']
Number of features: 5572

7. Vektorizace dat SMSek s výpisem výsledného slovníku

Nyní provedeme vektorizaci SMSek, tj. textových hodnot uložených ve druhém sloupci nazvaném v2. Samotnou základní vektorizaci již dobře známe. Pro tento účel zpočátku použijeme třídu CountVectorizer, zkonstruuje slovník z celého korpusu (tedy ze všech textů). Tento slovník lze z výsledného objektu získat metodou get_feature_names_out. A podobně lze získat řídkou matici s frekvencemi jednotlivých slov.

Nás však nejprve bude zajímat pouze samotný slovník, tj. jaká slova jsou v něm uložena:

# Vektorizace textových dat, výpis výsledného slovníku
 
import pandas as pd
import re
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500,
    min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(features).toarray()
 
# slova pro dekódování vah
feature_names = vectorizer.get_feature_names_out()
print("Feature names count:", len(feature_names))
print("Feature names:")
for feature_name in feature_names:
    print(feature_name)

Z výpisu (zde notně zkráceného) je patrné, že kromě skutečných slov zde nalezneme čísla a na konci různé „paznaky“, které možná vznikly až při exportu SMSek:

Feature names count: 1267
Feature names:
00
000
02
03
04
06
0800
08000839402
08000930705
0870
08712460324
08718720201
10
100
1000
10am
10p
11
11mths
12
12hrs
1327
150
150p
150ppm
...
...
...
leaves
leaving
lect
left
leh
lei
lemme
less
lesson
lessons
let
lets
liao
library
life
lift
light
...
...
...
us
use
used
user
usf
using
usual
valentine
valentines
valid
valued
via
video
vikky
visit
vl
voice
...
...
...
xx
xxx
xy
ya
yahoo
yar
yeah
year
years
yep
yes
yesterday
yet
yijue
yo
yr
yrs
yup
ì_
ìï
û_
Poznámka: poslední tři údaje ve slovníku skutečně nereprezentují reálná slova.

8. Výpis obsahu slovníku ve více sloupcích

Pro zajímavost si ukažme trik použitelný pro tisk obsahu slovníku ve více sloupcích. Trik spočívá ve výběru každého n-tého prvku (pro čtyři sloupce bude n=4) postupně s offsetem 0, 1 a 2:

columns = 4
 
c1 = feature_names[::columns],
c1 = feature_names[1::columns],
c1 = feature_names[2::columns],
c1 = feature_names[3::columns],

Tyto struktury by teoreticky mělo být možné vytisknout s využitím standardní funkce zip:

columns = 4
 
for c1, c2, c3, c4 in zip(
    feature_names[::columns],
    feature_names[1::columns],
    feature_names[2::columns],
    feature_names[3::columns],
):
    ...
    ...
    ...

To však nebude plně korektní ve chvíli, kdy budou mít sloupce odlišný počet prvků, tj. když původní počet prvků ve slovníku nebude dělitelný čtyřmi. Oprava spočívá v tom, že namísto funkce zip použijeme funkci zip_longest naimportovanou ze standardní knihovny itertools:

columns = 4
 
for c1, c2, c3, c4 in zip_longest(
    feature_names[::columns],
    feature_names[1::columns],
    feature_names[2::columns],
    feature_names[3::columns],
):
    ...
    ...
    ...

Upravený skript pro výpočet a zobrazení slovníku bude mít tuto podobu:

# Vektorizace textových dat, výpis výsledného slovníku
 
import pandas as pd
import re
from itertools import zip_longest
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(features).toarray()
 
# slova pro dekódování vah
feature_names = vectorizer.get_feature_names_out()
print("Feature names count:", len(feature_names))
print("Feature names:")
 
columns = 4
for c1, c2, c3, c4 in zip_longest(
    feature_names[::columns],
    feature_names[1::columns],
    feature_names[2::columns],
    feature_names[3::columns],
):
    print(f"{c1: <20}{c2: <20}{c3: <20}{c4}")

A takto vypadá výsledný slovník, resp. jeho vybraná část při tisku do čtyř sloupců:

Feature names count: 1267
Feature names:
00                  000                 02                  03
04                  06                  0800                08000839402
08000930705         0870                08712460324         08718720201
10                  100                 1000                10am
10p                 11                  11mths              12
12hrs               1327                150                 150p
150ppm              16                  18                  1st
20                  200                 2000                2003
2004                20p                 25                  250
25p                 2day                2lands              2nd
2nite               30                  3030                350
36504               3g                  4u                  50
...
...
...
dont                door                double              download
draw                dream               dreams              drink
drive               driving             drop                drugs
dude                dun                 dunno               dvd
earlier             early               easy                eat
eating              eg                  eh                  either
else                em                  email               end
ending              ends                energy              england
enjoy               enough              enter               entered
entitled            entry               especially          etc
eve                 even                evening             ever
every               everyone            everything          ex
exam                excellent           excuse              experience
expires             extra               eyes                face
facebook            fact                family              fancy
fantastic           far                 fast                fat
father              fault               feb                 feel
feeling             feels               felt                figure
film                final               finally             find
fine                fingers             finish              finished
first               fixed               following           fone
food                forever             forget              forgot
forward             forwarded           found               fr
free                freemsg             freephone           frens
fri                 friday              friend              friends
...
...
....
meeting             meh                 member              men
merry               message             messages            met
mid                 midnight            might               min
mind                mine                mins                minute
minutes             miracle             miss                missed
missing             mistake             mm                  mo
mob                 mobile              mobiles             mobileupd8
mode                model               mom                 moment
mon                 monday              money               month
months              mood                moon                moral
morning             mother              motorola            move
movie               movies              mp3                 mr
mrng                mrt                 msg                 msgs
mu                  much                mum                 murdered
murderer            music               must                muz
na                  nah                 naked               name
national            naughty             near                need
needs               net                 network             neva
never               new                 news                next
ni8                 nice                nigeria             night
...
...
...
slave               sleep               sleeping            slept
slow                slowly              small               smile
smiling             smoke               sms                 smth
snow                sofa                sol                 somebody
someone             something           sometimes           somewhere
song                sony                soon                sorry
sort                sound               sounds              south
sp                  space               speak               special
specially           spend               spent               spree
st                  stand               start               started
starting            starts              statement           station
stay                staying             std                 still
stop                store               story               street
...
...
...
wk                  wkly                woke                wonder
wonderful           wondering           wont                word
words               work                workin              working
world               worried             worries             worry
worse               worth               wot                 would
wow                 write               wrong               wun
www                 xmas                xx                  xxx
xy                  ya                  yahoo               yar
yeah                year                years               yep
yes                 yesterday           yet                 yijue
yo                  yr                  yrs                 yup
ì_                  ìï                  û_                  None
Poznámka: poslední hodnota None odpovídá chybějícímu prvku.

9. Vektorizace všech SMSek z datové sady

Pro vlastní vektorizaci SMSsek opět, stejně jako v předchozích dvou příkladech, použijeme třídu CountVectorizer, která nejprve zkonstruuje slovník z celého korpusu (tedy ze všech textů) a následně každou SMS nahradí vektorem obsahujícím v i-tém prvku počet výskytů slova z i-tého místa ve slovníku v dané SMS. Z těchto vektorů se pak vytvoří matice, přičemž výsledné rozměry matice jsou n sloupců a m řádků, kde n odpovídá velikosti slovníku a m počtu SMSsek, které se zpracovaly (což odpovídá velikosti korpusu).

# Vektorizace textových dat
 
import pandas as pd
import re
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500,
    min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(features).toarray()
 
# slova pro dekódování vah
feature_names = vectorizer.get_feature_names_out()
print("Feature names count:", len(feature_names))
print()
 
# vlastní výsledek vektorizace
print("Sparse matrix of size", vectorized_features.shape, ":")
print()
 
# ukázka způsobu zakódování
print("Selected tweet:")
print("Original:     ", features[2])
print("Vectorized:   ", vectorized_features[2])
print()
 
print("word# weight meaning")
for i, f in enumerate(vectorized_features[2]):
    if f > 0:
        print(f"{i:4}  {f:5}  {feature_names[i]}")

Tento skript nejprve vypíše ohodnocení SMSek:

Labels:
['ham' 'ham' 'spam' ... 'ham' 'ham' 'ham']
Number of labels: 5572

Dále vypíše část samotných obsahů SMSsek:

Features:
['Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...'
 'Ok lar... Joking wif u oni...'
 "Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's"
 ... 'Pity, * was in mood for that. So...any other suggestions?'
 "The guy did some bitching but I acted like i'd be interested in buying something else next week and he gave it to us for free"
 'Rofl. Its true to its name']
Number of features: 5572

Důležitější je však údaj o rozměrech řídké matice. Ta má celkem 1276 sloupců (počet slov ve slovníku) a 5572 řádků (počet SMSek):

Feature names count: 1267
Sparse matrix of size (5572, 1267) :

V dalším kroku je ukázána vybraná SMSka. Nejprve je zobrazen její původní text:

Selected tweet:
Original:      Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's

Poté se zobrazí vektor odpovídající slovům v SMSce. Tento vektor obsahuje prakticky samé nuly, takže se nejedná o praktický výpis:

Vectorized:    [0 0 0 ... 0 0 0]

A následně se zobrazí pouze ta slova ve vektoru, která se ve vybrané SMSce vyskytují alespoň jedenkrát:

word# weight meaning
 104      1  apply
 238      1  comp
 271      1  cup
 357      2  entry
 393      1  final
 412      1  free
 664      1  may
 867      1  question
 874      1  rate
 888      1  receive
1030      1  std
1073      1  text
1133      1  txt
1210      1  win
1221      1  wkly

10. Preprocesing textů z SMSsek s vyčištěním dat

Vraťme se ještě ke slovníku, který jsme získali a vypsali v příkladu uvedeném v osmé kapitole. Jak je patrné, obsahuje tento slovník velké množství částí textu, který nelze považovat za běžná slova. Bude tedy vhodné provést nějaký preprocesing dat, v jehož rámci odstraníme ze vstupních textů různé „paznaky“ (ostatně zpracováváme anglický text), čísla atd. Pro tento účel sice existují specializované knihovny, my si ovšem prozatím vystačíme se sekvencí regulárních výrazů, odstraněním znaků, které nepatří do ASCII pomocí „pipeline“ představované příkazem:

processed_feature = processed_feature.encode("ascii", errors="ignore").decode()

který je následován konverzí SMSky na malá písmena s odstraněním přebytečných bílých znaků na začátku a na konci zprávy:

processed_feature.strip().lower()

Celý skript, který tuto činnost provádí, vypadá následovně:

# Vektorizace textových dat, výpis výsledného slovníku
 
import pandas as pd
import re
from itertools import zip_longest
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# slova pro dekódování vah
feature_names = vectorizer.get_feature_names_out()
print("Feature names count:", len(feature_names))
print("Feature names:")
 
columns = 4
for c1, c2, c3, c4 in zip_longest(
    feature_names[::columns],
    feature_names[1::columns],
    feature_names[2::columns],
    feature_names[3::columns],
):
    print(f"{str(c1): <20}{str(c2): <20}{str(c3): <20}{c4}")

Výsledkem bude slovník, z něhož byla skutečně odstraněna „neslova“. Slovník bude pochopitelně kratší a tím pádem bude menší i výsledná řídká matice získaná vektorizací:

Feature names:
abiola              able                abt                 ac
access              account             across              actually
add                 address             admirer             advance
aft                 afternoon           age                 ago
ah                  aha                 ahead               aight
al                  alex                almost              alone
already             alright             alrite              also
always              amp                 angry               another
ans                 answer              anymore             anyone
...
...
...
wrong               wun                 www                 xmas
xx                  xxx                 xy                  ya
yahoo               yar                 yeah                year
years               yep                 yes                 yesterday
yet                 yijue               yo                  yr
yrs                 yup                 None                None

11. Vektorizace textových dat po jejich filtraci

Opět se pokusme o vektorizaci SMSsek (tj. našeho korpusu), nyní ovšem s provedením filtrace textu, který z SMSek odstraní „neslova“, přičemž samotná vektorizace bude provedena až nad takto zpracovanými SMSkami. Nejprve si uvedeme samotný skript a poté porovnáme jeho výstup s výstupem skriptu, který pracoval s nefiltrovanými SMSkami:

# Vektorizace textových dat po jejich filtraci s využitím série regulárních výrazů
 
import pandas as pd
import re
from itertools import zip_longest
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# slova pro dekódování vah
feature_names = vectorizer.get_feature_names_out()
print("Feature names count:", len(feature_names))
print()
 
# vlastní výsledek vektorizace
print("Sparse matrix of size", vectorized_features.shape, ":")
print()
 
# ukázka způsobu zakódování
print("Selected tweet:")
print("Original:     ", features[2])
print("Processed:    ", processed_features[2])
print("Vectorized:   ", vectorized_features[2])
print()
 
print("word# weight meaning")
for i, f in enumerate(vectorized_features[2]):
    if f > 0:
        print(f"{i:4}  {f:5}  {feature_names[i]}")

Skript nyní vypíše, že ve slovníku má 1186 slov a tím pádem i řídká matice má rozměry 5572×1186 prvků:

Feature names count: 1186
 
Sparse matrix of size (5572, 1186) :

Připomeňme si, že bez provedení filtrace jsou výsledky odlišné:

Feature names count: 1267
 
Sparse matrix of size (5572, 1267) :

Zajímavější bude zjištění, jak se liší originální SMSka od SMSky přefiltrované (Original vs. Processed):

Selected tweet:
Original:      Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's
Processed:     free entry in  wkly comp to win fa cup final tkts  may  text fa to  to receive entry question std txt rate c apply  s
Vectorized:    [0 0 0 ... 0 0 0]

Slova použitá ve vektorizované SMSce:

word# weight meaning
  40      1  apply
 171      1  comp
 202      1  cup
 288      2  entry
 324      1  final
 343      1  free
 594      1  may
 792      1  question
 799      1  rate
 813      1  receive
 954      1  std
 996      1  text
1056      1  txt
1132      1  win
1143      1  wkly
Poznámka: tímto postupem tedy zajistíme, že model se bude učit na menší matici a navíc nebude učící algoritmus zatížen „šumem“ v datech.

12. Trénink a predikce modelu nad vektorizovanými daty založený na třídě CountVectorizer

Ve chvíli, kdy již máme k dispozici jak očekávané odpovědi (první sloupec datové sady) i vektorizované SMSky, můžeme přistoupit k tréninku modelu. V prvním demonstračním příkladu pro vektorizaci použijeme třídu CountVectorizer a model bude představován třídou KNeighborsClassifier. Model natrénujeme s využitím 80% dat z datové sady, přičemž zbylých 10% bude použito pro otestování kvality předpovědi modelu. A nakonec si necháme zobrazit matici záměn, která nyní bude jednoduchá – její velikost bude 2×2 prvky, protože jsou k dispozici jen dvě možné odpovědi:

# Trénink a predikce modelu nad vektorizovanými daty, založeno na třídě CountVectorizer
 
import pandas as pd
import re
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import classification_report, accuracy_score
from sklearn.neighbors import KNeighborsClassifier
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# klasické rozdělení datové sady na trénovací a testovací část
trainX, testX, trainY, testY = train_test_split(
    vectorized_features, labels, test_size=0.2, random_state=0
)
 
# konstrukce vybraného modelu s předáním hyperparametrů
classifier = KNeighborsClassifier(n_neighbors=1)
 
# trénink modelu
classifier.fit(trainX, trainY)
 
# predikce modelu pro testovací vstupy (ne pro trénovací data)
predictions = classifier.predict(testX)
 
# vyhodnocení kvality modelu
print(classification_report(testY, predictions))
print("Accuracy score:", accuracy_score(testY, predictions))
print()
 
# matice záměn - absolutní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
print()
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("214_1.png")
 
# vizualizace matice
plt.show()
 
# matice záměn - relativní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("214_2.png")
 
# vizualizace matice
plt.show()

Vyhodnocení kvality modelu:

Number of features: 5572
 
              precision    recall  f1-score   support
 
         ham       0.95      1.00      0.98       949
        spam       0.99      0.73      0.84       166
 
    accuracy                           0.96      1115
   macro avg       0.97      0.86      0.91      1115
weighted avg       0.96      0.96      0.96      1115

Zajímavější je vyjádření přesnosti odpovědí modelu, která dosahuje velmi pěkných 95–96%:

Accuracy score: 0.9587443946188341

A pochopitelně si můžeme nechat zobrazit matice záměn, a to jak v absolutní, tak i relativní podobě:

[[948   1]
 [ 45 121]]
 
[[0.99894626 0.00105374]
 [0.27108434 0.72891566]]

Naprostá většina hodnot leží na hlavní diagonále, což odpovídá (poměrně) kvalitnímu modelu!

Obrázek 2: Matice záměn s absolutními hodnotami.

Obrázek 3: Matice záměn s relativními hodnotami.

13. Trénink a predikce modelu nad vektorizovanými daty založený na třídě TfidfVectorizer

Se třídou TfidfVectorizer, která do výsledné matice ukládá nikoli frekvence slov, ale jejich hodnoty tf-idf (tj. numericky vyjádřenou specifičnost slov vůči dokumentu i celému korpusu), jsme se již setkali. Teoreticky by měl model natrénovaný s maticí obsahující prvky tf-idf dávat lepší výsledky v porovnání s použitím matice s frekvencemi slov. Jestli tomu tak bude i při analýze spamu v SMSkách, se můžeme snadno přesvědčit:

# Trénink a predikce modelu nad vektorizovanými daty, založeno na třídě TfidfVectorizer
 
import pandas as pd
import re
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import classification_report, accuracy_score
from sklearn.neighbors import KNeighborsClassifier
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = TfidfVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english")
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# klasické rozdělení datové sady na trénovací a testovací část
trainX, testX, trainY, testY = train_test_split(
    vectorized_features, labels, test_size=0.2, random_state=0
)
 
# konstrukce vybraného modelu s předáním hyperparametrů
classifier = KNeighborsClassifier(n_neighbors=1)
 
# trénink modelu
classifier.fit(trainX, trainY)
 
# predikce modelu pro testovací vstupy (ne pro trénovací data)
predictions = classifier.predict(testX)
 
# vyhodnocení kvality modelu
print(classification_report(testY, predictions))
print("Accuracy score:", accuracy_score(testY, predictions))
print()
 
# matice záměn - absolutní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
print()
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("215_1.png")
 
# vizualizace matice
plt.show()
 
# matice záměn - relativní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("215_2.png")
 
# vizualizace matice
plt.show()

Ve skutečnosti bude mít tento model nepatrně horší výsledky, než model předchozí. Ovšem rozdíly se v tomto případě skutečně pohybují hluboko pod hranicí statistické odchylky (což je ovšem zajímavé – evidetně se model nenaučil mnoho slov vyloženě specifických pro spam či naopak):

              precision    recall  f1-score   support
 
         ham       0.96      1.00      0.98       949
        spam       0.97      0.73      0.84       166
 
    accuracy                           0.96      1115
   macro avg       0.96      0.87      0.91      1115
weighted avg       0.96      0.96      0.95      1115
 
Accuracy score: 0.95695067264574
 
[[945   4]
 [ 44 122]]
 
[[0.99578504 0.00421496]
 [0.26506024 0.73493976]]

Z maticí záměn je patrné, že je tento model nepatrně horší, protože čísla na hlavní diagonále jsou v součtu menší, než tomu bylo u předchozího modelu:

Obrázek 4: Matice záměn s absolutními hodnotami.

Obrázek 5: Matice záměn s relativními hodnotami.

14. Jak pracovat s kontextem: řešení založené na n-gramech

Již minule jsme se zmínili o tom, že po vektorizaci vlastně ztrácíme informaci o pořadí slov v jednotlivých dokumentech. A to může znamenat, že modely nebudou natrénovány tak kvalitně, jak by to bylo možné při použití více sofistikovaných metod. Ovšem samotná vektorizace nemusí probíhat pouze nad slovníkem, který obsahuje jednotlivá slova. Namísto jednotlivých slov (či navíc k jednotlivým slovům) můžeme doplnit i dvojice, trojice atd. často používaných skupin slov. Takovým n-ticím se někdy říká n-gramy, i když je nutné poznamenat, že samotný název n-gram má více významů (může se například jednat o skupinu znaků). Ovšem my se budeme zabývat pouze n-gramy ve smyslu „n-tice slov“. Knihovna scikit-learn podporuje tvorbu slovníků, jehož prvky mohou být n-gramy, takže si můžeme vyzkoušet, zda tento alternativní způsob konstrukce slovníků povede k lepšímu nebo naopak k horšímu modelu.

Poznámka: n-gramy lze s výhodou použít například pro detekci autora textu. Ostatně v dalších příkladech se ukáže, že náš korpus složený z různých SMS není tou nejvhodnější datovou sadu pro použití n-gramů.

15. Vektorizace textových dat s použitím n-gramů o délce 1–2 slov s výpisem výsledného slovníku

Specifikace minimálního a maximálního počtu slov v n-gramech je snadná, protože do třídy CountVectorizer nebo TfidfVectorizer je možné předat nepovinný parametr ngram_range, který musí obsahovat dvojici (minimální_délka, maximální_délka). Pokusme se tedy zkonstruovat slovník, ve kterém budou obsažena jak jednotlivá slova, tak i jejich dvojice:

# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english"), ngram_range=(1,2)
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()

Výše uvedený konstruktor třídy CountVectorizer je zařazen do dalšího skriptu, který po vektorizaci vypíše nový slovník s jednotlivými slovy i jejich dvojicemi:

# Vektorizace textových dat s použitím n-gramů o délce 1-2 slov, výpis výsledného slovníku
 
import pandas as pd
import re
from itertools import zip_longest
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english"), ngram_range=(1,2)
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# slova pro dekódování vah
feature_names = vectorizer.get_feature_names_out()
print("Feature names count:", len(feature_names))
print()
 
print("Feature names:")
for feature_name in feature_names:
    print(feature_name)
print()
 
# vlastní výsledek vektorizace
print("Sparse matrix of size", vectorized_features.shape, ":")
print()
 
# ukázka způsobu zakódování
print("Selected tweet:")
print("Original:     ", features[2])
print("Processed:    ", processed_features[2])
print("Vectorized:   ", vectorized_features[2])
print()
 
print("word# weight meaning")
for i, f in enumerate(vectorized_features[2]):
    if f > 0:
        print(f"{i:4}  {f:5}  {feature_names[i]}")

Nyní bude do slovníku zařazeno 1475 prvků:

Feature names count: 1475

Z výpisu obsahu slovníku (zde pochopitelně zkráceného) je patrné, že v něm skutečně nalezneme i dvojice slov. Příkladem může být častá kombinace call + další slovo:

Feature names:
abiola
able
abt
ac
access
account
account statement
across
across sea
actually
add
...
...
...
call
call back
call claim
call customer
call free
call identifier
call land
call landline
call later
call min
call mobile
call per
call reply
...
...
...
worth
worth discount
yes
yes see

Zvětší se pochopitelně i matice získaná vektorizací:

Sparse matrix of size (5572, 1475) :

Ukázka vektorizace jedné SMSky:

Selected tweet:
Original:      Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's
Processed:     free entry in  wkly comp to win fa cup final tkts  may  text fa to  to receive entry question std txt rate c apply  s
Vectorized:    [0 0 0 ... 0 0 0]

Zajímavé je, že i tato SMSka obsahuje dvojici „free entry“ zařazenou do slovníku:

word# weight meaning
  45      1  apply
 220      1  comp
 258      1  cup
 360      2  entry
 400      1  final
 421      1  free
 424      1  free entry
 742      1  may
 989      1  question
 996      1  rate
1010      1  receive
1180      1  std
1229      1  text
1303      1  txt
1414      1  win
1427      1  wkly

16. Trénink a predikce modelu s využitím třídy CountVectorizer při vektorizaci n-gramů

Nový model nyní natrénujeme takovým způsobem, že použijeme třídu CountVectorizer, ovšem umožníme, aby se do slovníku nevkládala pouze jednotlivá slova, ale i jejich dvojice. Tím by se teoreticky měla zvýšit výsledná kvalita modelu. Praktické výsledky ovšem mohou být odlišné od předpokladů, takže si vždy musíme předpoklady ověřit měřením (natrénováním a otestováním modelu):

# Trénink a predikce modelu nad vektorizovanými daty, založeno na třídě CountVectorizer, použití ngramů
 
import pandas as pd
import re
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import classification_report, accuracy_score
from sklearn.neighbors import KNeighborsClassifier
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = CountVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english"), ngram_range=(1, 2)
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# klasické rozdělení datové sady na trénovací a testovací část
trainX, testX, trainY, testY = train_test_split(
    vectorized_features, labels, test_size=0.2, random_state=0
)
 
# konstrukce vybraného modelu s předáním hyperparametrů
classifier = KNeighborsClassifier(n_neighbors=1)
 
# trénink modelu
classifier.fit(trainX, trainY)
 
# predikce modelu pro testovací vstupy (ne pro trénovací data)
predictions = classifier.predict(testX)
 
# vyhodnocení kvality modelu
print(classification_report(testY, predictions))
print("Accuracy score:", accuracy_score(testY, predictions))
print()
 
# matice záměn - absolutní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
print()
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("217_1.png")
 
# vizualizace matice
plt.show()
 
# matice záměn - relativní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("217_2.png")
 
# vizualizace matice
plt.show()

Výsledky v tomto případě kupodivu nebudou o mnoho lepší v porovnání s modelem natrénovaným pro jednotlivá slova. To je sice poněkud neintuitivní, ovšem je dobré si uvědomit, že zpracováváme jen krátké SMSky a nikoli delší dokumenty, v nichž by se daly najít různé specifičnosti (každý autor například používá podobná slovní spojení atd.):

               precision    recall  f1-score   support
 
         ham       0.95      1.00      0.98       949
        spam       0.99      0.72      0.84       166
 
    accuracy                           0.96      1115
   macro avg       0.97      0.86      0.91      1115
weighted avg       0.96      0.96      0.96      1115
 
Accuracy score: 0.957847533632287
 
[[948   1]
 [ 46 120]]
 
[[0.99894626 0.00105374]
 [0.27710843 0.72289157]]

Matice záměn zobrazené formou grafu:

Obrázek 6: Matice záměn s absolutními hodnotami.

Obrázek 7: Matice záměn s relativními hodnotami.

17. Trénink a predikce modelu s využitím třídy TfidfVectorizer při vektorizaci n-gramů

Na závěr si ještě upravme demonstrační příklad z předchozí kapitoly do podoby, v níž je vektorizace provedena třídou TfidfVectorizer. Výsledkem budou prvky obsahující informaci o specifičnosti jednotlivých slov i jejich dvojic, což by teoreticky mělo znamenat, že model bude mít lepší predikce, protože dvojice slov již může poměrně přesně určovat, jestli se jedná o spam nebo ham. Pojďme si to vyzkoušet:

# Trénink a predikce modelu nad vektorizovanými daty, založeno na třídě TfidfVectorizer, použití ngramů
 
import pandas as pd
import re
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import classification_report, accuracy_score
from sklearn.neighbors import KNeighborsClassifier
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
# vektorizace textu
vectorizer = TfidfVectorizer(
    max_features=2500, min_df=7, max_df=0.8, stop_words=stopwords.words("english"), ngram_range=(1, 2)
)
vectorized_features = vectorizer.fit_transform(processed_features).toarray()
 
# klasické rozdělení datové sady na trénovací a testovací část
trainX, testX, trainY, testY = train_test_split(
    vectorized_features, labels, test_size=0.2, random_state=0
)
 
# konstrukce vybraného modelu s předáním hyperparametrů
classifier = KNeighborsClassifier(n_neighbors=1)
 
# trénink modelu
classifier.fit(trainX, trainY)
 
# predikce modelu pro testovací vstupy (ne pro trénovací data)
predictions = classifier.predict(testX)
 
# vyhodnocení kvality modelu
print(classification_report(testY, predictions))
print("Accuracy score:", accuracy_score(testY, predictions))
print()
 
# matice záměn - absolutní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize=None,
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
print()
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("218_1.png")
 
# vizualizace matice
plt.show()
 
# matice záměn - relativní hodnoty
disp = ConfusionMatrixDisplay.from_estimator(
    classifier,
    testX,
    testY,
    cmap=plt.cm.Blues,
    normalize="true",
)
 
# zobrazení matice v textové podobě
print(disp.confusion_matrix)
 
# uložení výsledků ve formě rastrového obrázku
plt.savefig("218_2.png")
 
# vizualizace matice
plt.show()

Výsledky nového modelu jsou skutečně lepší, než tomu bylo v předchozím příkladu, i když se opět jedná spíše o statistickou odchylku (tedy záleží, která data jsou vybrána do trénovací a která do testovací množiny):

              precision    recall  f1-score   support
 
         ham       0.96      1.00      0.98       949
        spam       0.98      0.74      0.84       166
 
    accuracy                           0.96      1115
   macro avg       0.97      0.87      0.91      1115
weighted avg       0.96      0.96      0.96      1115
 
Accuracy score: 0.9587443946188341
 
[[946   3]
 [ 43 123]]
 
[[0.99683878 0.00316122]
 [0.25903614 0.74096386]]

Matice záměn ve vizuální podobě vypadají takto:

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

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

18. Zjištění vlivu minimální a maximální délky n-gramů na kvalitu modelu

V dnešním posledním demonstračním příkladu se pokusíme zjistit, jaká je (pro danou vstupní datovou sadu a pouze pro ni!) vhodná minimální a maximální délka n-gramů. Může totiž nastat situace, že bude nejvýhodnější model natrénovat pouze s využitím dvojic slov, nebo s využitím dvojic a trojic slov atd. Dopředu není možné přesně odhadnout, která kombinace (min, max) bude nejvhodnější, takže se opět uchýlíme k měření. To je realizováno v dalším skriptu, který pro každou legální kombinaci minimální a maximální délky n-gramů vypíše počet záznamů ve slovníku i celkové dosažené skóre modelu, tedy jeho předikční schopnosti:

# Trénink a predikce modelu nad vektorizovanými daty, založeno na třídě TfidfVectorizer, použití ngramů
 
import pandas as pd
import re
from nltk.corpus import stopwords
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import classification_report, accuracy_score
from sklearn.neighbors import KNeighborsClassifier
 
# načtení tabulky do datového rámce, specifikace kódování souboru
spam = pd.read_csv("spam.csv", encoding="latin1")
 
# hodnocení (spam/ham)
labels = spam.v1.values
 
# vlastní text SMS
features = spam.v2.values
 
# hodnoty použité později pro trénink modelu
print("Labels:")
print(labels)
print("Number of labels:", len(labels))
print()
 
print("Features:")
print(features)
print("Number of features:", len(features))
print()
 
 
def process_feature(feature):
    """Preprocesing textových dat."""
    # odstranění speciálních znaků a dalšího smetí
    processed_feature = re.sub(r"\W", " ", feature)
 
    # odstranění samostatných znaků (oddělených bílými znaky)
    processed_feature = re.sub(r"\s+[a-zA-Z]\s+", " ", processed_feature)
 
    # odstranění samostatných znaků na začátku vět
    processed_feature = re.sub(r"\^[a-zA-Z]\s+", " ", processed_feature)
 
    # náhrada více mezer (nebo jiných bílých znaků) za jedinou mezeru
    processed_feature = re.sub(r"\s+", " ", processed_feature, flags=re.I)
 
    # odstranění slov s číslicemi
    processed_feature = re.sub("\w*\d\w*", "", processed_feature)
 
    # odstranění prefixů ^b
    processed_feature = re.sub(r"^b\s+", "", processed_feature)
 
    # odstranění znaků, které nejsou ASCII
    processed_feature = processed_feature.encode("ascii", errors="ignore").decode()
 
    # konverze výsledku na malá písmena
    return processed_feature.strip().lower()
 
 
# preprocesing všech hodnocení
processed_features = [process_feature(feature) for feature in features]
 
 
def model_with_ngrams(min_ngrams, max_ngrams, detailed_report):
 
    # vektorizace textu
    vectorizer = TfidfVectorizer(
        max_features=5000, min_df=7, max_df=0.8,
        stop_words=stopwords.words("english"), ngram_range=(min_ngrams, max_ngrams)
    )
    vectorized_features = vectorizer.fit_transform(processed_features).toarray()
    columns = vectorized_features.shape[1]
 
    # klasické rozdělení datové sady na trénovací a testovací část
    trainX, testX, trainY, testY = train_test_split(
        vectorized_features, labels, test_size=0.2, random_state=0
    )
 
    # konstrukce vybraného modelu s předáním hyperparametrů
    classifier = KNeighborsClassifier(n_neighbors=1)
 
    # trénink modelu
    classifier.fit(trainX, trainY)
 
    # predikce modelu pro testovací vstupy (ne pro trénovací data)
    predictions = classifier.predict(testX)
 
    # vyhodnocení kvality modelu
    if detailed_report:
        print(classification_report(testY, predictions))
        print()
 
        # matice záměn - absolutní hodnoty
        disp = ConfusionMatrixDisplay.from_estimator(
            classifier,
            testX,
            testY,
            normalize=None,
        )
 
        # zobrazení matice v textové podobě
        print(disp.confusion_matrix)
        print()
 
        # matice záměn - relativní hodnoty
        disp = ConfusionMatrixDisplay.from_estimator(
            classifier,
            testX,
            testY,
            normalize="true",
        )
 
        # zobrazení matice v textové podobě
        print(disp.confusion_matrix)
 
    score = accuracy_score(testY, predictions)
    print(f"{min_ngrams}  {max_ngrams}  {columns:4}  {score:05.3}")
 
 
for min_ngrams in range(1, 7):
    for max_ngrams in range(min_ngrams, 8):
        model_with_ngrams(min_ngrams, max_ngrams, False)

Podívejme se nejdříve na numerické výsledky, které se následně pokusíme nějakým způsobem zhodnotit:

1  1  1186  0.957
1  2  1475  0.959
1  3  1587  0.958
1  4  1652  0.957
1  5  1695  0.957
1  6  1727  0.957
1  7  1751  0.957
2  2   289  0.943
2  3   401  0.943
2  4   466  0.943
2  5   509  0.943
2  6   541  0.943
2  7   565  0.943
3  3   112  0.896
3  4   177  0.896
3  5   220  0.896
3  6   252  0.896
3  7   276  0.896
4  4    65  0.883
4  5   108  0.883
4  6   140  0.883
4  7   164  0.883
5  5    43  0.871
5  6    75  0.871
5  7    99  0.871
6  6    32  0.868
6  7    56  0.868

Nejlepších výsledků bylo dosaženo při zařazení jednotlivých slov a jejich dvojic do slovníku. Druhý nejlepší výsledek je získán při použití jednotlivých slov, dvojic a trojic. Pro další kombinace již úspěšnost modelu klesá. A důležitý (a snadno pochopitelný) je i fakt, že pokud se do slovníku nezařazují jednotlivá slova, bude slovník mnohem menší. Například čistých dvojic existuje jen 289, čistých čtveřic dokonce jen 65. I v těchto případech by bylo možné počet záznamů zvýšit, a to manipulací s hodnotami min_df a max_df, které jsme si vysvětlili minule. O další vylepšení se pokusíme v navazujícím článku, ve kterém celý popis NLP s využitím scikit-learn dokončíme.

bitcoin školení listopad 24

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

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

# Příklad Stručný popis Adresa příkladu
1 01_show_matrix.py kooperace mezi knihovnami Matplotlib a NumPy: vizualizace obsahu 2D matice https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/01_show_ma­trix.py
2 02_get_digits.py datová množina obsahující naskenované ručně napsané číslice https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/02_get_di­gits.py
3 03_get_features.py další atributy datové množiny, které použijeme při trénování https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/03_get_fe­atures.py
4 04_get_images.py přečtení a následné vykreslení jednotlivých ručně nakreslených číslic https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/04_get_i­mages.py
5 05_show_grayscale_matrix.py odstranění umělé aplikované barvové palety (obrázky ve stupních šedi) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/05_show_gra­yscale_matrix.py
6 06_grayscale_images.py vykreslení ručně nakreslených číslic ve formě obrázků ve stupních šedi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/06_gra­yscale_images.py
7 07_multiplot.py rozdělení plochy grafu do oblastí; vykreslení více obrázků do jediného grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/07_mul­tiplot.py
8 08_model_preperation1.py obrázky s jejich ohodnocením https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/08_mo­del_preperation1.py
9 09_training_set.py příprava dat pro trénink https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/09_tra­ining_set.py
10 10_classification.py klasifikace obrázků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/10_clas­sification.py
11 11_results.py vykreslení obrázků společně s jejich klasifikací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/11_results.py
12 12_change_training_set.py změna poměru rozdělení dat na tréninkovou a testovací množinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/12_chan­ge_training_set.py
       
13 13_blobs.py použití funkce make_blobs pro vygenerování sady bodů v rovině sdružených do oblastí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/13_blobs.py
14 14_swap_coords.py úprava předchozího příkladu: prohození souřadnic na osách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/14_swap_co­ords.py
15 15_blobs_scatter_plot.py základní podoba bodového diagramu (scatter plot) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/15_blob­s_scatter_plot.py
16 16_blobs_scatter_plot.py úprava bodového diagramu při zobrazení většího množství bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/16_blob­s_scatter_plot.py
17 17_colorized_blobs.py obarvení bodů podle oblastí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/17_co­lorized_blobs.py
18 18_k-means.py základní použití algoritmu K-means pro clustering https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/18_k-means.py
19 19_combination.py zobrazení centroidů společně s původními body https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/19_com­bination.py
20 20_combinations.py vizualizace clusteringu původní množiny bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/20_com­binations.py
21 21_other_settings.py vizualizace clusteringu původní množiny bodů pro odlišnou množinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/21_ot­her_settings.py
22 22_random_points.py clustering pro náhodná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/22_ran­dom_points.py
       
23 23_circles.py pseudonáhodné rozmístění bodů do kružnic, menší náhodnost výsledku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/23_circles.py
24 24_more_noise_circles.py pseudonáhodné rozmístění bodů do kružnic, větší náhodnost výsledku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/24_mo­re_noise_circles.py
25 25_moons.py pseudonáhodné rozmístění bodů do tvaru dvou půlměsíců, menší náhodnost https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/25_moons.py
26 26_more_noisy_moons.py pseudonáhodné rozmístění bodů do tvaru dvou půlměsíců, větší náhodnost https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/26_mo­re_noisy_moons.py
27 27_circles_kmeans.py výsledek clusteringu provedeného algoritmem K-means na „kružnice“ https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/27_cir­cles_kmeans.py
28 28_moons_kmeans.py výsledek clusteringu provedeného algoritmem K-means na „půlměsíce“ https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/28_mo­ons_kmeans.py
29 29_blobs_spectral_clustering.py spectral clustering pro body rozmístěné pomocí make_blobs https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/29_blob­s_spectral_clustering.py
30 30_circles_spectral_clustering.py spectral clustering pro body rozmístěné do kružnic https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/30_cir­cles_spectral_clustering.py
31 31_moons_spectral_clustering.py spectral clustering pro body rozmístěné do půlměsíců https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/31_mo­ons_spectral_clustering.py
32 32_moons_spectral_clustering_limits.py vyhledání limitů algoritmu spectral clustering https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/32_mo­ons_spectral_clustering_li­mits.py
       
33 33_particles_load.py načtení souřadnic částic uložených v souboru formátu CSV https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/33_par­ticles_load.py
       
34 34_lorenz_attractor.py zobrazení Lorenzova atraktoru formou bodů propojených úsečkami https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/34_lo­renz_attractor.py
35 35_lorenz_attractor_points.py Lorenzův atraktor vykreslený formou jednotlivých bodů s definovaným stylem zobrazení a velikostí stopy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/35_lo­renz_attractor_points.py
36 36_blobs_3d.py vygenerování a zobrazení sady bodů v 3D prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/36_blob­s_3d.py
37 37_spread_blobs_3d.py vygenerování a zobrazení sady bodů v 3D prostoru, odlišné parametry při generování https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/37_spre­ad_blobs_3d.py
38 38_views.py různé pohledy na 3D graf https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/38_views.py
39 39_colorized_3d_blobs.py obarvení bodů v prostoru na základě vstupních dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/39_co­lorized_3d_blobs.py
40 40_kmeans_3d_blobs.py shluková analýza v 3D prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/40_kme­ans_3d_blobs.py
41 41_kmeans_spread_3d_blobs.py shluková analýza v 3D prostoru pro odlišnou množinu bodů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/41_kme­ans_spread_3d_blobs.py
42 42_kmeans_random_3d.py shluková analýza pro body rozmístěné zcela náhodně v omezeném prostoru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/42_kme­ans_random_3d.py
       
43 43_speed_measurements.py benchmark pro postupně rostoucí počet bodů tvořících shluky https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/43_spe­ed_measurements.py
44 44_speed_measurements.py benchmark pro postupně rostoucí počet bodů rozmístěných náhodně https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/44_spe­ed_measurements.py
45 45_speed_measurements.py benchmark pro stále stejný počet bodů, u jejichž rozmístění v prostoru se používá stále větší směrodatná odchylka https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/45_spe­ed_measurements.py
       
46 46_iris_dataset.py načtení datové kolekce https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/46_i­ris_dataset.py
47 47_iris_description.py metadata o datové kolekci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/47_i­ris_description.py
48 48_iris_data.py tvar dat – počet záznamů a počet proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/48_i­ris_data.py
49 49_iris_targets.py jména atributů, vztah mezi numerickou hodnotou atributu a jeho jménem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/49_i­ris_targets.py
       
50 50_iris_scatter_plot1.py korelační diagram pro dvojici vybraných proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/50_i­ris_scatter_plot1.py
51 51_iris_scatter_plot2.py příprava pro tvorbu složitějších grafů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/51_i­ris_scatter_plot2.py
52 52_iris_mutliplot.py mřížka obsahující více korelačních diagramů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/52_i­ris_mutliplot.py
       
53 53_iris_histograms.py zobrazení základního histogramu pro data v sadě Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/53_i­ris_histograms.py
54 54_iris_histograms.py úprava histogramu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/54_i­ris_histograms.py
       
55 55_pca.py analýza hlavních komponent (PCA), výsledek zobrazený v 2D grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/55_pca.py
56 56_pca_3d.py analýza hlavních komponent (PCA), výsledek zobrazený v 3D grafu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/56_pca_3d.py
57 57_kmeans.py základní shluková analýza https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/57_kmeans.py
58 58_multiple_kmeans.py větší množství výsledků shlukové analýzy pro různé atributy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/58_mul­tiple_kmeans.py
59 59_kmeans_errors.py korektní a nekorektní výsledky základní shlukové analýzy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/59_kme­ans_errors.py
       
60 60_basic_classifier.py aplikace jednoduchého modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/60_ba­sic_classifier.py
61 61_changed_model_parameters.py změna parametrů modelu pro zjištění druhů rostil https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/61_chan­ged_model_parameters.py
62 62_different_model.py použití odlišného modelu pro zjištění druhů rostlin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/62_dif­ferent_model.py
       
63 63_verify_on_whole_data1.py otestování naučeného modelu s využitím tréninkových dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/63_ve­rify_on_whole_data1.py
64 64_verify_on_whole_data2.py využití funkce metrics.accuracy_score pro zjištění kvality modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/64_ve­rify_on_whole_data2.py
65 65_basic_comparison.py porovnání vlastností různých modelů (prozatím nekorektní řešení) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/65_ba­sic_comparison.py
66 66_training_testing_split1.py rozdělení datové sady na trénovací data a testovací data (základní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/66_tra­ining_testing_split1.py
67 67_training_testing_split2.py rozdělení datové sady na trénovací data a testovací data (náhodné rozdělení sady) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/67_tra­ining_testing_split2.py
68 68_training_testing_split3.py rozdělení datové sady na trénovací data a testovací data (využití vestavěné funkce) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/68_tra­ining_testing_split3.py
69 69_better_comparison.py vylepšené porovnání vlastností různých modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/69_bet­ter_comparison.py
70 70_multiple_runs.py vliv generátoru náhodných čísel na změřené výsledky https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/70_mul­tiple_runs.py
71 71_stable_multiple_runs.py generátor náhodných čísel a použití hodnoty random_state https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/71_sta­ble_multiple_runs.py
       
72 72_housings_dataset.py načtení datové sady California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/72_hou­sings_dataset.py
73 73_housings_dataset_description.py metainformace o datové sadě California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/73_hou­sings_dataset_description­.py
74 74_housings_data.py n-rozměrné pole s atributy jednotlivých domů/bloků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/74_hou­sings_data.py
75 75_housings_targets.py jména atributů, ceny domů atd. https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/75_hou­sings_targets.py
76 76_housings_scatter_plot.py korelační diagram pro dvojici vybraných proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/76_hou­sings_scatter_plot.py
77 77_housings_mutliplot.py korelační diagram pro všechny kombinace dvojic proměnných https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/77_hou­sings_mutliplot.py
78 78_scatter.py dvourozměrné hodnoty reprezentované jako dvojice atributů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/78_scatter.py
79 79_linear_regression_gen_data.py model LinearRegression nad uměle vytvořenými daty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/79_li­near_regression_gen_data.py
80 80_linear_regression_predictions.py predikce modelu provádějícího lineární regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/80_li­near_regression_prediction­s.py
81 81_linear_regression_random_data.py chování modelu pro zcela náhodná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/81_li­near_regression_random_da­ta.py
82 82_linear_regression_housings.py model LinearRegression pro datovou sadu California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/82_li­near_regression_housings.py
83 83_polynomial_regression_gen_data.py polynomiální regrese (základní příklad) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/83_po­lynomial_regression_gen_da­ta.py
84 84_polynomial_regression_housings.py polynomiální regrese a datová sada California housings, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/84_po­lynomial_regression_housin­gs.py
85 85_polynomial_regression_housings2.py polynomiální regrese a datová sada California housings, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/85_po­lynomial_regression_housin­gs2.py
86 86_polynomial_regression_housings3.py polynomiální regrese a datová sada California housings, třetí příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/86_po­lynomial_regression_housin­gs3.py
87 87_linear_regression_errors.py výpočet chyby a skóre modelu lineární regrese https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/87_li­near_regression_errors.py
88 88_linear_regression_non_linear_data.py lineární regrese nad nelineárními daty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/88_li­near_regression_non_linear_da­ta.py
89 89_polynomial_regression_error.py https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/89_po­lynomial_regression_error­.py
       
90 90_housings_prediction1.py regresní analýza nad daty California housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/90_hou­sings_prediction1.py
91 91_housings_prediction2.py korektní natrénování modelu pro regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/91_hou­sings_prediction2.py
92 92_housings_prediction3.py omezení množství atributů (proměnných), na kterých je model natrénován https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/92_hou­sings_prediction3.py
93 93_housings_prediction_errors1.py chybně natrénovaný model při náhodné volbě dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/93_hou­sings_prediction_errors1.py
94 94_housings_prediction_errors2.py omezení atributů + chybně natrénovaný model https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/94_hou­sings_prediction_errors2.py
95 95_housings_histograms.py histogramy pro jednotlivé atributy (proměnné) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/95_hou­sings_histograms.py
96 96_housings_statistic.py statistické údaje pro jednotlivé atributy (proměnné) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/96_hou­sings_statistic.py
97 97_housings_statistic_normalized.py statistické údaje získané po normalizaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/97_hou­sings_statistic_normalized­.py
       
98 98_k_fold_help.py zobrazení nápovědy ke třídě s realizací k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/98_k_fol­d_help.py
99 99_k_fold_old.py původní (nepodporovaná) varianta provedení k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/99_k_fol­d_old.py
100 100_k_fold1.py interní chování algoritmu k-foldingu (základní parametry) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/100_k_fol­d1.py
101 101_k_fold2.py interní chování algoritmu k-foldingu (odlišné parametry) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/101_k_fol­d2.py
102 102_k_fold_selection.py k-folding a výběr dat pro otestování modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/102_k_fol­d_selection.py
103 103_average_score.py realizace výpočtu průměrného skóre pro otestování modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/103_a­verage_score.py
104 104_hyperparams_score.py změna hyperparametrů s výpočtem průměrného skóre (tabulka) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/104_hy­perparams_score.py
105 105_hyperparams_score_plot.py změna hyperparametrů s výpočtem průměrného skóre (graf) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/105_hy­perparams_score_plot.py
106 106_model_selection.py výběr nejlepšího modelu s využitím k-foldingu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/106_mo­del_selection.py
107 107_features_selection_basic.py výběr atributů (proměnných) pro trénink modelu (základní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/107_fe­atures_selection_basic.py
108 108_features_selection_iris.py výběr atributů (proměnných) pro trénink modelu (datová sada Iris) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/108_fe­atures_selection_iris.py
109 109_features_selection_houses.py výběr atributů (proměnných) pro trénink modelu (datová sada California Housings) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/109_fe­atures_selection_houses.py
110 110_best_features_selection_houses.py získání nejlepší sady atributů (proměnných) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/110_bes­t_features_selection_houses­.py
111 111_features_selection_graphical.py výběr atributů (proměnných) pro trénink modelu (datová sada Iris), grafický výstup https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/111_fe­atures_selection_graphical­.py
       
112 112_simplest_linear_regression.py lineární regrese bodů ležících v rovině https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/112_sim­plest_linear_regression.py
113 113_linear_regression_no_intercept.py lineární regrese při vynucení w0=0 pro obecná data https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/113_li­near_regression_no_intercep­t.py
114 114_linear_regression_from0_0.py lineární regrese při vynucení w0=0 v případě, že vstupní body obsahují počátek souřadného systému https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/114_li­near_regression_from0_0.py
115 115_linear_regression_multiple_y.py model předpovídající pro každou vstupní hodnotu dvě výstupní hodnoty (odpovědi) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/115_li­near_regression_multiple_y­.py
116 116_grid_operations.py konstrukce matice obsahující souřadnice bodů v mřížce https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/116_grid_o­perations.py
117 117_linear_regression_multiple_x.py proložení bodů v prostoru rovinou https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/117_li­near_regression_multiple_x­.py
118 118_linear_regression_multiple_x.py proložení bodů s náhodnou výškou rovinou https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/118_li­near_regression_multiple_x­.py
119 119_linear_regression_mul­tiple_x_and_y.py proložení dvou sad bodů dvojicí rovin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/119_li­near_regression_multiple_x_an­d_y.py
120 120_linear_regression_mul­tiple_x_and_y.py proložení dvou sad bodů dvojicí rovin https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/120_li­near_regression_multiple_x_an­d_y.py
121 121_linear_regression_poly.py základní polynomická regrese https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/121_li­near_regression_poly.py
122 122_linear_regression_poly_mul­tiple_x.py polynomická regrese a body v prostoru, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/122_li­near_regression_poly_multi­ple_x.py
123 123_linear_regression_poly_mul­tiple_x.py polynomická regrese a body v prostoru, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/123_li­near_regression_poly_multi­ple_x.py
       
124 124_iris_set_statistic.py získání statistických informací o datové sadě Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/124_i­ris_set_statistic.py
125 125_california_housings_statistic.py získání statistických informací o datové sadě California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/125_ca­lifornia_housings_statistic­.py
126 126_variance_threshold1.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/126_va­riance_threshold1.py
127 127_variance_threshold2.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/127_va­riance_threshold2.py
128 128_variance_threshold3.py výběr atributů pro trénink modelu pomocí VarianceThreshold https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/128_va­riance_threshold3.py
129 129_select_best_iris.py výběr nejvhodnějších atributů pro datovou sadu Iris https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/129_se­lect_best_iris.py
130 130_select_best_housings.py výběr nejvhodnějších atributů pro datovou sadu California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/130_se­lect_best_housings.py
131 131_select_k_best_housings.py výběr K nejvhodnějších atributů pro datovou sadu California Housings https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/131_se­lect_k_best_housings.py
132 132_select_from_model.py výběr atributů na základě k tomu určeného modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/132_se­lect_from_model.py
133 133_cross_validation1.py křížová validace po výběru (filtraci) modelů (datová sada Iris) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/133_cros­s_validation1.py
134 134_cross_validation2.py křížová validace po výběru (filtraci) modelů (datová sada California Housings) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/134_cros­s_validation2.py
135 135_cross_validation3.py křížová validace po výběru (filtraci) modelů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/135_cros­s_validation3.py
       
136 136_mlp_classifier01.py použití neuronové sítě pro klasifikaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/136_mlp_clas­sifier01.py
137 137_mlp_classifier02.py výpočet úspěšnosti modelu založeného na neuronové síti https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/137_mlp_clas­sifier02.py
138 138_mlp_classifier03.py konfigurace vrstev neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/138_mlp_clas­sifier03.py
139 139_mlp_classifier04.py proměnný počet neuronů ve vrstvách neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/139_mlp_clas­sifier04.py
140 140_mlp_classifier05.py proměnný počet neuronů ve více vrstvách neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/140_mlp_clas­sifier05.py
       
141 141_mlp_regression1.py použití neuronové sítě pro regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/141_mlp_re­gression1.py
142 142_mlp_regression2.py modifikace parametrů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/142_mlp_re­gression2.py
143 143_mlp_regression2.py další modifikace parametrů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/143_mlp_re­gression2.py
144 144_mlp_regression3.py postupná změna počtu neuronů v jedné skryté vrstvě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/144_mlp_re­gression3.py
145 145_mlp_regression4.py postupná změna počtu neuronů ve třech skrytých vrstvách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/145_mlp_re­gression4.py
146 146_mlp_regression5.py postupná změna počtu neuronů v pěti skrytých vrstvách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/146_mlp_re­gression5.py
147 147_mlp_regression6.py postupná změna počtu skrytých vrstev při zachování počtu neuronů v každé vrstvě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/147_mlp_re­gression6.py
       
148 148_confusion_matrix1.py zjištění kvality modelu s využitím matice záměn (confusion matrix) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/148_con­fusion_matrix1.py
149 149_confusion_matrix2.py zjištění kvality modelu hledajícího K nejbližších sousedů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/149_con­fusion_matrix2.py
150 150_confusion_matrix3.py zjištění kvality modelu tvořeného neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/150_con­fusion_matrix3.py
       
151 151_multiplication_table.py využití neuronové sítě pro odhad výsledků součinu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/151_mul­tiplication_table.py
152 152_multiplication_table.py odhad/vygenerování celé matice malé násobilky neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/152_mul­tiplication_table.py
153 153_multiplication_table.py rozšíření výpočtu součinu na rozsah 20×20 (při zachování původní sítě) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/153_mul­tiplication_table.py
       
154 154_images1.py rozpoznání číslic modelem provádějícím logistickou regresi https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/154_i­mages1.py
155 155_images2.py rozpoznání číslic: využití modelu SVM (metoda podpůrných vektorů) pro klasifikaci obrázků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/155_i­mages2.py
156 156_images3.py rozpoznání číslic: využití modelu pro hledání K nejbližších sousedů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/156_i­mages3.py
157 157_images4.py rozpoznání rastrových obrázků neuronovou sítí https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/157_i­mages4.py
158 158_all_predictions.py zobrazení původních obrázků i predikovaných výsledků ve vizuální podobě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/158_a­ll_predictions.py
159 159_wrong_predictions.py zobrazení 25 nekorektních odhadů modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/159_wron­g_predictions.py
160 160_nn_wrong_predictions.py zobrazení 25 nekorektních odhadů neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/160_nn_wron­g_predictions.py
       
161 161_activation_function.py specifikace aktivační funkce neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/161_ac­tivation_function.py
162 162_solver.py specifikace trénovacího a učícího algoritmu neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/162_solver.py
163 163_best_combination.py kombinace nejlepší aktivační funkce a nejlepšího trénovacího algoritmu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/163_bes­t_combination.py
       
164 164_simplestnn.py neuronová síť s pouhými třemi neurony https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/164_sim­plestnn.py
165 165_no_randomization.py odstranění náhody z procesu tréninku a testování neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/165_no_ran­domization.py
166 166_step_by_step.py postupné zvětšování počtu vzorků použitých pro trénink neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/166_step_by_step­.py
167 167_weights_biases.py grafické znázornění závislosti MSE, vah neuronů a biasu na počtu vzorků https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/167_we­ights_biases.py
168 168_maxiter.py zrychlení tréninku neuronové sítě snížením počtu iterací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/168_ma­xiter.py
169 169_learning_rate.py vyšší míra změny vah na vstupu neuronů při tréninku https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/169_le­arning_rate.py
170 170_too_fast_rate.py riziko příliš vysoké hodnoty learning_rate_init https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/170_to­o_fast_rate.py
171 171_too_slow_rate.py opačný extrém – příliš malá hodnota learning_rate_init https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/171_to­o_slow_rate.py
       
172 172_download_dataset.py získání datové sady s tweety o dopravcích https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/172_dow­nload_dataset.py
173 173_download_stopwords.py získání slovníku se stopslovy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/173_dow­nload_stopwords.py
174 174_read_airline_tweets.py načtení datové sady s tweety o dopravcích https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/174_re­ad_airline_tweets.py
175 175_airline_tweets_info.py informace o načtené datové sadě s tweety o dopravcích https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/175_a­irline_tweets_info.py
176 176_airline_tweets_statistic.py základní statistické údaje o datové sadě s tweety o dopravcích https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/176_a­irline_tweets_statistic.py
177 177_tweets_per_airline.py statistika: počet tweetů o jednotlivých dopravcích https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/177_twe­ets_per_airline.py
178 178_tweets_bar_chart.py vizualizace počtu tweetů o jednotlivých dopravcích na sloupcovém diagramu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/178_twe­ets_bar_chart.py
179 179_tweets_pie_chart.py vizualizace počtu tweetů o jednotlivých dopravcích na koláčovém diagram https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/179_twe­ets_pie_chart.py
180 180_sentiments.py výpočet hodnocení jednotlivých dopravců https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/180_sen­timents.py
181 181_sentiments_piechart.py vizualizace hodnocení jednotlivých dopravců https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/181_sen­timents_piechart.py
182 182_sentiment_per_airline.py výpočet hodnocení vztažených k jednotlivým dopravcům https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/182_sen­timent_per_airline.py
183 183_sentiment_per_airline.py výpočet hodnocení vztažených k jednotlivým dopravcům https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/183_sen­timent_per_airline.py
184 184_features.py přečtení potřebných atributů z datové sady pro trénink modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/184_fe­atures.py
185 185_processing.py předzpracování textových dat https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/185_pro­cessing.py
186 186_vectorization.py vektorizace textových dat pomocí třídy CountVectorizer https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/186_vec­torization.py
187 187_vectorization.py vektorizace textových dat pomocí třídy TfidfVectorizer https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/187_vec­torization.py
188 188_vectorization_and_training.py trénink modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/188_vec­torization_and_training.py
189 189_vectorization_andnn.py trénink modelu s využitím neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/189_vec­torization_andnn.py
       
190 190_count_vectorizer.py základní vektorizace s využitím třídy CountVectorizer https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/190_cou­nt_vectorizer.py
191 191_words_to_vec.py převod sekvence slov do vektorové podoby https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/191_wor­ds_to_vec.py
192 192_vec_to_words.py zpětný převod z vektorové podoby na sekvenci slov https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/192_vec_to_wor­ds.py
193 193_use_english_stopwords.py použití anglických stopslov při vektorizaci https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/193_u­se_english_stopwords.py
194 194_correct_vec_to_words.py korektně realizovaný zpětný převod z vektorové podoby na sekvenci slov https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/194_co­rrect_vec_to_words.py
195 195_tfidf_transformer.py vektorizace s využitím třídy TfidfTransformer https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/195_tfid­f_transformer.py
196 196_more_frequent_words.py výsledná matice v případě, že se v dokumentech opakují slova https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/196_mo­re_frequent_words.py
197 197_tfidf_vectorizer.py vektorizace realizovaná s využitím třídy TfidfVectorizer https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/197_tfid­f_vectorizer.py
198 198_sentence_similarity.py nalezení podobných dokumentů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/198_sen­tence_similarity.py
       
199 199_cut_off.py vliv parametru cut off na výsledek vektorizace https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/199_cut_of­f.py
200 200_max_df.py vliv parametru max_df na výsledek vektorizace https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/200_max_df.py
201 201_tfid_vectorizer_check1.py zkoumání vlastnosti vektorizace pomocí třídy TfidfVectorizer: rozdílná slova, rozdílné dokumenty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/201_tfid_vec­torizer_check1.py
202 202_tfid_vectorizer_check2.py zkoumání vlastnosti vektorizace pomocí třídy TfidfVectorizer: opakující se slova https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/202_tfid_vec­torizer_check2.py
203 203_tfid_vectorizer_check3.py zkoumání vlastnosti vektorizace pomocí třídy TfidfVectorizer: kratší dokumenty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/203_tfid_vec­torizer_check3.py
204 204_tfid_vectorizer_check4.py zkoumání vlastnosti vektorizace pomocí třídy TfidfVectorizer: kratší dokumenty https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/204_tfid_vec­torizer_check4.py
       
205 205_spam_read.py pokus o přečtení datové sady se spamem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/205_spam_re­ad.py
206 206_spam_read_correct_encoding.py korektní načtení datové sady se spamem https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/206_spam_re­ad_correct_encoding.py
207 207_spam_value_count.py počet spamů a hamů https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/207_spam_va­lue_count.py
208 208_labels_features.py získání hodnot pro trénink modelu z datové sady https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/208_la­bels_features.py
209 209_dictionary.py slovník získaný vektorizací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/209_dic­tionary.py
210 210_better_dictionary_output.py vylepšený tisk obsahu slovníku získaného vektorizací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/210_bet­ter_dictionary_output.py
211 211_spam_vectorization.py vlastní vektorizace datové sady https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/211_spam_vec­torization.py
212 212_basic_filtering.py filtrace textů SMSek před vektorizací https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/212_ba­sic_filtering.py
213 213_vectorization_after_filtering.py vektorizace vyfiltrovaných textů SMSek https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/213_vec­torization_after_filterin­g.py
214 214_basic_training.py trénink modelu pro rozpoznání spamů v SMSkách https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/214_ba­sic_training.py
215 215_tfidf_training.py trénink modelu s využitím odlišného vektorizéru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/215_tfid­f_training.py
216 216_ngrams.py n-gramy a vektorizace textu (SMSek) https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/216_ngrams.py
217 217_ngrams_training.py trénink modelu nad slovníkem s n-gramy https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/217_ngram­s_training.py
218 218_ngrams_tfidf_training.py trénink modelu nad slovníkem s n-gramy, použití odlišného vektorizéru https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/218_ngram­s_tfidf_training.py
219 219_various_ngrams.py zjištění, jak velké n-gramy jsou nejvhodnější pro trénink modelu https://github.com/tisnik/most-popular-python-libs/blob/master/sklearn/219_va­rious_ngrams.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. Python for NLP: Sentiment Analysis with Scikit-Learn
    https://stackabuse.com/python-for-nlp-sentiment-analysis-with-scikit-learn/
  2. Datová sada – hodnocení leteckých dopravců
    https://raw.githubusercon­tent.com/satyajeetkrjha/kag­gle-Twitter-US-Airline-Sentiment-/refs/heads/master/Tweets.csv
  3. Twitter_US_Airline_Sentiment_Analysis
    https://github.com/rustagi­janvi/Twitter_US_Airline_Sen­timent_Analysis/tree/main
  4. Shluková analýza (clustering) a knihovna Scikit-learn
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn/
  5. Shluková analýza (clustering) a knihovna Scikit-learn (2)
    https://www.root.cz/clanky/shlukova-analyza-clustering-a-knihovna-scikit-learn-2/
  6. 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/
  7. Rozpoznávání obrázků knihovnou Scikit-learn: první kroky
    https://www.root.cz/clanky/roz­poznavani-obrazku-knihovnou-scikit-learn-prvni-kroky/
  8. scikit-learn: Machine Learning in Python
    https://scikit-learn.org/stable/index.html
  9. Sklearn-pandas
    https://github.com/scikit-learn-contrib/sklearn-pandas
  10. sklearn-xarray
    https://github.com/phausamann/sklearn-xarray/
  11. Clustering
    https://scikit-learn.org/stable/modules/clus­tering.html
  12. Cluster analysis (Wikipedia)
    https://en.wikipedia.org/wi­ki/Cluster_analysis
  13. Shluková analýza (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Shlukov%C3%A1_anal%C3%BDza
  14. K-means
    https://cs.wikipedia.org/wiki/K-means
  15. k-means clustering
    https://en.wikipedia.org/wiki/K-means_clustering
  16. Spectral clustering
    https://en.wikipedia.org/wi­ki/Spectral_clustering
  17. Emergence
    https://cs.wikipedia.org/wi­ki/Emergence
  18. Particle Life: Vivid structures from rudimentary rules
    https://particle-life.com/
  19. Hertzsprungův–Russellův diagram
    https://cs.wikipedia.org/wi­ki/Hertzsprung%C5%AFv%E2%80%93Rus­sell%C5%AFv_diagram
  20. Using Machine Learning in an HR Diagram
    https://cocalc.com/share/pu­blic_paths/08b6e03583cbdef3cdb98­13a54ec68ff773c747f
  21. Gaia H-R diagrams: Querying Gaia data for one million nearby stars
    https://vlas.dev/post/gaia-dr2-hrd/
  22. The Hertzsprung–Russell diagram
    https://scipython.com/book2/chapter-9-data-analysis-with-pandas/problems/p92/the-hertzsprung-russell-diagram/
  23. Animated Hertzsprung-Russell Diagram with 119,614 datapoints
    https://github.com/zonination/h-r-diagram
  24. Neuraxle Pipelines
    https://github.com/Neuraxio/Neuraxle
  25. scikit-learn: Getting Started
    https://scikit-learn.org/stable/getting_started.html
  26. Support Vector Machines
    https://scikit-learn.org/stable/modules/svm.html
  27. Use Deep Learning to Detect Programming Languages
    http://searene.me/2017/11/26/use-neural-networks-to-detect-programming-languages/
  28. Natural-language processing
    https://en.wikipedia.org/wiki/Natural-language_processing
  29. THE MNIST DATABASE of handwritten digits
    http://yann.lecun.com/exdb/mnist/
  30. MNIST database (Wikipedia)
    https://en.wikipedia.org/wi­ki/MNIST_database
  31. MNIST For ML Beginners
    https://www.tensorflow.or­g/get_started/mnist/begin­ners
  32. Stránka projektu Torch
    http://torch.ch/
  33. Torch: Serialization
    https://github.com/torch/tor­ch7/blob/master/doc/seria­lization.md
  34. Torch: modul image
    https://github.com/torch/i­mage/blob/master/README.md
  35. Data pro neuronové sítě
    http://archive.ics.uci.edu/ml/in­dex.php
  36. Torch na GitHubu (několik repositářů)
    https://github.com/torch
  37. Torch (machine learning), Wikipedia
    https://en.wikipedia.org/wi­ki/Torch_%28machine_learnin­g%29
  38. Torch Package Reference Manual
    https://github.com/torch/tor­ch7/blob/master/README.md
  39. Torch Cheatsheet
    https://github.com/torch/tor­ch7/wiki/Cheatsheet
  40. Neural network containres (Torch)
    https://github.com/torch/nn/blob/mas­ter/doc/containers.md
  41. Simple layers
    https://github.com/torch/nn/blob/mas­ter/doc/simple.md#nn.Line­ar
  42. Transfer Function Layers
    https://github.com/torch/nn/blob/mas­ter/doc/transfer.md#nn.tran­sfer.dok
  43. Feedforward neural network
    https://en.wikipedia.org/wi­ki/Feedforward_neural_net­work
  44. Biologické algoritmy (4) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-4-neuronove-site/
  45. Biologické algoritmy (5) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-5-neuronove-site/
  46. Umělá neuronová síť (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Um%C4%9Bl%C3%A1_neuronov%C3%A1_s%C3%AD%C5%A5
  47. PyTorch
    http://pytorch.org/
  48. JupyterLite na PyPi
    https://pypi.org/project/jupyterlite/
  49. JupyterLite na GitHubu
    https://github.com/jupyter­lite/jupyterlite
  50. Dokumentace k projektu JupyterLite
    https://github.com/jupyter­lite/jupyterlite
  51. Matplotlib Home Page
    http://matplotlib.org/
  52. Matplotlib (Wikipedia)
    https://en.wikipedia.org/wi­ki/Matplotlib
  53. Popis barvových map modulu matplotlib.cm
    https://gist.github.com/en­dolith/2719900#id7
  54. Ukázky (palety) barvových map modulu matplotlib.cm
    http://matplotlib.org/exam­ples/color/colormaps_refe­rence.html
  55. Galerie grafů vytvořených v Matplotlibu
    https://matplotlib.org/3.2.1/gallery/
  56. 3D rendering
    https://en.wikipedia.org/wi­ki/3D_rendering
  57. 3D computer graphics
    https://en.wikipedia.org/wi­ki/3D_computer_graphics
  58. Primary 3D view planes
    https://matplotlib.org/sta­ble/gallery/mplot3d/view_pla­nes_3d.html
  59. Getting started in scikit-learn with the famous iris dataset
    https://www.youtube.com/wat­ch?v=hd1W4CyPX58
  60. Training a machine learning model with scikit-learn
    https://www.youtube.com/wat­ch?v=RlQuVL6-qe8
  61. Iris (plant)
    https://en.wikipedia.org/wi­ki/Iris_(plant)
  62. Kosatec
    https://cs.wikipedia.org/wiki/Kosatec
  63. Iris setosa
    https://en.wikipedia.org/wi­ki/Iris_setosa
  64. Iris versicolor
    https://en.wikipedia.org/wi­ki/Iris_versicolor
  65. Iris virginica
    https://en.wikipedia.org/wi­ki/Iris_virginica
  66. Druh
    https://cs.wikipedia.org/wiki/Druh
  67. Iris subg. Limniris
    https://en.wikipedia.org/wi­ki/Iris_subg._Limniris
  68. Iris Dataset Classification with Python: A Tutorial
    https://www.pycodemates.com/2022/05/i­ris-dataset-classification-with-python.html
  69. Iris flower data set
    https://en.wikipedia.org/wi­ki/Iris_flower_data_set
  70. List of datasets for machine-learning research
    https://en.wikipedia.org/wi­ki/List_of_datasets_for_machi­ne-learning_research
  71. Analýza hlavních komponent
    https://cs.wikipedia.org/wi­ki/Anal%C3%BDza_hlavn%C3%AD­ch_komponent
  72. Principal component analysis
    https://en.wikipedia.org/wi­ki/Principal_component_ana­lysis
  73. Scikit-learn Crash Course – Machine Learning Library for Python
    https://www.youtube.com/wat­ch?v=0B5eIE_1vpU
  74. calm-notebooks
    https://github.com/koaning/calm-notebooks
  75. Should you teach Python or R for data science?
    https://www.dataschool.io/python-or-r-for-data-science/
  76. nbviewer: A simple way to share Jupyter Notebooks
    https://nbviewer.org/
  77. AI vs Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=4RixMPF4×is
  78. Machine Learning | What Is Machine Learning? | Introduction To Machine Learning | 2024 | Simplilearn (Youtube)
    https://www.youtube.com/wat­ch?v=ukzFI9rgwfU
  79. A Gentle Introduction to Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=Gv9_4yMHFhI
  80. Machine Learning vs Deep Learning
    https://www.youtube.com/wat­ch?v=q6kJ71tEYqM
  81. Umělá inteligence (slajdy)
    https://slideplayer.cz/sli­de/12119218/
  82. Úvod do umělé inteligence
    https://slideplayer.cz/slide/2505525/
  83. Umělá inteligence I / Artificial Intelligence I
    https://ktiml.mff.cuni.cz/~bartak/ui/
  84. 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/
  85. Matplotlib, Seaborn or Plotnine?
    https://www.reddit.com/r/da­tascience/comments/jvrqxt/mat­plotlib_seaborn_or_plotni­ne/
  86. @Rabeez: Rabeez/plotting_comparison.ipynb
    https://gist.github.com/Ra­beez/ffc0b59d4a41e20fa8d94­4c44a96adbc
  87. Matplotlib, Seaborn, Plotly and Plotnine Comparison
    https://python.plainenglish­.io/matplotlib-seaborn-plotly-and-plotnine-comparison-baf2db5a9c40
  88. Data Visualization 101: How to Choose a Python Plotting Library
    https://towardsdatascience.com/data-visualization-101-how-to-choose-a-python-plotting-library-853460a08a8a
  89. Data science in Python: pandas, seaborn, scikit-learn
    https://www.youtube.com/wat­ch?v=3ZWuPVWq7p4
  90. 7.2. Real world datasets
    https://scikit-learn.org/stable/datasets/re­al_world.html#california-housing-dataset
  91. 7.2.7. California Housing dataset
    https://scikit-learn.org/stable/datasets/re­al_world.html#california-housing-dataset
  92. Comprehensive Guide to Classification Models in Scikit-Learn
    https://www.geeksforgeeks­.org/comprehensive-guide-to-classification-models-in-scikit-learn/
  93. Tidy Data Visualization: ggplot2 vs seaborn
    https://blog.tidy-intelligence.com/posts/ggplot2-vs-seaborn/
  94. seaborn: statistical data visualization
    https://seaborn.pydata.org/
  95. Linear regression (Wikipedia)
    https://en.wikipedia.org/wi­ki/Linear_regression
  96. Lineární regrese (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_regre­se
  97. Iris Flower Classification with MLP Classifier
    https://www.metriccoders.com/post/iris-flower-classification-with-mlp-classifier
  98. SMS Spam Collection Dataset
    https://www.kaggle.com/da­tasets/uciml/sms-spam-collection-dataset

Autor článku

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