W trakcie laboratorium uczymy się wygrywać w telewizyjnych teleturniejach, zgadywać do jakiej gromady należą nietoperze, ale też poznajemy naiwny klasyfikator Bayesa i sprawdzamy, jak ten model klasyfikatora zachowuje się na wybranych zbiorach danych.

jigsaw.jpg

Dla_zapominalskich

wzorNB.png

Przećwiczmy co to znaczy na przykładzie.

nazwa narodziny ssie mleko? liczba nóg czy lata? gromada
mysz żywe tak 4 nie ssaki
lew żywe tak 4 nie ssaki
wieloryb żywe tak 2 nie ssaki
kiwi jajo nie 2 nie ptaki
orzeł jajo nie 2 tak ptaki
bocian jajo nie 2 tak ptaki
nietoperz żywe tak 2 tak ???

Rapid Miner

  • Uruchom narzędzie Rapid Miner 6.5
  • Pobierz plik danych zoo.csv (opis)
  • Utwórz przepływ realizujący najprostsze zadanie klasyfikacji przy wykorzystaniu naiwnego klasyfikatora Bayesa. W tym celu wykorzystaj operator Read CSV do załadowania zbioru danych, a następnie przekaż zbiór danych do operatora Set Role, w którym wskaż atrybut type jako pełniący rolę zmiennej celu (ang. label). Dodatkowo, atrybut animal wskaż jako atrybut pełniący rolę identyfikatora. Tak zmodyfikowany zbiór danych prześlij do operatora Naive Bayes i uruchom przepływ.
  • Przejdź do widoku wykresów i obejrzyj rozkłady wartości zmiennej celu względem atrybutu feathers lub fins. Obejrzyj też rozkłady dla atrybutu numerycznego legs.
  • Zamień operator klasyfikatora na operator X-Validation, w fazie uczenia tego operatora umieść właśnie operator naiwnego klasyfikatora Bayesa, a w fazie testowania następujące po sobie operatory Apply Model i Performance (Classification). Twój przepływ powinien wyglądać tak: nbc1.png nbc2.png
  • Wstaw do fazy uczenia operatora X-Validation drugi operator realizujący model klasyfikatora bazującego na indukcji reguł (operator Rule Induction). Wyłącz operator Naive Bayes Classifier (z menu kontekstowego operatora wybierz opcję Enable Operator) i w jego miejsce wstaw operator indukcji reguł. Porównaj dokładność naiwnego klasyfikatora Bayesa i dokładność uzyskaną przez algorytm indukcji reguł.
  • Wprowadź do przepływu szum informacyjny zmieniając losowo 20% etykiet zwierząt. Ponownie porównaj wyniki uzyskiwane przez oba modele klasyfikacji.

Oracle Data Mining

titanic.jpg
  • Zaloguj się do bazy danych: iSQLPlus. Identyfikator połączenia to DBLAB01.
    • Ustaw zmienne środowiskowe które spowodują, że separator dziesiętny będzie poprawnie rozpoznawany.
    ALTER SESSION SET NLS_LANGUAGE = english;
    ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ".,";
  • Zapoznaj się ze strukturą i zawartością eksplorowanego zbioru danych
DESCRIBE titanic
 
SELECT * FROM titanic WHERE ROWNUM <= 20;
  • Usuń tabele z ustawieniami wykorzystywane przez algorytm (jeśli wykonujesz ćwiczenie po raz pierwszy, możesz pominąć ten krok)
DROP TABLE settings;
DROP TABLE priors;
  • Utwóz tabelę PRIORS i umieść w niej oszacowane prawdopodobieństo a priori przeżycia katastrofy statku
CREATE TABLE priors (
  target_value      VARCHAR(3),
  prior_probability NUMBER);
 
INSERT INTO priors VALUES ('no',0.5);
INSERT INTO priors VALUES ('yes',0.5);
COMMIT;
  • Utwórz tabelę do przechowywania parametrów algorytmu naiwnego klasyfikatora Bayesa
CREATE TABLE settings (
  setting_name VARCHAR2(30),
  setting_value VARCHAR2(128) 
);
  • Wypełnij tabelę parametrami dla algorytmu naiwnego klasyfikatora Bayesa. Ustaw progi singleton=1% i pairwise=0.5%
