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.
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 | ??? |
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.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:
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ł.ALTER SESSION SET NLS_LANGUAGE = english; ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ".,";
DESCRIBE titanic SELECT * FROM titanic WHERE ROWNUM <= 20;
DROP TABLE settings; DROP TABLE priors;
PRIORS
i umieść w niej oszacowane prawdopodobieństo a priori przeżycia katastrofy statkuCREATE TABLE priors ( target_value VARCHAR(3), prior_probability NUMBER); INSERT INTO priors VALUES ('no',0.5); INSERT INTO priors VALUES ('yes',0.5); COMMIT;
CREATE TABLE settings ( setting_name VARCHAR2(30), setting_value VARCHAR2(128) );
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;
BEGIN DBMS_DATA_MINING.DROP_MODEL('NaiveBayes'); EXCEPTION WHEN OTHERS THEN NULL; END;
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 );
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;
SELECT setting_name, setting_value FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SETTINGS('NaiveBayes')) ORDER BY setting_name;
SELECT attribute_name, attribute_type FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SIGNATURE('NaiveBayes')) ORDER BY attribute_name;
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;
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;
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;
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;