Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Budowa i testowanie drzew decyzyjnych, zmieniac lub dopisywac można tylko
- % tam, gdzie miejsce wykropkowane (.....)
- clear;
- %wczytanie zbioru danych - przyklady w wierszach
- %p = load('znaki1.txt');
- %p = load('znaki2.txt');
- p = load('znaki3.txt');
- %p = load('znaki5.txt');
- %p = load('car/car.txt');
- %p = load('tic/tic.txt');
- %p = load('znaki10000.txt');
- % Dodatkowe utrudnienia:
- [liczba_przykladow liczba_kol] = size(p);
- %p = [ceil(rand(liczba_przykladow,4)*8) p]; % 1. Dodanie informacji bezwartosciowej
- %p = [ceil(rand(liczba_przykladow,1)*64) p]; % 2. Dodanie informacji pozornie wartosciowej:
- %p = [randperm(liczba_przykladow)' p]; % 3. Dodanie informacji pozornie wartosciowej (unikatowy numer przykladu):
- liczba_eksp = 10; % liczba eksperymentow z kazdorazowym losowaniem zbioru do uczenia
- blad_ucz = 0;
- blad_test = 0;
- blad_ucz_p = 0;
- blad_test_p = 0;
- poprzedni_blad = 1;
- % Zakladam, ze polowa przykladow sluzy do uczenia a polowa do testu.
- % Podzbior przykladow do uczenia mozna rozbic na czesc do budowy drzewa
- % (Pnauka_bud) oraz czesc do walidacji (sprawdzania, czy drzewo dobrze
- % uogólnia)
- % czesc przykladow do budowy drzewa w procentach (0-100%) :
- czesc_do_bud = 75 % (..... mozna dobrac poroporcje)
- liczba_pbud = ceil(liczba_przykladow*czesc_do_bud/100/2) % liczba przykladow do budowy
- for eksp=1:liczba_eksp
- % podzial na podzbiory do budowy drzewa , walidacji i testu drzewa decyzyjnego
- p = p(randperm(liczba_przykladow),:); % mieszanie przykladow
- % wybor przykladow do uczenia i testu drzew decyzyjnych
- Pnauka = p(1:end/2,1:end-1);
- Pnauka_bud = Pnauka(1:liczba_pbud,:);
- Pwalidacja = Pnauka(liczba_pbud+1:end,:);
- Ptest = p(end/2+1:end,1:end-1); % tylko do testu ostatecznej wersji drzewa
- KlasyNauka = p(1:end/2,end)';
- KlasyNaukaBud = KlasyNauka(1:liczba_pbud);
- KlasyWalid = KlasyNauka(liczba_pbud+1:end);
- KlasyTest = p(end/2+1:end,end)';
- % Budowa i przycinanie drzewa decyzyjnego. UWAGA! Tylko w opaciu o przykłady do uczenia
- % budowa drzewa na pelnym zbiorze danych do uczenia:
- D = buduj_drzewo(Pnauka,KlasyNauka);
- % obliczanie bledow:
- blad_ucz(eksp) = mean(jakaklasa(D,Pnauka) ~= KlasyNauka);
- blad_ucz_bud(eksp) = mean(jakaklasa(D,Pnauka_bud) ~= KlasyNaukaBud);
- blad_ucz_walid(eksp) = mean(jakaklasa(D,Pwalidacja) ~= KlasyWalid);
- blad_test(eksp) = mean(jakaklasa(D,Ptest) ~= KlasyTest);
- % przycinanie:
- % budowa drzewa na podstawie podzbioru do budowy
- Dp = buduj_drzewo(Pnauka_bud,KlasyNaukaBud);
- roz_bud = rozklad(Dp,Pnauka_bud,KlasyNaukaBud); % rozklad przykladow z poszcz. klas dla drzewa D i zbioru do jego budowy
- roz_wad = rozklad(Dp,Pwalidacja,KlasyWalid); % -||- zbioru do jego walidacji
- [liczba_wierszy, liczba_wezlow] = size(Dp);
- liczba_klas = length(roz_bud(:,1));
- % ........ Miejsce na algorytm przycinania
- % ........ Nie wolno uzywac zbioru testowego!
- while mean(jakaklasa(Dp,Pwalidacja) ~= KlasyWalid) < poprzedni_blad
- poprzedni_blad = mean(jakaklasa(Dp,Pwalidacja) ~= KlasyWalid);
- Dpkopia = Dp;
- rozmiar = size(Dp);
- wysokosc = rozmiar(2);
- while sum(roz_wad(:,wysokosc) ~= 0) < 2
- wysokosc=wysokosc-1;
- end
- [v klasa] = max(roz_wad(:,wysokosc));
- Dp=usun_galaz(Dp,wysokosc);
- Dp(end,wysokosc) = klasa;
- end
- Dp = Dpkopia;
- blad_ucz_Dp(eksp) = mean(jakaklasa(Dp,Pnauka_bud) ~= KlasyNaukaBud);
- blad_walid_Dp(eksp) = mean(jakaklasa(Dp,Pwalidacja) ~= KlasyWalid);
- blad_test_Dp(eksp) = mean(jakaklasa(Dp,Ptest) ~= KlasyTest);
- end
- disp(sprintf('srednie bledy klasyfikacji drzew decyzyjnych dla %d eksperymentow:\n',liczba_eksp));
- disp(sprintf('bez przycinania - nauka (przykl do budowy drzewa): %f, test = %f',mean(blad_ucz),mean(blad_test)));
- disp(sprintf('z przycinaniem - nauka (przykl do budowy drzewa): %f, test = %f',mean(blad_ucz_Dp),mean(blad_test_Dp)));
- disp(sprintf('zmniejszenie sredniego bledu testu = %f proc',100*(mean(blad_test)-mean(blad_test_Dp))/mean(blad_test)));
- %disp(sprintf('zmniejszenie sredniego bledu walidacji = %f proc',100*(mean(blad_ucz_walid)-mean(blad_walid_Dp))/mean(blad_ucz_walid)));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement