W drugiej części laboratorium studentki i studenci zapoznają się z metodami tworzenia drzew decyzyjnych w środowisku Oracle Data Mining a także poznają rolę macierzy kosztów w budowie modeli oraz porównują ze sobą modele przy użyciu krzywej ROC.
gini_index
. Obejrzyj uzyskany model i macierz pomyłek. Czy model dobrze radzi sobie z rozpoznawaniem nietypowych próbek?Decision Tree
wewnątrz operatora Meta Cost
i zbuduj macierz kosztów, w którym błąd false positive będzie dwukrotnie droższy niż błąd false negative. Obejrzyj uzyskaną macierz pomyłek.Decision Tree
na Random Tree
i skonfiguruj operator w taki sposób, aby w każdej iteracji dysponował połową atrybutów do wyboru. Ponownie postaraj się tak skonfigurować macierz kosztów, aby uzyskać czułośc klasy “O” powyżej 50% przy jak najwyższej ogólnej dokładności modelu.Meta Cost
na operator Tree to Rules
pozostawiając wewnątrz indukcję drzewa decyzyjnego przy użyciu miary gini_index
. Obejrzyj uzyskany model regułowy.Test Learners
i skonfiguruj operator w taki sposób, aby ocena modeli odbywała się na podstawie walidacji krzyżowej.ROC
i obejrzyj uzyskane krzywe.MARKETING
, MARKETING_TEST
i MARKETING_NEW
kopiując tabele ze schematu MIKOLAJM
CREATE TABLE marketing AS SELECT * FROM mikolajm.marketing; CREATE TABLE marketing_test AS SELECT * FROM mikolajm.marketing_test; CREATE TABLE marketing_new AS SELECT * FROM mikolajm.marketing_new;
ALTER SESSION SET NLS_LANGUAGE = english; ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ".,";
DROP TABLE settings; DROP TABLE cost;
CREATE TABLE settings ( setting_name VARCHAR2(30), setting_value VARCHAR2(30));
BEGIN INSERT INTO settings VALUES (dbms_data_mining.algo_name, dbms_data_mining.algo_decision_tree); INSERT INTO settings VALUES (dbms_data_mining.clas_cost_table_name, 'cost'); -- miara czystosci wezla wewnetrznego drzewa INSERT INTO settings VALUES (dbms_data_mining.tree_impurity_metric, 'TREE_IMPURITY_ENTROPY'); -- maksymalna glebokosc wygenerowanego drzewa INSERT INTO settings VALUES (dbms_data_mining.tree_term_max_depth, 5); -- minimalna liczba rekordow w wezle przed podzialem wezla INSERT INTO settings VALUES (dbms_data_mining.tree_term_minrec_split, 5); -- minimalny procent rekordow w wezle przed podzialem INSERT INTO settings VALUES (dbms_data_mining.tree_term_minpct_split, 0.01); -- minimalna liczba rekordow w wezle/lisciu INSERT INTO settings VALUES (dbms_data_mining.tree_term_minrec_node, 5); -- minimalny procent rekordow w wezle/lisciu INSERT INTO settings VALUES (dbms_data_mining.tree_term_minpct_node, 0.005); COMMIT; END;
CREATE TABLE cost ( actual_target_value NUMBER, predicted_target_value NUMBER, cost NUMBER);
INSERT INTO cost VALUES (0,0,0); INSERT INTO cost VALUES (0,1,1); INSERT INTO cost VALUES (1,0,5); INSERT INTO cost VALUES (1,1,0); COMMIT;
BEGIN DBMS_DATA_MINING.DROP_MODEL('DecisionTree'); EXCEPTION WHEN OTHERS THEN NULL; END;
MARKETING
BEGIN DBMS_DATA_MINING.CREATE_MODEL( model_name => 'DecisionTree', mining_function => dbms_data_mining.classification, data_table_name => 'marketing', case_id_column_name => 'cust_id', target_column_name => 'affinity_card', settings_table_name => 'settings'); END;
SELECT setting_name, setting_value FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SETTINGS('DecisionTree')) ORDER BY setting_name; SELECT attribute_name, attribute_type FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SIGNATURE('DecisionTree')) ORDER BY attribute_name;
MARKETING_TEST
SELECT affinity_card AS actual_target_value, PREDICTION(DecisionTree USING *) AS predicted_target_value, PREDICTION_PROBABILITY(DecisionTree, 0 USING *) AS negative_class_probability, PREDICTION_PROBABILITY(DecisionTree, 1 USING *) AS positive_class_probability FROM marketing_test;
SELECT affinity_card AS actual_target_value, PREDICTION(DecisionTree USING *) AS full_model_prediction, PREDICTION(DecisionTree USING age, cust_gender, cust_marital_status) AS partial_model_prediction, PREDICTION_PROBABILITY(DecisionTree, 0 USING *) AS negative_full_model, PREDICTION_PROBABILITY(DecisionTree, 0 USING age, cust_gender, cust_marital_status) AS negative_partial_model FROM marketing_test;
SELECT affinity_card AS actual_target_value, PREDICTION(DecisionTree USING *) AS predicted_target_value, COUNT(*) AS VALUE FROM marketing_test GROUP BY affinity_card, PREDICTION(DecisionTree USING *) ORDER BY actual_target_value,predicted_target_value;
SELECT affinity_card AS actual_target_value, PREDICTION(DecisionTree COST MODEL USING *) AS predicted_target_value, COUNT(*) AS VALUE FROM marketing_test GROUP BY affinity_card, PREDICTION(DecisionTree COST MODEL USING *) ORDER BY actual_target_value, predicted_target_value;
WITH cust_argentina AS ( SELECT cust_id, PREDICTION_COST(DecisionTree, 1 COST MODEL USING *) AS cost FROM marketing_new WHERE country_name = 'Argentina' ORDER BY PREDICTION_COST(DecisionTree, 1 COST MODEL USING *) ASC, 1 ) SELECT cust_id, cost FROM cust_argentina WHERE ROWNUM <= 10;
CUST_MARITAL_STATUS
, EDUCATION
i HOUSEHOLD_SIZE
. Wyświetl wyniki z podziałem na płeć klientówSELECT cust_gender, COUNT(*) AS cnt, ROUND(AVG(age)) AS avg_age FROM marketing_new WHERE PREDICTION(DecisionTree COST MODEL USING cust_marital_status, education, household_size) = 1 GROUP BY cust_gender;
SELECT T.cust_id, S.prediction, S.probability, S.cost FROM (SELECT cust_id, PREDICTION_SET(DecisionTree COST MODEL USING *) AS pset FROM marketing_new WHERE country_name = 'Brazil') T, TABLE(T.pset) S ORDER BY cust_id, S.prediction;