निर्णय पेड़ क्या हैं?
निर्णय पेड़ बहुमुखी मशीन लर्निंग एल्गोरिथ्म हैं जो वर्गीकरण और प्रतिगमन दोनों कार्य कर सकते हैं। वे बहुत शक्तिशाली एल्गोरिदम हैं, जो जटिल डेटासेट फिटिंग में सक्षम हैं। इसके अलावा, निर्णय वृक्ष यादृच्छिक जंगलों के मूलभूत घटक हैं, जो आज उपलब्ध सबसे शक्तिशाली मशीन लर्निंग एल्गोरिदम में से हैं।
निर्णय पेड़ों का प्रशिक्षण और कल्पना करना
R उदाहरण में अपना पहला निर्णय ट्री बनाने के लिए, हम इस निर्णय ट्री ट्यूटोरियल में आगे बढ़ेंगे:
- चरण 1: डेटा आयात करें
- चरण 2: डेटासेट को साफ करें
- चरण 3: ट्रेन / परीक्षण सेट बनाएं
- चरण 4: मॉडल बनाएँ
- चरण 5: भविष्यवाणी करें
- चरण 6: प्रदर्शन को मापें
- चरण 7: हाइपर-मापदंडों को ट्यून करें
चरण 1) डेटा आयात करें
यदि आप टाइटैनिक के भाग्य के बारे में उत्सुक हैं, तो आप इस वीडियो को Youtube पर देख सकते हैं। इस डेटासेट का उद्देश्य यह अनुमान लगाना है कि हिमखंड से टकराने के बाद किन लोगों के बचने की संभावना है। डेटासेट में 13 चर और 1309 अवलोकन होते हैं। डेटासेट को चर X द्वारा आदेश दिया गया है।
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: nrow (टाइटैनिक)): 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) डेटासेट को साफ करें
डेटा की संरचना से पता चलता है कि कुछ चर में NA है। डेटा को निम्नानुसार किया जाना चाहिए
- घर, केबिन, नाम, एक्स और टिकट को छोड़ दें
- Pclass और बचे के लिए कारक चर बनाएँ
- NA ड्रॉप करें
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)
कोड स्पष्टीकरण
- चयन (-c (home.dest, केबिन, नाम, एक्स, टिकट)): अनावश्यक चर छोड़ें
- pclass = factor (पक्लास, लेवल = c (1,2,3), लेबल = c ('अपर', 'मिडिल', 'लोअर')): वेरिएबल pclass में लेबल जोड़ें। 1 ऊपरी हो जाता है, 2 MIddle बन जाता है और 3 निचला हो जाता है
- फ़ैक्टर (बचे, स्तर = सी (0,1), लेबल = सी ('नहीं', 'हां')): लेबल को वेरिएबल में जोड़ें। 1 बन जाता है और 2 हो जाता है
- na.omit (): NA टिप्पणियों को निकालें
आउटपुट:
## 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) ट्रेन / परीक्षण सेट बनाएं
अपने मॉडल को प्रशिक्षित करने से पहले, आपको दो चरण करने होंगे:
- एक ट्रेन और परीक्षण सेट बनाएँ: आप ट्रेन सेट पर मॉडल को प्रशिक्षित करते हैं और परीक्षण सेट (यानी अनदेखी डेटा) पर भविष्यवाणी का परीक्षण करते हैं
- कंसोल से rpart.plot स्थापित करें
सामान्य अभ्यास डेटा को 80/20 को विभाजित करना है, 80 प्रतिशत डेटा मॉडल को प्रशिक्षित करने के लिए कार्य करता है, और पूर्वानुमान बनाने के लिए 20 प्रतिशत। आपको दो अलग-अलग डेटा फ़्रेम बनाने की आवश्यकता है। जब तक आप अपने मॉडल का निर्माण पूरा नहीं कर लेते, तब तक आप परीक्षण सेट को स्पर्श नहीं करना चाहते। आप एक फ़ंक्शन नाम create_train_test () बना सकते हैं जो तीन तर्क लेता है।
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, ट्रेन = ट्रू): फ़ंक्शन में तर्क जोड़ें
- n_row = nrow (data): डेटासेट में पंक्तियों की संख्या की गणना करें
- Total_row = size * n_row: ट्रेन सेट के निर्माण के लिए nth पंक्ति लौटें
- train_sample <- 1: total_row: पहली पंक्ति को nth पंक्तियों के लिए चुनें
- if (train == TRUE) {} और {}: यदि शर्त सही है, तो ट्रेन सेट लौटा दें, अन्यथा परीक्षण सेट।
आप अपने फ़ंक्शन का परीक्षण कर सकते हैं और आयाम की जांच कर सकते हैं।
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 पंक्तियाँ हैं।
रैंडमाइजेशन प्रक्रिया सही है या नहीं, यह जाँचने के लिए आप function prop.table () को टेबल के साथ मिलाते हैं।
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 प्रतिशत।
Rpart.plot स्थापित करें
rpart.plot कोंडा लाइब्रेरी से उपलब्ध नहीं है। आप इसे कंसोल से इंस्टॉल कर सकते हैं:
install.packages("rpart.plot")
चरण 4) मॉडल बनाएं
आप मॉडल बनाने के लिए तैयार हैं। Rpart निर्णय ट्री फ़ंक्शन के लिए सिंटैक्स है:
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
कोड स्पष्टीकरण
- rpart (): मॉडल फिट करने के लिए फ़ंक्शन। तर्क हैं:
- बच गया ।: निर्णय पेड़ों का सूत्र
- data = data_train: डेटासेट
- विधि = 'वर्ग': एक बाइनरी मॉडल को फिट करें
- rpart.plot (फिट, अतिरिक्त = 106): पेड़ प्लॉट करें। 2 वर्ग की संभावना (बाइनरी प्रतिक्रियाओं के लिए उपयोगी) को प्रदर्शित करने के लिए अतिरिक्त सुविधाओं को 101 पर सेट किया गया है। आप अन्य विकल्पों के बारे में अधिक जानकारी के लिए विगनेट का उल्लेख कर सकते हैं।
आउटपुट:
आप रूट नोड (गहराई 0 से अधिक 3, ग्राफ़ के ऊपर) पर शुरू करते हैं:
- शीर्ष पर, यह अस्तित्व की समग्र संभावना है। यह यात्री के अनुपात को दिखाता है जो दुर्घटना में बच गया। 41 प्रतिशत यात्री बच गए।
- यह नोड पूछता है कि क्या यात्री का लिंग पुरुष है। यदि हाँ, तो आप रूट के बाएं बच्चे के नोड (गहराई 2) पर जाते हैं। 63 प्रतिशत 21 प्रतिशत की जीवित रहने की संभावना वाले पुरुष हैं।
- दूसरे नोड में, आप पूछते हैं कि क्या पुरुष यात्री 3.5 वर्ष से ऊपर है। यदि हाँ, तो बचने की संभावना 19 प्रतिशत है।
- आप इस बात को समझने की कोशिश करते हैं कि जीवित रहने की संभावना पर क्या प्रभाव पड़ता है।
ध्यान दें, निर्णय पेड़ों के कई गुणों में से एक यह है कि उन्हें बहुत कम डेटा तैयार करने की आवश्यकता होती है। विशेष रूप से, उन्हें फीचर स्केलिंग या सेंटरिंग की आवश्यकता नहीं होती है।
डिफ़ॉल्ट रूप से, rpart () फ़ंक्शन नोट को विभाजित करने के लिए गिनी अशुद्धता उपाय का उपयोग करता है । गिन्नी गुणांक जितना अधिक होगा, नोड के भीतर और अधिक अलग-अलग उदाहरण।
चरण 5) एक भविष्यवाणी करें
आप अपने परीक्षण डेटासेट की भविष्यवाणी कर सकते हैं। भविष्यवाणी करने के लिए, आप पूर्वानुमान () फ़ंक्शन का उपयोग कर सकते हैं। R निर्णय वृक्ष के लिए पूर्वानुमान का मूल सिंटैक्स है:
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')
कोड स्पष्टीकरण
- भविष्यवाणी (फिट, data_test, टाइप = 'क्लास'): टेस्ट सेट की कक्षा (0/1) की भविष्यवाणी करें
उस यात्री का परीक्षण करना जिसने इसे नहीं बनाया और जिन्होंने इसे किया।
table_mat <- table(data_test$survived, predict_unseen)table_mat
कोड स्पष्टीकरण
- तालिका (data_test $ बच गई, predict_unseen): यह गणना करने के लिए एक तालिका बनाएं कि कितने यात्रियों को उत्तरजीवी के रूप में वर्गीकृत किया गया है और आर में सही निर्णय पेड़ वर्गीकरण की तुलना में उनका निधन हो गया है
आउटपुट:
## predict_unseen## No Yes## No 106 15## Yes 30 58
मॉडल ने 106 मृत यात्रियों की सही भविष्यवाणी की, लेकिन 15 जीवित लोगों को मृत घोषित कर दिया। सादृश्य से, मॉडल ने 30 यात्रियों को जीवित रहने के रूप में गर्भपात कर दिया, जबकि वे मृत हो गए।
चरण 6) प्रदर्शन को मापें
आप भ्रम मैट्रिक्स के साथ वर्गीकरण कार्य के लिए एक सटीकता माप की गणना कर सकते हैं :
भ्रम मैट्रिक्स वर्गीकरण प्रदर्शन का मूल्यांकन करने के लिए एक बेहतर विकल्प है। सामान्य विचार यह है कि संख्या को गिनना सही है उदाहरणों को वर्गीकृत किया गया है जो गलत हैं।
एक भ्रम मैट्रिक्स में प्रत्येक पंक्ति एक वास्तविक लक्ष्य का प्रतिनिधित्व करती है, जबकि प्रत्येक कॉलम एक अनुमानित लक्ष्य का प्रतिनिधित्व करता है। इस मैट्रिक्स की पहली पंक्ति मृत यात्रियों (झूठी श्रेणी) पर विचार करती है: 106 को सही ढंग से मृत ( सच्चा नकारात्मक ) के रूप में वर्गीकृत किया गया था, जबकि शेष को गलत तरीके से एक उत्तरजीवी ( झूठी सकारात्मक ) के रूप में वर्गीकृत किया गया था । दूसरी पंक्ति जीवित बचे लोगों को मानती है, सकारात्मक वर्ग 58 ( ट्रू पॉजिटिव ) थे, जबकि ट्रू नेगेटिव 30 था।
आप भ्रम मैट्रिक्स से सटीकता परीक्षण की गणना कर सकते हैं :
यह मैट्रिक्स के योग पर वास्तविक सकारात्मक और वास्तविक नकारात्मक का अनुपात है। R के साथ, आप निम्नानुसार कोड कर सकते हैं:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
कोड स्पष्टीकरण
- sum (diag (table_mat)): विकर्ण का योग
- sum (table_mat): मैट्रिक्स का योग।
आप परीक्षण सेट की सटीकता को प्रिंट कर सकते हैं:
print(paste('Accuracy for test', accuracy_Test))
आउटपुट:
## [1] "Accuracy for test 0.784688995215311"
टेस्ट सेट के लिए आपका स्कोर 78 प्रतिशत है। आप प्रशिक्षण डाटासेट के साथ एक ही अभ्यास को दोहरा सकते हैं।
चरण 7) हाइपर-मापदंडों को ट्यून करें
R में निर्णय पेड़ में विभिन्न पैरामीटर हैं जो फिट के पहलुओं को नियंत्रित करते हैं। Rpart निर्णय ट्री लाइब्रेरी में, आप rpart.control () फ़ंक्शन का उपयोग करके मापदंडों को नियंत्रित कर सकते हैं। निम्नलिखित कोड में, आप उन मापदंडों का परिचय देंगे जिन्हें आप ट्यून करेंगे। आप अन्य मापदंडों के लिए विगनेट को संदर्भित कर सकते हैं।
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
हम इस प्रकार आगे बढ़ेंगे:
- सटीकता लौटने के लिए समारोह का निर्माण
- अधिकतम गहराई ट्यून करें
- विभाजित होने से पहले एक नोड के पास न्यूनतम संख्या का ट्यून होना चाहिए
- एक पत्ती नोड नमूना की न्यूनतम संख्या को ट्यून करें
आप सटीकता प्रदर्शित करने के लिए एक फ़ंक्शन लिख सकते हैं। आप बस उस कोड को लपेटते हैं जो आपने पहले इस्तेमाल किया था:
- भविष्यवाणी: predict_unseen <- भविष्यवाणी (फिट, data_test, प्रकार = 'वर्ग')
- तालिका का निर्माण करें: table_mat <- table (data_test $ बच गया, predict_unseen)
- गणना सटीकता: सटीकता_TEST <- योग (डायग (table_mat)) / राशि (table_mat)
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
आपको पिछले मॉडल की तुलना में उच्च प्रदर्शन मिलता है। बधाई!
सारांश
हम आर में एक निर्णय ट्री एल्गोरिदम को प्रशिक्षित करने के लिए कार्यों को सारांशित कर सकते हैं
पुस्तकालय |
उद्देश्य |
समारोह |
कक्षा |
मापदंडों |
विवरण |
---|---|---|---|---|---|
नापने का यंत्र |
ट्रेन का वर्गीकरण ट्री आर में |
समकक्ष () |
कक्षा |
सूत्र, डीएफ, विधि | |
नापने का यंत्र |
ट्रेन प्रतिगमन पेड़ |
समकक्ष () |
एनोवा |
सूत्र, डीएफ, विधि | |
नापने का यंत्र |
पेड़ लगाओ |
rpart.plot () |
फिट मॉडल | ||
आधार |
भविष्यवाणी |
भविष्यवाणी () |
कक्षा |
फिट मॉडल, प्रकार | |
आधार |
भविष्यवाणी |
भविष्यवाणी () |
समस्या |
फिट मॉडल, प्रकार | |
आधार |
भविष्यवाणी |
भविष्यवाणी () |
वेक्टर |
फिट मॉडल, प्रकार | |
नापने का यंत्र |
नियंत्रण के मानकों |
rpart.control () |
टकसाल |
एल्गोरिथ्म एक विभाजन करने से पहले नोड में टिप्पणियों की न्यूनतम संख्या निर्धारित करें |
|
टकसाल |
अंतिम नोट यानी पत्ती में टिप्पणियों की न्यूनतम संख्या निर्धारित करें |
||||
अधिकतम गहराई |
अंतिम पेड़ के किसी भी नोड की अधिकतम गहराई निर्धारित करें। रूट नोड को 0 गहराई का इलाज किया जाता है |
||||
नापने का यंत्र |
नियंत्रण पैरामीटर के साथ ट्रेन मॉडल |
समकक्ष () |
सूत्र, डीएफ, विधि, नियंत्रण |
नोट: एक प्रशिक्षण डेटा पर मॉडल को प्रशिक्षित करें और एक अनदेखी डेटासेट पर परीक्षण का परीक्षण करें, अर्थात सेट करें।