Nauč se Python > Kurzy > Datový kurz PyLadies > Strojové učení - klasifikace > Úvod klasifikace

Klasifikace

Zatím jsme se zabývali jen regresními úlohami. Učení s učitelem ale zahrnuje dvě hlavní skupiny úloh - regresní úlohy a klasifikační úlohy. Zatímco u regresních úloh je výstupem modelu spojitá hodnota (float), v klasifikačních úlohách představuje výstup modelu indikátor třídy (label). Pokud budeme chtít predikovat druh ryby (Perch, Roach, Pike, ...), jedná se o predikci kategorické hodnoty, tedy o klasifikaci. Klasifikační úlohy mají trochu jiné vlastnosti a logiku, než úlohy regresní, proto existují modely přímo určené na takové úlohy. Říká se jim klasifikátory.

data

In [1]:
# načeteme si data 
import pandas as pd 

data = pd.read_csv("static/fish_data.csv", index_col=0)
data
Out[1]:
Species Weight Length1 Length2 Length3 Height Width ID
0 Bream 242.0 23.2 25.4 30.0 11.5200 4.0200 0
1 Bream 290.0 24.0 26.3 31.2 12.4800 4.3056 1
2 Bream 340.0 23.9 26.5 31.1 12.3778 4.6961 2
3 Bream 363.0 26.3 29.0 33.5 12.7300 4.4555 3
4 Bream 430.0 26.5 29.0 34.0 12.4440 5.1340 4
... ... ... ... ... ... ... ... ...
153 Smelt 9.8 11.4 12.0 13.2 2.2044 1.1484 153
154 Smelt 12.2 11.5 12.2 13.4 2.0904 1.3936 154
155 Smelt 13.4 11.7 12.4 13.5 2.4300 1.2690 155
156 Smelt 12.2 12.1 13.0 13.8 2.2770 1.2558 156
158 Smelt 19.9 13.8 15.0 16.2 2.9322 1.8792 158

123 rows × 8 columns

Úkol 1:

Nejčastějším druhem ryby je Perch. Naším cílem je vytvořit klasifikátor, který pro zadané míry (váha, různé délky a šířky) vrátí informaci, zda se jedná o druh Perch nebo jiný druh. (Máme tedy pro jednoduchost jen dvě třídy, Perch a ostatní.)

  • Uměla bys tuto úlohu napasovat na krajinu? Co by mohly být souřadnice a co nadmořská výška?

  • Pokud ses úspěšně poprala s předchozím dotazem, můžeš na klasifikaci použít některý z regresních modelů (ano, asi to nebude ideální, když jde o klasifikaci, ale zkusme nejdříve to, co již umíme). Co ale bude hodnota odezvy a jak ji budeme interpretovat?

Klasifikační modely

Přinášíme opět nějakou základní nabídku klasifikačních modelů:

Úkol 2:

Vyberete si jeden model a zkuste natrénovat na ryby.

In [2]:
# připravme data
y = data["Species"] == "Perch"
y = y.astype(int)
X = data.drop(columns=["ID", "Species"])
In [3]:
# vezměme klasifikátor 
# můžeš změnit 
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
In [4]:
# rozdělme na trénovací a validační množinu
from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test =  train_test_split(X, y)
In [5]:
# natrénujte
model.fit(X_train, y_train)
Out[5]:
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',
                       max_depth=None, max_features=None, max_leaf_nodes=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, presort='deprecated',
                       random_state=None, splitter='best')
In [6]:
# ohodnoťme validační množinu 
pred = model.predict(X_test)
In [7]:
print("Skutečná třída:  Predikce:")
for true, predicted in zip(y_test, pred):
    print(f"{true:<15}  {predicted:<10} {'OK' if true == predicted else 'X'}")

print(f"Počet chyb: {sum(y_test != pred)}")
Skutečná třída:  Predikce:
0                0          OK
0                0          OK
1                0          X
0                0          OK
0                0          OK
1                1          OK
0                0          OK
0                0          OK
0                0          OK
0                0          OK
1                1          OK
1                1          OK
1                1          OK
0                0          OK
0                0          OK
0                0          OK
0                0          OK
0                0          OK
1                0          X
0                0          OK
1                1          OK
0                0          OK
0                0          OK
1                1          OK
1                1          OK
0                0          OK
0                0          OK
1                1          OK
0                0          OK
0                0          OK
0                0          OK
Počet chyb: 2

Úkol 3:

  • Asi je jasné, že regresní metriky se nám na klasifikační úlohy moc nehodí. Co bys použila jako metriku pro klasifikační úlohu?

Úkol 4:

  • Jedna z možností je porovnávat procento úspěšně klasifikovaných vzorů. V našem případě, to bude:
In [8]:
print(f"Úspěšnost: {100*sum(y_test == pred)/len(y_test):.2f} %")
Úspěšnost: 93.55 %

Úspěšnost není úplně špatná, poznat druh ryby podle rozměrů není jendoduchá úloha.

Představ si ale, že budeme mít v datovou množinu se 100 rybami, 95 z nich bude typu Perch. Bude ti klasifikátor, který bude mít toto procento úspěšnosti (stejné jako vyšlo nám), připadat dobrý nebo ne? Proč?


Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.