Решаем давать кредит или не давать.
Mar. 20th, 2009 02:15 pmПодключаемся dmsys/dmsys
Таблица для настроек модели.
Заполняем настройки, попробуем алгоритм algo_naive_bayes
Таблица с тренировочными данными.
Заполняем тренировочными данными (0,9 -- стареньким кредит не даем).
Тренируем, модель называем CRED, используем classification т.к. цель y/n
Проверяем модель на исходных данных, результат попадет в CRED_RESULT
(создается автоматически).
В результирующей таблице, получаем вероятность для каждого класса.
Все совпадает с вероятностью 1.
Проверяем на "дедушках"
Одному из дедушек с полом m и без детей повезло больше, вероятность положительного ответа 0,33.
Таблица для настроек модели.
create table CRED_SETTINGS ( SETTING_NAME VARCHAR2(30), SETTING_VALUE VARCHAR2(128));
Заполняем настройки, попробуем алгоритм algo_naive_bayes
begin DELETE FROM CRED_SETTINGS; INSERT INTO CRED_SETTINGS (setting_name, setting_value) VALUES (dbms_data_mining.algo_name, dbms_data_mining.algo_naive_bayes); INSERT INTO CRED_SETTINGS (setting_name, setting_value) VALUES (dbms_data_mining.nabs_singleton_threshold , TO_CHAR(0.01)); INSERT INTO CRED_SETTINGS (setting_name, setting_value) VALUES (dbms_data_mining.nabs_pairwise_threshold, TO_CHAR(0.01)); COMMIT; end;
Таблица с тренировочными данными.
create table CRED_TRAINING( id number, -- уникальный id age float, -- возраст нормализованный (0..1) sex varchar2(1), -- пол num_child float, -- кол-во детей (0..1) accepted varchar2(1)); -- цель (даем/не даем кредит)
Заполняем тренировочными данными (0,9 -- стареньким кредит не даем).
insert into CRED_TRAINING values (0, '0,1', 'm', '0,5', 'y'); insert into CRED_TRAINING values (1, '0,9', 'f', '1', 'n'); insert into CRED_TRAINING values (2, '0,9', 'm', '0,5', 'n'); insert into CRED_TRAINING values (3, '0,9', 'm', '0,5', 'n'); insert into CRED_TRAINING values (4, '0,4', 'm', '0,5', 'y'); insert into CRED_TRAINING values (5, '0,3', 'm', '0', 'y'); insert into CRED_TRAINING values (6, '0,4', 'm', '0,5', 'y'); insert into CRED_TRAINING values (7, '0,2', 'm', '0,5', 'y'); insert into CRED_TRAINING values (8, '0,4', 'm', '0,5', 'y'); insert into CRED_TRAINING values (9, '0,3', 'm', '0,5', 'y'); commit;
Тренируем, модель называем CRED, используем classification т.к. цель y/n
begin dbms_data_mining.create_model('CRED', dbms_data_mining.classification, 'cred_training', 'id','accepted', 'cred_settings'); commit; end;
Проверяем модель на исходных данных, результат попадет в CRED_RESULT
(создается автоматически).
begin --execute immediate 'drop table CRED_RESULT'; dbms_data_mining.apply('cred', 'cred_training', 'ID', 'CRED_RESULT'); commit; end;
В результирующей таблице, получаем вероятность для каждого класса.
select t.id, t.accepted, r.prediction, round(r.probability,2) from cred_training t, cred_result r where t.id = r.id and r.probability >0.3
ID | ACCEPTED | PREDICTION | ROUND(R.PROBABILITY,2) |
---|---|---|---|
1 | n | n | 1 |
5 | y | y | 1 |
6 | y | y | 1 |
7 | y | y | 1 |
8 | y | y | 1 |
9 | y | y | 1 |
2 | n | n | 1 |
3 | n | n | 1 |
4 | y | y | 1 |
0 | y | y | 1 |
Все совпадает с вероятностью 1.
Проверяем на "дедушках"
create table CRED_QUERY as select id, age, sex, num_child from CRED_TRAINING where 1=0; insert into CRED_QUERY values (0, '0,9', 'f', '0'); insert into CRED_QUERY values (1, '0,9', 'm', '1'); insert into CRED_QUERY values (2, '0,9', 'f', '0,5'); insert into CRED_QUERY values (3, '0,9', 'm', '0'); insert into CRED_QUERY values (4, '0,9', 'm', '0,5'); commit; begin execute immediate 'drop table CRED_RESULT'; dbms_data_mining.apply('cred', 'CRED_QUERY', 'ID', 'CRED_RESULT'); commit; end; select t.*,r.prediction, round(r.probability,2) from CRED_QUERY t, cred_result r where t.id = r.id and r.probability >0.2
ID | AGE | SEX | NUM_CHILD | PREDICTION | ROUND(R.PROBABILITY,2) |
---|---|---|---|---|---|
0 | 0,9 | f | 0 | n | 1 |
1 | 0,9 | m | 1 | n | 1 |
2 | 0,9 | f | 0,5 | n | 1 |
3 | 0,9 | m | 0 | n | 0,67 |
3 | 0,9 | m | 0 | y | 0,33 |
4 | 0,9 | m | 0,5 | n | 1 |
Одному из дедушек с полом m и без детей повезло больше, вероятность положительного ответа 0,33.