Několik typů klasifikátorů:
Dva základní typy učení:
Dobrým pomocníkem je balík scikits-learn (sklearn).
%pylab inline --no-import-all
from sklearn import datasets
import numpy as np
import sklearn.model_selection
Načtení trénovacích dat. Jde o kosatec (iris flower) a jeho tři poddruhy: Iris setosa, Iris versicolor, Iris virginica. Měří se délka kalichu, šířka kalichu, délka okvětního lístku a šířka okvětního lístku.
iris = datasets.load_iris()
# cílové třídy
# rozměry dat
print("data ", iris.data.shape)
print(iris.data[-10:,:])
print("")
print("target", iris.target.shape)
print(np.unique(iris.target))
print(iris.target[-10:])
Nejbližší soused
K - nejbližší soused
Počítání minimální vzdálenosti
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier()
knn.fit(iris.data, iris.target)
#KNeighborsClassifier(...)
predikce = knn.predict([[0.1, 0.2, 0.3, 0.4]])
print predikce
#array([0])
Při experimentování je důležité rozdělit data na trénovací a testovací sadu.
perm = np.random.permutation(iris.target.size)
iris.data = iris.data[perm]
iris.target = iris.target[perm]
train_data = iris.data[:100]
train_target = iris.target[:100]
test_data = iris.data[100:]
test_target = iris.target[100:]
knn.fit(train_data, train_target)
knn.score(test_data, test_target)
import sklearn.naive_bayes
gnb = sklearn.naive_bayes.GaussianNB()
gnb.fit(train_data, train_target)
y_pred = gnb.predict(test_data)
print("Number of mislabeled points : %d" % (test_target != y_pred).sum())
Rozděluje data nadrovinou
from sklearn import svm
svc = svm.SVC()
svc.fit(train_data, train_target)
y_pred = svc.predict(test_data)
print("Number of mislabeled points : %d" % (test_target != y_pred).sum())
Cílem je rodělit obrazy bez další informace do skupin - shluků
Vstup
výstup
Pro jednoduché případy lze použít algoritmus K-Means. Pro složitější natrénování Bayessova klasifikátoru je využíván EM-algoritmus.
Klasifikovat objekty v obraze
https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/ctverce_hvezdy_kolecka.jpg
https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/01.jpg
https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/02.jpg
...
https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/16.jpg
https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/17.jpg
import scipy
import urllib
import cStringIO
import skimage
import skimage.color
import skimage.filter
import skimage.measure
import skimage.io
from sklearn import svm
# URL = "http://uc452cam01-kky.fav.zcu.cz/snapshot.jpg"
URL = "https://raw.githubusercontent.com/mjirik/ZDO/master/objekty/ctverce_hvezdy_kolecka.jpg"
img = skimage.io.imread(URL, as_grey=True)
plt.imshow(img)
# doporučený klasifikátor ...
# pozor na labeling a "+1 problém"
v notes
Pclass is a proxy for socio-economic status (SES) 1st ~ Upper; 2nd ~ Middle; 3rd ~ Lower
Age is in Years; Fractional if Age less than One (1) If the Age is estimated, it is in the form xx.5
Fare is in Pre-1970 British Pounds () Conversion Factors: 1 = 12s = 240d and 1s = 20d
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset("titanic")
titanic
titanic["psex"] = titanic["sex"] == "male"
sns.factorplot(x="sex", kind="count", data=titanic)
sns.factorplot(x="class", hue="sex", kind="count", data=titanic)
g = sns.factorplot(x="class", y="survived", hue="sex", data=titanic, kind="bar")# ,size=6 , palette="muted")
g.despine(left=True)
g.set_ylabels("survival probability")
fg = sns.FacetGrid(titanic, hue="sex", aspect=3)
fg.map(sns.kdeplot, "age", shade=True)
fg.add_legend()
fg.set(xlim=(0, 80));
fg = sns.FacetGrid(titanic, hue="class", aspect=3, palette="BuPu_d")
fg.map(sns.kdeplot, "age", shade=True)
fg.set(xlim=(0, 80));
fg.add_legend()
titanic_drp = titanic[["pclass", "age", "survived"]].dropna(how="any")
X = titanic_drp[["pclass", "age"]]
y = titanic_drp[["survived"]]
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.33, random_state=42)
import sklearn.naive_bayes
gnb = sklearn.naive_bayes.GaussianNB()
gnb.fit(X_train, y_train)
# #KNeighborsClassifier(...)
y_pred = gnb.predict(X_test)
y_pred
print (sklearn.metrics.classification_report(y_test, y_pred))
print (sklearn.metrics.confusion_matrix(y_test, y_pred))
titanic_drp = titanic[["pclass", "age", "psex", "survived"]].dropna(how="any")
X = titanic_drp[["pclass", "age", "psex"]]
y = titanic_drp[["survived"]]
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.33, random_state=42)
import sklearn.naive_bayes
gnb = sklearn.naive_bayes.GaussianNB()
gnb.fit(X_train, y_train)
# #KNeighborsClassifier(...)
y_pred = gnb.predict(X_test)
print (sklearn.metrics.classification_report(y_test, y_pred))
rozdílový obraz
kumulativní obraz
Klíčové body