BEGIN       
  INSERT INTO settings VALUES (dbms_data_mining.algo_name,dbms_data_mining.algo_naive_bayes);
  INSERT INTO settings VALUES (dbms_data_mining.clas_priors_table_name,'PRIORS');
  INSERT INTO settings VALUES (dbms_data_mining.nabs_pairwise_threshold,0.005);
  INSERT INTO settings VALUES (dbms_data_mining.nabs_singleton_threshold,0.01);
  COMMIT;
END;
  • Usuń stary model klasyfikatora (jeśli wykonujesz ćwiczenie po raz pierwszy, możesz pominąć ten krok)
BEGIN 
  DBMS_DATA_MINING.DROP_MODEL('NaiveBayes');
EXCEPTION WHEN OTHERS THEN NULL; 
END;
  • Podziel zbiór danych na zbiór uczący i zbiór testowy
CREATE TABLE titanic_train AS
  SELECT * FROM titanic SAMPLE (66) PERCENT;
 
CREATE TABLE titanic_test AS
  SELECT * FROM titanic WHERE id NOT IN ( SELECT id FROM titanic_train );
  • Zbuduj model, który będzie zawierał naiwny klasyfikator Bayesa
BEGIN
  DBMS_DATA_MINING.CREATE_MODEL(
    model_name          => 'NaiveBayes',
    mining_function     => DBMS_DATA_MINING.CLASSIFICATION,
    data_table_name     => 'titanic_train',
    case_id_column_name => 'id',
    target_column_name  => 'survived',
    settings_table_name => 'settings');
END;
  • Wyświetl ustawienia modelu, tzn. odczytaj z repozytorium wartości parametrów z jakimi model został zbudowany
SELECT setting_name, setting_value
FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SETTINGS('NaiveBayes'))
ORDER BY setting_name;
  • Wyświetl sygnaturę modelu, tzn. odczytaj listę atrybutów z jakich model został zbudowany
SELECT attribute_name, attribute_type
FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SIGNATURE('NaiveBayes'))
ORDER BY attribute_name;
  • Wyświetl szczegóły modelu
SELECT target_attribute_name AS target_class,
       target_attribute_str_value AS target_value,
       attribute_name AS attribute,
       attribute_str_value AS VALUE,
       conditional_probability AS cond_probability
FROM TABLE(DBMS_DATA_MINING.GET_MODEL_DETAILS_NB('NaiveBayes')) T,   
     TABLE(T.conditionals) C
ORDER BY target_class, target_value, cond_probability DESC;
  • Zastosuj model do danych
DROP TABLE apply_result;
DROP TABLE apply_ranked;
 
BEGIN
  DBMS_DATA_MINING.APPLY(
    model_name          => 'NaiveBayes',
    data_table_name     => 'titanic_test',
    case_id_column_name => 'id',
    result_table_name   => 'apply_result');
END;
/
 
BEGIN
  DBMS_DATA_MINING.RANK_APPLY (
    apply_result_table_name     => 'apply_result',
    case_id_column_name         => 'id',
    score_column_name           => 'prediction',
    score_criterion_column_name => 'probability',
    ranked_apply_table_name     => 'apply_ranked',
    top_n                       => 2);
END;
  • Wyświetl wyniki zastosowania modelu do danych
SELECT *
FROM (SELECT id, class, age, sex, survived, prediction, ROUND(probability,4) AS probability
      FROM apply_result NATURAL JOIN titanic_test
      ORDER BY DBMS_RANDOM.RANDOM)
WHERE ROWNUM <= 10;
 
SELECT *
FROM (SELECT id, class, age, sex, survived, prediction, ROUND(probability,4) AS probability, RANK
      FROM apply_ranked NATURAL JOIN titanic_test
      ORDER BY id)
WHERE ROWNUM <= 10;
  • Obejrzyj przypadki które są przez klasyfikator klasyfikowane błędnie
SELECT *
FROM (SELECT id, class, age, sex, survived, prediction, ROUND(probability,4) AS probability
      FROM apply_result NATURAL JOIN titanic_test
      WHERE survived != prediction)
WHERE ROWNUM <= 25;

Manuskrypty i księgi

manuscript