Advertisement
Guest User

matsi

a guest
May 20th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. % Budowa i testowanie drzew decyzyjnych, zmieniac lub dopisywac można tylko
  2. % tam, gdzie miejsce wykropkowane (.....)
  3.  
  4. clear;
  5. %wczytanie zbioru danych - przyklady w wierszach
  6. %p = load('znaki1.txt');
  7. %p = load('znaki2.txt');
  8. p = load('znaki3.txt');
  9. %p = load('znaki5.txt');
  10. %p = load('car/car.txt');
  11. %p = load('tic/tic.txt');
  12. %p = load('znaki10000.txt');
  13.  
  14.  
  15.  
  16. % Dodatkowe utrudnienia:
  17. [liczba_przykladow liczba_kol] = size(p);
  18. %p = [ceil(rand(liczba_przykladow,4)*8) p]; % 1. Dodanie informacji bezwartosciowej
  19. %p = [ceil(rand(liczba_przykladow,1)*64) p]; % 2. Dodanie informacji pozornie wartosciowej:
  20. %p = [randperm(liczba_przykladow)' p]; % 3. Dodanie informacji pozornie wartosciowej (unikatowy numer przykladu):
  21.  
  22.  
  23. liczba_eksp = 10; % liczba eksperymentow z kazdorazowym losowaniem zbioru do uczenia
  24. blad_ucz = 0;
  25. blad_test = 0;
  26. blad_ucz_p = 0;
  27. blad_test_p = 0;
  28. poprzedni_blad = 1;
  29. % Zakladam, ze polowa przykladow sluzy do uczenia a polowa do testu.
  30. % Podzbior przykladow do uczenia mozna rozbic na czesc do budowy drzewa
  31. % (Pnauka_bud) oraz czesc do walidacji (sprawdzania, czy drzewo dobrze
  32. % uogólnia)
  33.  
  34. % czesc przykladow do budowy drzewa w procentach (0-100%) :
  35. czesc_do_bud = 75 % (..... mozna dobrac poroporcje)
  36.  
  37. liczba_pbud = ceil(liczba_przykladow*czesc_do_bud/100/2) % liczba przykladow do budowy
  38.  
  39. for eksp=1:liczba_eksp
  40. % podzial na podzbiory do budowy drzewa , walidacji i testu drzewa decyzyjnego
  41.  
  42. p = p(randperm(liczba_przykladow),:); % mieszanie przykladow
  43. % wybor przykladow do uczenia i testu drzew decyzyjnych
  44. Pnauka = p(1:end/2,1:end-1);
  45. Pnauka_bud = Pnauka(1:liczba_pbud,:);
  46. Pwalidacja = Pnauka(liczba_pbud+1:end,:);
  47. Ptest = p(end/2+1:end,1:end-1); % tylko do testu ostatecznej wersji drzewa
  48. KlasyNauka = p(1:end/2,end)';
  49. KlasyNaukaBud = KlasyNauka(1:liczba_pbud);
  50. KlasyWalid = KlasyNauka(liczba_pbud+1:end);
  51. KlasyTest = p(end/2+1:end,end)';
  52.  
  53. % Budowa i przycinanie drzewa decyzyjnego. UWAGA! Tylko w opaciu o przykłady do uczenia
  54.  
  55. % budowa drzewa na pelnym zbiorze danych do uczenia:
  56. D = buduj_drzewo(Pnauka,KlasyNauka);
  57.  
  58. % obliczanie bledow:
  59. blad_ucz(eksp) = mean(jakaklasa(D,Pnauka) ~= KlasyNauka);
  60. blad_ucz_bud(eksp) = mean(jakaklasa(D,Pnauka_bud) ~= KlasyNaukaBud);
  61. blad_ucz_walid(eksp) = mean(jakaklasa(D,Pwalidacja) ~= KlasyWalid);
  62. blad_test(eksp) = mean(jakaklasa(D,Ptest) ~= KlasyTest);
  63.  
  64.  
  65. % przycinanie:
  66. % budowa drzewa na podstawie podzbioru do budowy
  67. Dp = buduj_drzewo(Pnauka_bud,KlasyNaukaBud);
  68. roz_bud = rozklad(Dp,Pnauka_bud,KlasyNaukaBud); % rozklad przykladow z poszcz. klas dla drzewa D i zbioru do jego budowy
  69. roz_wad = rozklad(Dp,Pwalidacja,KlasyWalid); % -||- zbioru do jego walidacji
  70.  
  71.  
  72. [liczba_wierszy, liczba_wezlow] = size(Dp);
  73. liczba_klas = length(roz_bud(:,1));
  74.  
  75. % ........ Miejsce na algorytm przycinania
  76. % ........ Nie wolno uzywac zbioru testowego!
  77. while mean(jakaklasa(Dp,Pwalidacja) ~= KlasyWalid) < poprzedni_blad
  78. poprzedni_blad = mean(jakaklasa(Dp,Pwalidacja) ~= KlasyWalid);
  79. Dpkopia = Dp;
  80. rozmiar = size(Dp);
  81. wysokosc = rozmiar(2);
  82. while sum(roz_wad(:,wysokosc) ~= 0) < 2
  83. wysokosc=wysokosc-1;
  84. end
  85.  
  86. [v klasa] = max(roz_wad(:,wysokosc));
  87. Dp=usun_galaz(Dp,wysokosc);
  88. Dp(end,wysokosc) = klasa;
  89. end
  90. Dp = Dpkopia;
  91. blad_ucz_Dp(eksp) = mean(jakaklasa(Dp,Pnauka_bud) ~= KlasyNaukaBud);
  92. blad_walid_Dp(eksp) = mean(jakaklasa(Dp,Pwalidacja) ~= KlasyWalid);
  93. blad_test_Dp(eksp) = mean(jakaklasa(Dp,Ptest) ~= KlasyTest);
  94.  
  95. end
  96. disp(sprintf('srednie bledy klasyfikacji drzew decyzyjnych dla %d eksperymentow:\n',liczba_eksp));
  97. disp(sprintf('bez przycinania - nauka (przykl do budowy drzewa): %f, test = %f',mean(blad_ucz),mean(blad_test)));
  98. disp(sprintf('z przycinaniem - nauka (przykl do budowy drzewa): %f, test = %f',mean(blad_ucz_Dp),mean(blad_test_Dp)));
  99. disp(sprintf('zmniejszenie sredniego bledu testu = %f proc',100*(mean(blad_test)-mean(blad_test_Dp))/mean(blad_test)));
  100.  
  101. %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