इस यूनिट में, YDF (Yggdrasil Decision Forest) लाइब्रेरी का इस्तेमाल करके, डिसीज़न ट्री को ट्रेन और इंटरप्रेट किया जाएगा.
यह यूनिट, 🧭 YDF Getting Started ट्यूटोरियल से ली गई है.
प्रारंभिक दौर
डेटासेट का विश्लेषण करने से पहले, ये काम करें:
- नई Colab notebook बनाएं.
- अपनी नई Colab notebook में, YDF लाइब्रेरी इंस्टॉल करने के लिए, कोड की इस लाइन को डालें और इसे एक्ज़ीक्यूट करें:
!pip install ydf -U
- इन लाइब्रेरी को इंपोर्ट करें:
import ydf import numpy as np import pandas as pd
पामर पेंग्विन डेटासेट
इस Colab में Palmer Penguins डेटासेट का इस्तेमाल किया गया है. इसमें पेंग्विन की तीन प्रजातियों के साइज़ की मेज़रमेंट शामिल हैं:
- चिनस्ट्रैप
- Gentoo
- एडेल
यह एक क्लासिफ़िकेशन समस्या है. इसका मकसद, पामर के पेंग्विन डेटासेट में मौजूद डेटा के आधार पर, पेंग्विन की प्रजाति का अनुमान लगाना है. यहां पेंग्विन दिए गए हैं:
इमेज 16. पेंग्विन की तीन अलग-अलग प्रजातियां. इमेज क्रेडिट: @allisonhorst
नीचे दिए गए कोड में, pandas फ़ंक्शन को कॉल किया गया है. इससे, पामर पेंग्विन डेटासेट को मेमोरी में लोड किया जाता है:
path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"
# Display the first 3 examples.
dataset.head(3)
यहां दी गई टेबल में, Palmer Penguins डेटासेट के पहले तीन उदाहरणों को फ़ॉर्मैट किया गया है:
तीसरी टेबल. पामर पेंग्विन में दिए गए पहले तीन उदाहरण
प्रजाति | द्वीप | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | लिंग | वर्ष | |
---|---|---|---|---|---|---|---|---|
0 | एडेल | Torgersen | 39.1 | 18.7 | 181.0 | 3750.0 | पुरुष | 2007 |
1 | एडेल | Torgersen | 39.5 | 17.4 | 186.0 | 3800.0 | महिला | 2007 |
2 | एडेल | Torgersen | 40.3 | 18.0 | 195.0 | 3250.0 | महिला | 2007 |
पूरे डेटासेट में संख्यात्मक (उदाहरण के लिए, bill_depth_mm
), कैटगरी (उदाहरण के लिए, island
) और छूटी हुई सुविधाओं का मिक्सचर होता है. न्यूरल नेटवर्क के उलट, डिसिज़न फ़ॉरेस्ट इन सभी तरह की सुविधाओं के साथ काम करते हैं. इसलिए, आपको वन-हॉट एन्कोडिंग, सामान्यीकरण या is_present सुविधा का इस्तेमाल करने की ज़रूरत नहीं है.
नीचे दी गई कोड सेल, डेटासेट को ट्रेनिंग सेट और टेस्टिंग सेट में बांटती है:
# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2
train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]
print("Training examples: ", len(train_dataset))
# >> Training examples: 272
print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72
डिफ़ॉल्ट हाइपरपैरामीटर के साथ डिसिज़न ट्री को ट्रेन करना
किसी भी हाइपरपैरामीटर को तय किए बिना, CART (Classification and Regression Trees) लर्निंग एल्गोरिदम (इसे लर्नर भी कहा जाता है) की मदद से, अपना पहला डिसिज़न ट्री ट्रेन किया जा सकता है.
ऐसा इसलिए होता है, क्योंकि ydf.CartLearner
लर्नर, हाइपरपैरामीटर की अच्छी डिफ़ॉल्ट वैल्यू देता है. इस तरह का मॉडल कैसे काम करता है, इसके बारे में आपको कोर्स में आगे बताया जाएगा.
model = ydf.CartLearner(label=label).train(train_dataset)
पिछली कॉल में, इनपुट सुविधाओं के तौर पर इस्तेमाल किए जाने वाले कॉलम के बारे में नहीं बताया गया था. इसलिए, ट्रेनिंग सेट के हर कॉलम का इस्तेमाल किया जाता है. कॉल में, इनपुट सुविधाओं के सिमैंटिक (उदाहरण के लिए, संख्यात्मक, कैटगरी के हिसाब से, टेक्स्ट) के बारे में भी नहीं बताया गया था. इसलिए, सुविधा के सिमैंटिक अपने-आप अनुमानित हो जाते हैं.
फ़ैसले से जुड़ा ट्री दिखाने के लिए, model.plot_tree()
को कॉल करें:
model.plot_tree()
Colab में, माउस का इस्तेमाल करके कुछ खास एलिमेंट के बारे में जानकारी दिखाई जा सकती है. जैसे, हर नोड में क्लास डिस्ट्रिब्यूशन.
इमेज 17. डिफ़ॉल्ट हाइपरपैरामीटर के साथ ट्रेन किया गया डिसिज़न ट्री.
Colab दिखाता है कि रूट की स्थिति में 243 उदाहरण शामिल हैं. हालांकि, आपको याद होगा कि ट्रेनिंग डेटासेट में 272 उदाहरण शामिल थे. बाकी 29 उदाहरणों को पुष्टि करने और ट्री प्रूनिंग के लिए अपने-आप रिज़र्व कर दिया गया है.
पहली शर्त में, bill_depth_mm
की वैल्यू की जांच की जाती है. टेबल 4 और 5 में, पहली शर्त के नतीजे के आधार पर अलग-अलग प्रजातियों के होने की संभावना दिखाई गई है.
टेबल 4. bill_depth_mm ≥
42.3
होने पर अलग-अलग प्रजातियों के दिखने की संभावना
प्रजाति | मेल खाने की संभावना |
---|---|
ऐडेली (लाल) | 8% |
Gentoo (नीला) | 58% |
चिनस्ट्रैप (हरा) | 36% |
टेबल 5. अगर bill_depth_mm < 42.3
है, तो अलग-अलग प्रजातियों के दिखने की संभावना
प्रजाति | मेल खाने की संभावना |
---|---|
ऐडेली (लाल) | 97% |
Gentoo (नीला) | 2% |
चिनस्ट्रैप (हरा) | 0% |
bill_depth_mm
एक संख्यात्मक सुविधा है. इसलिए, 42.3 वैल्यू को संख्यात्मक सुविधाओं के साथ बाइनरी क्लासिफ़िकेशन के लिए सटीक स्प्लिटिंग एल्गोरिदम का इस्तेमाल करके पता लगाया गया था.
अगर bill_depth_mm ≥ 42.3
सही है, तो आगे यह जांच की जाती है कि flipper_length_mm ≥ 207.5
, जेंटू और जेंटू+एडली को लगभग पूरी तरह से अलग कर सकता है या नहीं.
नीचे दिए गए कोड से, मॉडल की ट्रेनिंग और टेस्ट की सटीक जानकारी मिलती है:
train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy: 0.9338
test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy: 0.9167
ऐसा कम ही होता है, लेकिन ऐसा हो सकता है कि टेस्ट की सटीकता, ट्रेनिंग की सटीकता से ज़्यादा हो. ऐसे में, हो सकता है कि टेस्ट सेट, ट्रेनिंग सेट से अलग हो. हालांकि, यहां ऐसा नहीं है, क्योंकि ट्रेन और टेस्ट को रैंडम तरीके से बांटा गया था. इसकी वजह यह हो सकती है कि टेस्ट डेटासेट बहुत छोटा है. इसमें सिर्फ़ 72 उदाहरण हैं. इसलिए, सटीकता का अनुमान सही नहीं है.
इस तरह के छोटे डेटासेट के लिए, क्रॉस-वैलिडेशन का इस्तेमाल करना बेहतर होगा. इससे, आकलन करने वाली मेट्रिक की ज़्यादा सटीक वैल्यू का हिसाब लगाया जा सकेगा. हालांकि, इस उदाहरण में हम ट्रेनिंग और टेस्टिंग को जारी रखते हैं, ताकि इसे आसानी से समझा जा सके.
मॉडल के हाइपरपैरामीटर को बेहतर बनाना
यह मॉडल, एक डिसिज़न ट्री है. इसे हाइपरपैरामीटर की डिफ़ॉल्ट वैल्यू के साथ ट्रेन किया गया है. बेहतर अनुमान पाने के लिए, ये काम किए जा सकते हैं:
ज़्यादा बेहतर तरीके से सीखने वाले मॉडल का इस्तेमाल करें. जैसे, रैंडम फ़ॉरेस्ट या ग्रेडिएंट बूस्टेड ट्री मॉडल. उन लर्निंग एल्गोरिदम के बारे में अगले पेज पर बताया जाएगा.
ऑप्टिमाइज़र, आपकी टिप्पणियों और अनुमानों का इस्तेमाल करके हाइपरपैरामीटर को ऑप्टिमाइज़ करता है. मॉडल को बेहतर बनाने से जुड़ी गाइड आपके काम आ सकती है.
हाइपरपैरामीटर ट्यूनिंग का इस्तेमाल करके, संभावित हाइपरपैरामीटर की बड़ी संख्या की अपने-आप जांच करें.
हमने अब तक रैंडम फ़ॉरेस्ट और ग्रेडिएंट बूस्टेड ट्री एल्गोरिदम नहीं देखा है. साथ ही, उदाहरणों की संख्या इतनी कम है कि अपने-आप हाइपरपैरामीटर ट्यूनिंग नहीं की जा सकती. इसलिए, आपको मॉडल को मैन्युअल तरीके से बेहतर बनाना होगा.
ऊपर दिखाया गया फ़ैसला लेने वाला ट्री छोटा है. साथ ही, 61 उदाहरणों वाले लीफ़ में, ऐडेली और चिनस्ट्रैप लेबल का मिक्सचर शामिल है. एल्गोरिदम ने इस पत्ती को और क्यों नहीं बांटा? इसके दो संभावित कारण हैं:
- ऐसा हो सकता है कि हर लीफ़ के लिए, सैंपल की कम से कम संख्या (डिफ़ॉल्ट रूप से
min_examples=5
) पूरी हो गई हो. - ओवरफ़िटिंग को रोकने के लिए, ट्री को बांटा गया हो और फिर उसे छोटा किया गया हो.
उदाहरणों की कम से कम संख्या को घटाकर 1 करें और नतीजे देखें:
model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()
इमेज 18. min_examples=1 के साथ ट्रेन किया गया डिसिज़न ट्री.
61 उदाहरणों वाले लीफ़ नोड को कई बार बांटा गया है.
यह देखने के लिए कि नोड को और हिस्सों में बांटना फ़ायदेमंद है या नहीं, हम टेस्ट डेटासेट पर इस नए मॉडल की क्वालिटी का आकलन करते हैं:
print(model.evaluate(test_dataset).accuracy)
# >> 0.97222
मॉडल की क्वालिटी बेहतर हुई है. टेस्ट की सटीकता 0.9167 से बढ़कर 0.97222 हो गई है. हाइपरपैरामीटर में यह बदलाव करना एक अच्छा आइडिया था.
फ़ैसले लेने वाले फ़ॉरेस्ट की झलक
हाइपरपैरामीटर को लगातार बेहतर बनाकर, हम शायद पूरी तरह से सटीक नतीजे पा सकते हैं. हालांकि, इस मैन्युअल प्रोसेस के बजाय, हम रैंडम फ़ॉरेस्ट जैसे ज़्यादा बेहतर मॉडल को ट्रेन कर सकते हैं. इससे हमें यह पता चलेगा कि क्या यह मॉडल बेहतर तरीके से काम करता है.
model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111
रैंडम फ़ॉरेस्ट की सटीकता, हमारे सामान्य ट्री से बेहतर है. आपको अगले पेजों में इसकी वजह पता चलेगी.
इस्तेमाल और सीमाएं
जैसा कि पहले बताया गया है, एक सिंगल डिसीज़न ट्री की क्वालिटी, रैंडम फ़ॉरेस्ट, ग्रेडिएंट बूस्टेड ट्री, और न्यूरल नेटवर्क जैसी आधुनिक मशीन लर्निंग के तरीकों की तुलना में अक्सर कम होती है. हालांकि, इन मामलों में डिसिज़न ट्री अब भी काम के होते हैं:
- ज़्यादा मुश्किल तरीकों का आकलन करने के लिए, एक आसान और कम खर्चीली बेसलाइन के तौर पर.
- जब मॉडल की क्वालिटी और व्याख्या करने की क्षमता के बीच समझौता करना हो.
- यह फ़ैसला लेने वाले फ़ॉरेस्ट मॉडल के प्रॉक्सी के तौर पर काम करता है. इस मॉडल के बारे में कोर्स में बाद में बताया जाएगा.