Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 9: Różnice pomiędzy wersjami

Z Brain-wiki
(Utworzono nową stronę "=Naiwny kalsyfikator Bayesa= Z klasyfikatorem tym zapoznamy się próbując klasyfikować gatunki irysów. Jest to klasyczny już problem, często wykorzystywany przy po...")
 
Linia 96: Linia 96:
 
# rysowanie wyników klasyfikacji             
 
# rysowanie wyników klasyfikacji             
 
# przekształcamy siatkę w macierz dwukolumnową - kolumny odpowiadają cechom
 
# przekształcamy siatkę w macierz dwukolumnową - kolumny odpowiadają cechom
XX = np.c_[xx.ravel(), yy.ravel()]      
+
XX = np.c_[xx.ravel(), yy.ravel()]      
Z = gnb.predict(XX)
+
# dla każdego punktu siatki oblicz predykcję klasyfikatora 
 +
Z = ....
  
 +
# te predykcje narysujemy w przestrzeni cech za pomocą funkcji  plt.contourf
 
plt.figure(3)
 
plt.figure(3)
 
Z = Z.reshape(xx.shape)
 
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
+
plt.contourf(..., ..., ..., cmap=plt.cm.Paired)
plt.scatter(X[:,0],X[:,1],c = colors)
+
# i dorzucamy oryginalne punkty
 +
plt.scatter...
 
plt.title(u'Podział przestrzeni cech na klasy')
 
plt.title(u'Podział przestrzeni cech na klasy')
 
plt.show()
 
plt.show()
  
 
   
 
   
 
+
# Teraz zajmiemy się ewaluacją dopasowanego modelu. Skorzystamy z
 
# http://scikit-learn.org/stable/modules/model_evaluation.html
 
# http://scikit-learn.org/stable/modules/model_evaluation.html
 
print("classification report:")
 
print("classification report:")
print(classification_report(iris.target, y_pred, target_names=iris['target_names']))
+
print(classification_report...)
 
 
 
print("confusion matrix:")
 
print("confusion matrix:")
print(confusion_matrix(iris.target, y_pred))
+
print(confusion_matrix...)
 
</source>
 
</source>

Wersja z 14:54, 30 gru 2015

Naiwny kalsyfikator Bayesa

Z klasyfikatorem tym zapoznamy się próbując klasyfikować gatunki irysów. Jest to klasyczny już problem, często wykorzystywany przy porównywaniu różnych technik klasyfikacji. Więcej o pochodzeniu tych danych i problemie można przeczytać tu [1]

Kod napiszemy w oparciu o implementacje klasyfikatora Bayesa z biblioteki scikit-learn [2]

Zaczerpniemy stamtąd:

  • obiekt klasyfikatora GaussianNB
  • zbiór danych
  • funkcje do oceny jakości

Zatem importujemy:

# -*- coding: utf-8 -*-
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

Przyda nam się potem funkcja rysująca dwuwymiarowe rozkłady Gaussa

def plot_gauss(mu,sigma,xx,yy):
    ''' Funkcja rysująca kontury funkcji gęstości prawdopodobieństwa 
       dwuwymiarowego rozkładu Gaussa'''

    XX = np.c_[xx.ravel(), yy.ravel()]    
    R = XX - mu 
    invS = np.linalg.inv(np.diag(sigma))
    z = np.zeros(len(R))
    for i in range(len(R)):
        z[i] = np.exp(-0.5*np.dot( R[i,:].T,np.dot(invS,R[i,:])))
    z.shape = xx.shape
    plt.contourf(xx,yy,z,alpha = 0.5)
    plt.plot(mu[0],mu[1],'o')

Zapoznajemy się z danymi i wybieramy ich podzbiór do dalszej zabawy:

#ładujemy dane
iris = datasets.load_iris() #https://en.wikipedia.org/wiki/Iris_flower_data_set

# zapoznajemy się z tymi danymi
print iris['DESCR']
# rysujemy zależniści między cechami
# przygotowujemy własną mapę kolorów
color_map = {-1: (1, 1, 1), 0: (0, 0, .9), 1: (1, 0, 0), 2: (.5, .5, 0)}
# wytwarzamy wektor, który każdemu wierszowi w tabeli danych przypisze kolor odpowiadający gatunkowi irysa
colors = [color_map[y] for y in iris.target]
plt.figure(1)
plt.title(u'rozkłady cech w klasach')
for i, name in enumerate(iris['feature_names']):
    for j, name in enumerate(iris['feature_names']):
        plt.subplot(4,4,i*4+j+1)
        plt.scatter(iris.data[:,i],iris.data[:,j],c = colors)
          
# wybieramy cechy 2 i 3 i normalizujemy je
X = np.zeros((iris.data.shape[0],2))
X[:,0] = (iris.data[:,2] - np.mean(iris.data[:,2]))/np.std(iris.data[:,2])
X[:,1] = (iris.data[:,3] - np.mean(iris.data[:,3]))/np.std(iris.data[:,3])  
plt.figure(2)
plt.scatter(X[:,0],X[:,1],c = colors)  
plt.title('Wybrane cechy po normalizacji')
plt.show()

Poniżej znajduje się kod służący klasyfikacji. Proszę go uzupełnić zgodnie z komentarzami i dokumentacją [3]

#########################################################

gnb =... # stwórz instancję klasyfikatora  Gaussian Naive Bayes 
... # dofituj parametry klasyfikatora 

# przedstaw rozkłady Gaussa, które zostały dopasowane do danych, skorzystaj z funkcji plot_gauss()
# średnie tych rozkładów są w gnb.theta_
# standardowe odchylenia są w gnb.sigma_
# przygotowanie siatki na której będą rysowane kontury Gaussów
x_min, x_max = -3,3
y_min, y_max = -3,3
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))
plt.figure(4)
for i in range(3):
    plot_gauss(...,...,xx,yy)
# dorzućmy do rysunku jeszcze oryginalne dane
plt.scatter(...,...,c = colors)
plt.title(u'Rozkłady Gaussa dopasowane do danych')
plt.show()        
      
# rysowanie wyników klasyfikacji             
# przekształcamy siatkę w macierz dwukolumnową - kolumny odpowiadają cechom
XX = np.c_[xx.ravel(), yy.ravel()]       
# dla każdego punktu siatki oblicz predykcję klasyfikatora  
Z = ....

# te predykcje narysujemy w przestrzeni cech za pomocą funkcji  plt.contourf 
plt.figure(3)
Z = Z.reshape(xx.shape)
plt.contourf(..., ..., ..., cmap=plt.cm.Paired)
# i dorzucamy oryginalne punkty
plt.scatter...
plt.title(u'Podział przestrzeni cech na klasy')
plt.show()

 
# Teraz zajmiemy się ewaluacją dopasowanego modelu. Skorzystamy z
# http://scikit-learn.org/stable/modules/model_evaluation.html
print("classification report:")
print(classification_report...)
print("confusion matrix:")
print(confusion_matrix...)