Шта су стабла одлучивања?
Стабла одлучивања су свестрани алгоритам машинског учења који може да обавља и задатке класификације и регресије. То су врло моћни алгоритми, способни да уклопе сложене скупове података. Поред тога, стабла одлучивања су основне компоненте случајних шума, које су међу најснажнијим алгоритмима машинског учења који су данас доступни.
Обука и визуелизација стабала одлучивања
Да бисмо изградили ваше прво стабло одлуке у Р примеру, ми ћемо поступити како следи у овом водичу за Дрво одлука:
- Корак 1: Увезите податке
- Корак 2: Очистите скуп података
- Корак 3: Креирајте воз / тест сет
- Корак 4: Изградите модел
- Корак 5: Направите предвиђање
- Корак 6: Измерите перформансе
- Корак 7: Подесите хипер-параметре
Корак 1) Увезите податке
Ако вас занима судбина титаника, овај видео можете погледати на Иоутубеу. Сврха овог скупа података је да предвиди који ће људи вероватније преживети након судара са леденим брегом. Скуп података садржи 13 променљивих и 1309 посматрања. Скуп података је поредан променљивом Кс.
set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)
Излаз:
## X pclass survived name sex## 1 1 1 1 Allen, Miss. Elisabeth Walton female## 2 2 1 1 Allison, Master. Hudson Trevor male## 3 3 1 0 Allison, Miss. Helen Loraine female## 4 4 1 0 Allison, Mr. Hudson Joshua Creighton male## 5 5 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female## 6 6 1 1 Anderson, Mr. Harry male## age sibsp parch ticket fare cabin embarked## 1 29.0000 0 0 24160 211.3375 B5 S## 2 0.9167 1 2 113781 151.5500 C22 C26 S## 3 2.0000 1 2 113781 151.5500 C22 C26 S## 4 30.0000 1 2 113781 151.5500 C22 C26 S## 5 25.0000 1 2 113781 151.5500 C22 C26 S## 6 48.0000 0 0 19952 26.5500 E12 S## home.dest## 1 St Louis, MO## 2 Montreal, PQ / Chesterville, ON## 3 Montreal, PQ / Chesterville, ON## 4 Montreal, PQ / Chesterville, ON## 5 Montreal, PQ / Chesterville, ON## 6 New York, NY
tail(titanic)
Излаз:
## X pclass survived name sex age sibsp## 1304 1304 3 0 Yousseff, Mr. Gerious male NA 0## 1305 1305 3 0 Zabour, Miss. Hileni female 14.5 1## 1306 1306 3 0 Zabour, Miss. Thamine female NA 1## 1307 1307 3 0 Zakarian, Mr. Mapriededer male 26.5 0## 1308 1308 3 0 Zakarian, Mr. Ortin male 27.0 0## 1309 1309 3 0 Zimmerman, Mr. Leo male 29.0 0## parch ticket fare cabin embarked home.dest## 1304 0 2627 14.4583 C## 1305 0 2665 14.4542 C## 1306 0 2665 14.4542 C## 1307 0 2656 7.2250 C## 1308 0 2670 7.2250 C## 1309 0 315082 7.8750 S
Из излаза за главу и реп можете приметити да се подаци не мешају. Ово је велико питање! Када поделите податке између возног и тестног комплета, изабраћете само путника из класе 1 и 2 (ниједан путник из класе 3 није у првих 80 процената посматрања), што значи да алгоритам никада неће видети особине путника класе 3. Ова грешка ће довести до лошег предвиђања.
Да бисте превазишли овај проблем, можете користити узорак функције ().
shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)
Р-код стабла одлука Објашњење
- узорак (1: нров (титаниц)): Генеришите случајну листу индекса од 1 до 1309 (тј. максималан број редова).
Излаз:
## [1] 288 874 1078 633 887 992
Користићете овај индекс за мешање титанског скупа података.
titanic <- titanic[shuffle_index, ]head(titanic)
Излаз:
## X pclass survived## 288 288 1 0## 874 874 3 0## 1078 1078 3 1## 633 633 3 0## 887 887 3 1## 992 992 3 1## name sex age## 288 Sutton, Mr. Frederick male 61## 874 Humblen, Mr. Adolf Mathias Nicolai Olsen male 42## 1078 O'Driscoll, Miss. Bridget female NA## 633 Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren) female 39## 887 Jermyn, Miss. Annie female NA## 992 Mamee, Mr. Hanna male NA## sibsp parch ticket fare cabin embarked home.dest## 288 0 0 36963 32.3208 D50 S Haddenfield, NJ## 874 0 0 348121 7.6500 F G63 S## 1078 0 0 14311 7.7500 Q## 633 1 5 347082 31.2750 S Sweden Winnipeg, MN## 887 0 0 14313 7.7500 Q## 992 0 0 2677 7.2292 C
Корак 2) Очистите скуп података
Структура података показује да неке променљиве имају НА. Чишћење података врши се на следећи начин
- Отпустите променљиве хоме.дест, кабина, име, Кс и карта
- Направите променљиве фактора за пцласс и преживели
- Баци НА
library(dplyr)# Drop variablesclean_titanic <- titanic % > %select(-c(home.dest, cabin, name, X, ticket)) % > %#Convert to factor levelmutate(pclass = factor(pclass, levels = c(1, 2, 3), labels = c('Upper', 'Middle', 'Lower')),survived = factor(survived, levels = c(0, 1), labels = c('No', 'Yes'))) % > %na.omit()glimpse(clean_titanic)
Објашњење кода
- селецт (-ц (хоме.дест, кабина, име, Кс, карта)): Испустите непотребне променљиве
- пцласс = фактор (пцласс, нивои = ц (1,2,3), лабелс = ц ('Горњи', 'Средњи', 'Доњи')): Додајте ознаку променљивој пцласс. 1 постаје Горњи, 2 постаје МИддле и 3 постаје нижи
- фактор (преживели, нивои = ц (0,1), ознаке = ц ('Не', 'Да')): Додајте ознаку преживелој променљивој. 1 постаје Не, а 2 постаје Да
- на.омит (): Уклоните запажања НА
Излаз:
## Observations: 1,045## Variables: 8## $ pclassUpper, Lower, Lower, Upper, Middle, Upper, Middle, U… ## $ survived No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y… ## $ sex male, male, female, female, male, male, female, male… ## $ age 61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0,… ## $ sibsp 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,… ## $ parch 0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,… ## $ fare 32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542,… ## $ embarked S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C…
Корак 3) Направите воз / тест сет
Пре него што обучите свој модел, потребно је да извршите два корака:
- Направите воз и тест сет: Тренирате модел на возном парку и тестирате предвиђање на тестном скупу (тј. Невиђени подаци)
- Инсталирајте рпарт.плот са конзоле
Уобичајена пракса је да се подаци деле 80/20, 80 процената података служи за обуку модела, а 20 процената за предвиђање. Треба да креирате два одвојена оквира података. Не желите да додирујете тестни сет док не завршите изградњу свог модела. Можете креирати име функције цреате_траин_тест () које узима три аргумента.
create_train_test(df, size = 0.8, train = TRUE)arguments:-df: Dataset used to train the model.-size: Size of the split. By default, 0.8. Numerical value-train: If set to `TRUE`, the function creates the train set, otherwise the test set. Default value sets to `TRUE`. Boolean value.You need to add a Boolean parameter because R does not allow to return two data frames simultaneously.
create_train_test <- function(data, size = 0.8, train = TRUE) {n_row = nrow(data)total_row = size * n_rowtrain_sample < - 1: total_rowif (train == TRUE) {return (data[train_sample, ])} else {return (data[-train_sample, ])}}
Објашњење кода
- функција (подаци, величина = 0,8, воз = ИСТИНА): додајте аргументе у функцији
- н_ров = нров (подаци): Броји број редова у скупу података
- тотал_ров = сизе * н_ров: Вратите н-ти ред за конструкцију воза
- воз_узорак <- 1: тотал_ров: Изаберите први ред до н-тих редова
- иф (воз == ИСТИНИТО) {} елсе {}: Ако се услов постави на тачно, вратите скуп возова, иначе тест скуп.
Можете да тестирате своју функцију и проверите димензију.
data_train <- create_train_test(clean_titanic, 0.8, train = TRUE)data_test <- create_train_test(clean_titanic, 0.8, train = FALSE)dim(data_train)
Излаз:
## [1] 836 8
dim(data_test)
Излаз:
## [1] 209 8
Скуп података о возу има 1046 редова, док тестни сет има 262 реда.
Користите функцију проп.табле () у комбинацији са табелом () да бисте проверили да ли је поступак рандомизације тачан.
prop.table(table(data_train$survived))
Излаз:
#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Излаз:
#### No Yes## 0.5789474 0.4210526
У оба скупа података број преживелих је једнак, око 40 процената.
Инсталирајте рпарт.плот
рпарт.плот није доступан из библиотека цонда. Можете га инсталирати са конзоле:
install.packages("rpart.plot")
Корак 4) Изградите модел
Спремни сте за изградњу модела. Синтакса функције стабла одлука Рпарт је:
rpart(formula, data=, method='')arguments:- formula: The function to predict- data: Specifies the data frame- method:- "class" for a classification tree- "anova" for a regression tree
Користите метод класе јер предвиђате класу.
library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106
Објашњење кода
- рпарт (): Функција која одговара моделу. Аргументи су:
- преживела ~ .: Формула стабала за одлучивање
- дата = дата_траин: Скуп података
- метход = 'цласс': Уклапање бинарног модела
- рпарт.плот (фит, ектра = 106): Уцртајте дрво. Додатне функције су постављене на 101 да би приказале вероватноћу 2. класе (корисно за бинарне одговоре). За више информација о осталим изборима можете се обратити вињети.
Излаз:
Почињете од коренског чвора (дубина 0 преко 3, врх графикона):
- На врху је укупна вероватноћа преживљавања. Приказује проценат путника који су преживели несрећу. Преживјело је 41 посто путника.
- Овај чвор пита да ли је пол путника мушки. Ако је одговор да, онда се спустите на леви подређени чвор корена (дубина 2). 63 процента су мушкарци са вероватноћом преживљавања од 21 процента.
- У другом чвору питате да ли је мушки путник старији од 3,5 године. Ако је одговор да, онда је шанса за преживљавање 19 процената.
- Наставите тако да бисте схватили које особине утичу на вероватноћу преживљавања.
Имајте на уму да је један од многих квалитета стабала за одлучивање да захтевају врло мало припреме података. Посебно им није потребно скалирање или центрирање карактеристика.
Функција рпарт () подразумевано користи меру Гини нечистоће за поделу ноте. Што је већи Гинијев коефицијент, то је више различитих случајева у чвору.
Корак 5) Направите предвиђање
Можете предвидети тестни скуп података. Да бисте направили предвиђање, можете да користите функцију предвиђања (). Основна синтакса предвиђања за Р стабло одлука је:
predict(fitted_model, df, type = 'class')arguments:- fitted_model: This is the object stored after model estimation.- df: Data frame used to make the prediction- type: Type of prediction- 'class': for classification- 'prob': to compute the probability of each class- 'vector': Predict the mean response at the node level
Из скупа тестова желите да предвидите који ће путници вероватније преживети након судара. Значи, међу тих 209 путника знаћете који ће преживети или не.
predict_unseen <-predict(fit, data_test, type = 'class')
Објашњење кода
- предвиђати (фит, дата_тест, типе = 'цласс'): Предвидјети класу (0/1) тест скупа
Тестирање путника који није стигао и оних који јесу.
table_mat <- table(data_test$survived, predict_unseen)table_mat
Објашњење кода
- табела (дата_тест $ преживио, предицт_унсеен): Направите табелу за бројање колико је путника класификовано као преживелих и преминулих у поређењу са тачном класификацијом стабла одлука у Р
Излаз:
## predict_unseen## No Yes## No 106 15## Yes 30 58
Модел је тачно предвидео 106 мртвих путника, али је 15 преживелих класификовао као мртве. По аналогији, модел је 30 путника погрешно класификовао као преживеле док се испоставило да су мртви.
Корак 6) Измерите перформансе
Можете израчунати меру тачности за задатак класификације помоћу матрице забуне :
Матрица конфузија је бољи избор за процену учинка класификације. Општа идеја је да се изброји колико пута су истините инстанце класификоване као Нетачне.
Сваки ред у матрици забуне представља стварни циљ, док свака колона представља предвиђени циљ. Први ред ове матрице разматра мртве путнике (класа Фалсе): 106 је тачно класификовано као мртво ( Тачно негативно ), док је преостало погрешно класификовано као преживело ( Лажно позитивно ). Други ред узима у обзир преживеле, позитивна класа је била 58 ( тачно позитивна ), док је тачно негативна била 30.
Тест тачности можете израчунати из матрице забуне:
То је удео тачно позитивних и истинито негативних у збиру матрице. Са Р можете кодирати на следећи начин:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Објашњење кода
- сума (диаг (табле_мат)): Збир дијагонале
- сума (табле_мат): Збир матрице.
Можете да одштампате тачност тестног скупа:
print(paste('Accuracy for test', accuracy_Test))
Излаз:
## [1] "Accuracy for test 0.784688995215311"
За тестни сет имате резултат од 78 процената. Можете поновити исту вежбу помоћу скупа података о обуци.
Корак 7) Подесите хипер-параметре
Стабло одлучивања у Р има различите параметре који контролишу аспекте уклапања. У библиотеци стабла одлука рпарт можете контролисати параметре помоћу функције рпарт.цонтрол (). У следећем коду уводите параметре које ћете подесити. За остале параметре можете се обратити вињети.
rpart.control(minsplit = 20, minbucket = round(minsplit/3), maxdepth = 30)Arguments:-minsplit: Set the minimum number of observations in the node before the algorithm perform a split-minbucket: Set the minimum number of observations in the final note i.e. the leaf-maxdepth: Set the maximum depth of any node of the final tree. The root node is treated a depth 0
Наставићемо како следи:
- Конструисати функцију за враћање тачности
- Подесите максималну дубину
- Подесите минимални број узорка који чвор мора да има пре него што се подели
- Подесите минимални број узорка који мора имати чвор листа
Можете написати функцију за приказ тачности. Једноставно обмотате код који сте раније користили:
- предвидјети: предицт_унсеен <- предвидјети (фит, дата_тест, типе = 'цласс')
- Израда табеле: табле_мат <- табела (дата_тест $ преживио, предицт_унсеен)
- Израчунајте тачност: тачност_Тест <- сума (диаг (табле_мат)) / сум (табле_мат)
accuracy_tune <- function(fit) {predict_unseen <- predict(fit, data_test, type = 'class')table_mat <- table(data_test$survived, predict_unseen)accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)accuracy_Test}
Можете покушати подесити параметре и видети да ли можете побољшати модел у односу на подразумевану вредност. Подсећања ради, морате добити тачност већу од 0,78
control <- rpart.control(minsplit = 4,minbucket = round(5 / 3),maxdepth = 3,cp = 0)tune_fit <- rpart(survived~., data = data_train, method = 'class', control = control)accuracy_tune(tune_fit)
Излаз:
## [1] 0.7990431
Са следећим параметром:
minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0
Добијате веће перформансе од претходног модела. Свака част!
Резиме
Можемо резимирати функције за обуку алгоритма стабла одлучивања у Р
Библиотека |
објективан |
функцију |
класа |
параметри |
детаљи |
---|---|---|---|---|---|
рпарт |
Дрво класификације возова у Р. |
рпарт () |
класа |
формула, дф, метода | |
рпарт |
Дрво регресије возова |
рпарт () |
анова |
формула, дф, метода | |
рпарт |
Зацртајте дрвеће |
рпарт.плот () |
уграђени модел | ||
база |
предвидјети |
предвидети () |
класа |
уграђени модел, тип | |
база |
предвидјети |
предвидети () |
проб |
уграђени модел, тип | |
база |
предвидјети |
предвидети () |
вектор |
уграђени модел, тип | |
рпарт |
Контролни параметри |
рпарт.цонтрол () |
минсплит |
Поставите минимални број запажања у чвору пре него што алгоритам изврши поделу |
|
минбуцкет |
Поставите минимални број запажања у завршној белешци, односно на листу |
||||
макдептх |
Поставите максималну дубину било којег чвора завршног стабла. Коренски чвор се третира дубином 0 |
||||
рпарт |
Модел воза са управљачким параметром |
рпарт () |
формула, дф, метода, контрола |
Напомена: Обучите модел на подацима обуке и тестирајте перформансе на невиђеном скупу података, односно скупу тестова.