Svm.reg.plsql
Z Studia Informatyczne
SET serveroutput ON
SET pages 10000
SET echo ON
-- usuniecie tabeli i perspektywy do normalizacji
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE normalization';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW v_prepared';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
--
-- normalizacja danych (w tym artybutu decyzyjnego AGE)
--
BEGIN
-- utworzenie tabeli do przechowywania parametrow normalizacji
DBMS_DATA_MINING_TRANSFORM.CREATE_NORM_LIN (
norm_table_name => 'normalization');
-- normalizacja za pomoca metody min-max
DBMS_DATA_MINING_TRANSFORM.INSERT_NORM_LIN_MINMAX (
norm_table_name => 'normalization',
data_table_name => 'mining_data_build_v',
exclude_list => DBMS_DATA_MINING_TRANSFORM.COLUMN_LIST (
'affinity_card',
'cust_id',
'bookkeeping_application',
'bulk_pack_diskettes',
'flat_panel_monitor',
'home_theater_package',
'os_doc_set_kanji',
'printer_supplies',
'y_box_games')
);
-- utworzenie perspektywy pokazujacej znormalizowane dane
DBMS_DATA_MINING_TRANSFORM.XFORM_NORM_LIN (
norm_table_name => 'normalization',
data_table_name => 'mining_data_build_v',
xform_view_name => 'v_prepared');
END;
/
-- usuniecie starej tabeli z ustawieniami algorytmu
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE settings';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
-- utworzenie i wypelnienie tabeli z ustawieniami algorytmu
CREATE TABLE settings (
setting_name VARCHAR2(30),
setting_value VARCHAR2(30));
BEGIN
INSERT INTO settings (setting_name, setting_value) VALUES
(dbms_data_mining.svms_kernel_function, dbms_data_mining.svms_gaussian);
-- (dbms_data_mining.svms_kernel_function,dbms_data_mining.svms_linear);
INSERT INTO settings (setting_name, setting_value) VALUES
(dbms_data_mining.svms_conv_tolerance,0.01);
INSERT INTO settings (setting_name, setting_value) VALUES
(dbms_data_mining.svms_epsilon,0.1);
INSERT INTO settings (setting_name, setting_value) VALUES
(dbms_data_mining.svms_kernel_cache_size,50000000);
COMMIT;
END;
/
-- usuniecie starego modelu z repozytorium
BEGIN
DBMS_DATA_MINING.DROP_MODEL('SVMR_Model');
EXCEPTION WHEN OTHERS THEN
NULL;
END;
/
-- stworzenie nowego modelu regresji
BEGIN
DBMS_DATA_MINING.CREATE_MODEL(
model_name => 'SVMR_Model',
mining_function => dbms_data_mining.regression,
data_table_name => 'v_prepared',
case_id_column_name => 'cust_id',
target_column_name => 'age',
settings_table_name => 'settings');
END;
/
--
-- wyswietlenie ustawien modelu
--
column setting_name format a30
column setting_value format a30
SELECT setting_name, setting_value
FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SETTINGS('SVMR_Model'))
ORDER BY setting_name;
--
-- wyswietlenie sygnatury modelu
--
column attribute_type format a20
SELECT attribute_name, attribute_type
FROM TABLE(DBMS_DATA_MINING.GET_MODEL_SIGNATURE('SVMR_Model'))
ORDER BY attribute_name;
-----------------------------------------------------------------------
-- Testowanie modelu
-----------------------------------------------------------------------
-- usuniecie perspektyw zawierajacych dane testowe
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW test_prepared';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW test_scaled';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
-- utworzenie perspektywy pokazujacej dane testowe po normalizacji
BEGIN
DBMS_DATA_MINING_TRANSFORM.XFORM_NORM_LIN (
norm_table_name => 'normalization',
data_table_name => 'mining_data_test_v',
xform_view_name => 'test_prepared');
END;
/
--
-- atrybut AGE zostal znormalizowany podczas tworzenia modelu, wiec konieczne
-- jest odkodowanie wartosci przez polaczenie z tabela zawierajaca ustawienia normalizacji
--
CREATE VIEW test_scaled AS
SELECT A.cust_id,
((PREDICTION(SVMR_Model USING *) * N.scale) + N.shift) pred
FROM test_prepared A, normalization N
WHERE N.col = 'AGE';
--
-- Wyliczenie miar jakosci predykcji
--
--
-- 1. Root Mean Square Error - Sqrt(Mean((x - x')^2))
--
column rmse format 9999.99
SELECT SQRT(AVG((A.pred - B.age) * (A.pred - B.age))) rmse
FROM test_scaled A, mining_data_test_v B
WHERE A.cust_id = B.cust_id;
--
-- 2. Mean Absolute Error - Mean(|(x - x')|)
--
column mae format 9999.99
SELECT AVG(ABS(a.pred - B.age)) mae
FROM test_scaled A, mining_data_test_v B
WHERE A.cust_id = B.cust_id;
--
-- 3. Roznice (jesli duza wariancja to nalezy zmienic ustawienia algorytmu)
--
SELECT TO_CHAR(ROUND(pred, 4)) prediction, residual
FROM (SELECT A.pred, (A.pred - B.age) residual
FROM test_scaled A, mining_data_test_v B
WHERE A.cust_id = B.cust_id
ORDER BY A.pred ASC)
WHERE ROWNUM < 21;
-----------------------------------------------------------------------
-- Zastosowanie modelu
-----------------------------------------------------------------------
-- usuniecie obiektow pozostalych po poprzednich uruchomieniach programu
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW apply_prepared';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
-- utworzenie perspektywy pokazujacej dane do zastosowania po normalizacji
BEGIN
DBMS_DATA_MINING_TRANSFORM.XFORM_NORM_LIN (
norm_table_name => 'normalization',
data_table_name => 'mining_data_apply_v',
xform_view_name => 'apply_prepared');
END;
/
--
-- 1. Wyswietl predykcje sredniego wieku klientow z podzialem na plec
-- (wszystkie predykcje musza byc odkodowane na oryginalna domene)
--
SELECT A.cust_gender, COUNT(*) AS cnt,
ROUND( AVG((PREDICTION(SVMR_Model USING A.*) * N.scale) + N.shift),4) AS avg_age
FROM apply_prepared A, normalization N
WHERE N.col = 'AGE'
GROUP BY cust_gender
ORDER BY cust_gender;
--
-- 2. Utworz histogram skladajacy sie z 10 przedzialow, umiesc w histogramie
-- rozklad wieku klientow z Wloch, dla kazdego klienta wyswietl odpowiadajacy jej/jemu
-- numer przedzialu
--
column pred_age format 999.99
WITH
cust_italy AS (
SELECT *
FROM apply_prepared
WHERE country_name = 'Italy'
)
SELECT cust_id, ((PREDICTION(SVMR_Model USING A.*) * N.scale) + N.shift) pred_age,
WIDTH_BUCKET(
((PREDICTION(SVMR_Model USING A.*) * N.scale) + N.shift), 10, 100, 10) "Age Group"
FROM cust_italy A, normalization N
WHERE N.col = 'AGE'
ORDER BY pred_age;