Дерева прийняття рішень, дозволяють у дуже наглядний спосіб показати логічну послідовність дій для класифікації та сортування будь-яких даних - як номінальних, так і числових. Спробуємо виробити алгоритм розділення типів гірських порід за показниками їхнього хімічного складу за даними таблиці granity:
>library(rpart.plot)#Завантажуємо пакет rpart.plot (він автоматичо завантажить і первинний пакет rpart
>granity.rpart<- rpart(formula=PORODA~SiO2+TiO2+Al2O3+Fe2O3+FeO+MgO+CaO+K2O+Na2O, method="class", data=granity)#Розраховуємо дерево прийняття рішень
>levels(granity$PORODA)#Перевіряємо кількість рівнів у факторі granity$PORODA (тобто - кількість унікальних назв)
[1] "авгітовий_сієніт" "амфіболіт"
[3] "анортозит" "апліто-пегматит"
[5] "арієжит" "біотитовий_граніт"
[7] "верліт" "габро"
[9] "габро-амфіболіт" "габро-діабаз"
[11] "габро-норит" "габро-перидотит"
[13] "габро-сієніт" "гарцбургіт"
[15] "граніт" "гранодіорит"
[17] "гранофіровий_граніт" "діалагіт"
[19] "епідіабаз" "кварцовий_пертит"
[21] "кварцовий_сієніт" "кварцово_піроксеновий_сієніт"
[23] "лабрадорит" "маріуполіт"
[25] "мігматит" "нефеліновий_сієніт"
[27] "нордмиркіт" "норит"
[29] "олівінове_габро" "олівіновий_габро-норит"
[31] "олівіновий_норит" "основний_чарнокіт"
[33] "пегматоїдний_граніт" "перидотит"
[35] "піроксеніт" "піроксеновий_гранодіорит"
[37] "піроксеновий_сієніт" "плагіограніт"
[39] "порфіровидний_граніт" "рапаківі"
[41] "рапаківовидний_граніт" "рожевий_аплітоїдний_граніт"
[43] "рожевий_граніт" "рожевий_гранодіорит"
[45] "рожевий_порфіровидний_граніт" "середній_чарнокіт"
[47] "сієніт" "сірий_граніт"
[49] "сірий_гранодіорит" "сірий_порфіровидний_граніт"
[51] "собіт" "фойяїт"
[53] "фореленштейн" "чарнокіт"
[55] "червоний_граніт"
>prp(granity.rpart, extra=102, box.col=rainbow(55)[granity.rpart$frame$yval])#Будуємо дерево прийняття рішень
>library(rpart.plot)#Завантажуємо пакет rpart.plot (він автоматичо завантажить і первинний пакет rpart
>granity.rpart<- rpart(formula=PORODA~SiO2+TiO2+Al2O3+Fe2O3+FeO+MgO+CaO+K2O+Na2O, method="class", data=granity)#Розраховуємо дерево прийняття рішень
>levels(granity$PORODA)#Перевіряємо кількість рівнів у факторі granity$PORODA (тобто - кількість унікальних назв)
[1] "авгітовий_сієніт" "амфіболіт"
[3] "анортозит" "апліто-пегматит"
[5] "арієжит" "біотитовий_граніт"
[7] "верліт" "габро"
[9] "габро-амфіболіт" "габро-діабаз"
[11] "габро-норит" "габро-перидотит"
[13] "габро-сієніт" "гарцбургіт"
[15] "граніт" "гранодіорит"
[17] "гранофіровий_граніт" "діалагіт"
[19] "епідіабаз" "кварцовий_пертит"
[21] "кварцовий_сієніт" "кварцово_піроксеновий_сієніт"
[23] "лабрадорит" "маріуполіт"
[25] "мігматит" "нефеліновий_сієніт"
[27] "нордмиркіт" "норит"
[29] "олівінове_габро" "олівіновий_габро-норит"
[31] "олівіновий_норит" "основний_чарнокіт"
[33] "пегматоїдний_граніт" "перидотит"
[35] "піроксеніт" "піроксеновий_гранодіорит"
[37] "піроксеновий_сієніт" "плагіограніт"
[39] "порфіровидний_граніт" "рапаківі"
[41] "рапаківовидний_граніт" "рожевий_аплітоїдний_граніт"
[43] "рожевий_граніт" "рожевий_гранодіорит"
[45] "рожевий_порфіровидний_граніт" "середній_чарнокіт"
[47] "сієніт" "сірий_граніт"
[49] "сірий_гранодіорит" "сірий_порфіровидний_граніт"
[51] "собіт" "фойяїт"
[53] "фореленштейн" "чарнокіт"
[55] "червоний_граніт"
>prp(granity.rpart, extra=102, box.col=rainbow(55)[granity.rpart$frame$yval])#Будуємо дерево прийняття рішень
![]() |
| Дерево прийняття рішень для розділення типів гірських порід за показниками хімічного складу |
Тепер ми знаємо, що для нашої сукупності даних можна використати показник вмісту SiO2 для однозначного розділення порід на ультраосновні+основні+середні і кислі. Якщо вміст SiO2 більше або дорівнює 64% - це однозначно кислі породи. Зверніть увагу - саме "більше, або дорівнює". Повинна зберігатись логічна однозначність - якщо висновок "не менше", тоді можливі варіанти "більше" і "дорівнює". Також ми можемо виділити маріуполіти - для цих порід вміст SiO2 повинен складати менше 64% при вмісті Na2O більше-рівно 7,6%. Для виділення перидотитів наша логічна умова буде виглядати наступним чином: SiO2<64%, Na2O<7,6%, Al2O3<21%, MgO<=19%.
Зрозуміло, що при виконанні цих логічних умов не обов’язково дотримуватись наведеної послідовності - логічна умова або діє, або не діє - порядок подання цих умов на обробку не впливає на кіцевий результат.
Особливості побудови і параметри графіки ми дуже розбирати не будемо. На що треба звернути увагу в першу чергу? - Подивіться на параметр extra - він відповідає за зовнішній вигляд (за тип відображення показників дерева прийняття рішень). Параметр box.col, як ви можете здогадатись, відповідає за кольорове наповнення блоків. Ми присвоїли цьому параметру 55 кольорів (за кількістю порід у факторі granity$PORODA) за допомогою функції rainbow. Зверніть увагу на кількість порід на графіку - із 55 порід вдалося класифікувати лише 12, інших порід дуже мало для проведення впевненої класифікації (здебільшого - по 1-2 проби). Детальніше із параметрами відображення дерева рішень можна познайомитись за допомогою команди:
>?prp
Найцікавіші можливості: використавши параметр fallen.leaves=T, ми можемо отримати подобу діаграми кластерного аналізу; змінюючи параметр branch.type - ми можемо вкладати різну суть у з’єднувальні лінії:
>prp(granity.rpart, extra=102, fallen.leaves=T, box.col=rainbow(55)[granity.rpart$frame$yval])
>prp(granity1.rpart, extra=102, branch.type=7, box.col=rainbow(55)[granity1.rpart$frame$yval])
![]() |
| Результати використання параметру fallen.leaves |
![]() |
| Результати змінення параметру branch.type |



Немає коментарів:
Дописати коментар