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).
Držme se našeho rybího trhu a ukažme si to na příkladu. Úloha predikovat váhu ryby byla regresní úloha, predikovali jsme spojitou hodnotu. 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.
Zkusíme se ale nejdřív podívat na úlohu klasifikace z pohledu, který už známe, tedy z pohledu krajiny.
# načeteme si data
import pandas as pd
data = pd.read_csv("static/fish_data.csv", index_col=0)
data
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?
Přinášíme opět nějakou základní nabídku klasifikačních modelů:
Vyberete si jeden model a zkuste natrénovat na ryby.
# připravme data
y = data["Species"] == "Perch"
y = y.astype(int)
X = data.drop(columns=["ID", "Species"])
# vezměme klasifikátor
# můžeš změnit
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
# 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)
# natrénujte
model.fit(X_train, y_train)
# ohodnoťme validační množinu
pred = model.predict(X_test)
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)}")
print(f"Úspěšnost: {100*sum(y_test == pred)/len(y_test):.2f} %")
Ú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č?
Nejprve projdeme klasifikační metriky. Pokud studuješ sama, nastuduj si kapitolu o klasifikačních metrikách a pak se vrať k tomuto cvičení.
Vyber si metriku pro naši úlohu a zkus najít, co nejlepší klasifikátor. Pak si načti testovací množinu a podívej se, jaké tvůj klasifikátor dává výsledky.
# načtení data
test_data = pd.read_csv("static/fish_data.csv", index_col=0)
y_test = test_data["Species"] == "Perch"
y_test = y_test.astype(int)
X_test = test_data.drop(columns=["ID", "Species"])
# zkus naučit různé modely a vyber nejlepší
...
# predikce
test_pred = model.predict(X_test)
# zkus přidat zvolenou metriku
print(f"Skutečná třída: Predikce:")
for true, predicted in zip(y_test, test_pred):
print(f"{true:<15} {predicted:<10} {'OK' if true == predicted else 'X'}")
print(f"Počet chyb: {sum(y_test != test_pred)}")
print(f"Úspěšnost: {100*sum(y_test == test_pred)/len(y_test):.2f} %")