डिसिज़न ट्री बनाना

इस यूनिट में, आप YDF (Yggdrasil डेडिसियन फ़ॉरेस्ट) लाइब्रेरी ट्रेन का इस्तेमाल करेंगे और डिसिज़न ट्री की व्याख्या करेंगे.

यह यूनिट 🧭 YDF शुरुआती जानकारी ट्यूटोरियल से प्रेरित है.

प्रारंभिक दौर

डेटासेट का अध्ययन करने से पहले, ये काम करें:

  1. नया Colab नोटबुक बनाएं.
  2. अपनी नई Colab notebook में YDF लाइब्रेरी को इंस्टॉल करने के लिए, कोड की इस लाइन को डालें और लागू करें:
    !pip install ydf -U
    
  3. इन लाइब्रेरी को इंपोर्ट करें:
    import ydf
    import numpy as np
    import pandas as pd
    

पामर पेंगुइन डेटासेट

यह Colab पामर पेंगुइन डेटासेट का इस्तेमाल करता है, जिसमें पेंग्विन की तीन प्रजातियों के साइज़ का मेज़रमेंट शामिल है:

  • चिनस्ट्रैप
  • जेनटू
  • अडेली

यह एक कैटगरी में आने वाली समस्या है. इसका मकसद, पामर के पेंग्विन के डेटासेट के डेटा के आधार पर पेंग्विन की प्रजातियों का अनुमान लगाना है. ये रहे पेंग्विन:

पेंग्विन की तीन अलग-अलग
प्रजातियां.

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)

यहां दी गई टेबल में, पामर पेंग्विन डेटासेट के पहले तीन उदाहरणों को फ़ॉर्मैट किया गया है:

टेबल 3. पामर पेंगुइन के पहले तीन उदाहरण

प्रजाति द्वीप bill_length_mm bill_depth_mm flipper_length_mm body_mass_g लिंग साल
0 अडेली टॉर्गरसन 78 जीबी में से यूरो 181.0 3,750.0 पुरुष 2007
1 अडेली टॉर्गरसन यूरो 78 जीबी में से 186.0 3,800.0 महिला 2007
2 अडेली टॉर्गरसन 40.3 18.0 195.0 3,250.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 (क्लासिफ़िकेशन और रिग्रेशन ट्री) लर्निंग एल्गोरिदम (यानी लर्नर) से अपने सबसे पहले डिसिज़न ट्री को ट्रेनिंग दी जा सकती है. ऐसा इसलिए, क्योंकि सीखने वाला 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%
जेनटू (नीला) 58% की संभावित बचत
चिनस्ट्रैप (हरा) 36% से ज़्यादा हुई

 

टेबल 5. अलग-अलग प्रजातियों की प्रजातियों की संभावना, अगर bill_depth_mm < 42.3

प्रजाति संभावना
अडेली (लाल) 97% से ज़्यादा हुई
जेनटू (नीला) 2%
चिनस्ट्रैप (हरा) 0%

bill_depth_mm संख्या वाली सुविधा है. इसलिए, वैल्यू 42.3 को संख्या वाली सुविधाओं के साथ बाइनरी के वर्गीकरण के लिए सटीक बंटवारे वाले एल्गोरिदम का इस्तेमाल करके, पाया गया था.

अगर bill_depth_mm ≥ 42.3 'सही है' पर सेट है, तो आगे की जांच करके यह पता लगाएं कि flipper_length_mm ≥ 207.5, एंटूस और Gentoos+Adeley से पूरी तरह अलग हो सकता है या नहीं.

यह कोड, इस मॉडल की ट्रेनिंग और जांच को सटीक बनाने के बारे में बताता है:

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 उदाहरण के). इसलिए, इसमें सटीक अनुमान नहीं लगाया जा सकता.

ऐसे छोटे डेटासेट के लिए, क्रॉस-वैलिडेशन का इस्तेमाल करना ज़्यादा बेहतर होगा, क्योंकि इससे आकलन की मेट्रिक की ज़्यादा सटीक वैल्यू का पता लगाया जाता है. हालांकि, इस उदाहरण में आसान बनाने के लिए, हम ट्रेनिंग और टेस्टिंग की प्रोसेस को जारी रखते हैं.

मॉडल हाइपर पैरामीटर में सुधार करना

यह मॉडल एक डिसिज़न ट्री है, जिसे डिफ़ॉल्ट हाइपर पैरामीटर वैल्यू के साथ ट्रेनिंग दी गई थी. बेहतर सुझाव पाने के लिए, ये काम किए जा सकते हैं:

  1. ज़्यादा बेहतर लर्नर, जैसे कि रैंडम फ़ॉरेस्ट या ग्रेडिएंट बूस्टेड ट्री मॉडल का इस्तेमाल करें. इन लर्निंग एल्गोरिदम के बारे में अगले पेज में बताया गया है.

  2. आपकी बातों और सुझावों की मदद से, हाइपर पैरामीटर को ऑप्टिमाइज़ किया जा सकता है. मॉडल को बेहतर बनाने की गाइड काम की हो सकती है.

  3. बड़ी संख्या में संभावित हाइपर पैरामीटर को अपने-आप टेस्ट करने के लिए, हाइपर पैरामीटर ट्यूनिंग का इस्तेमाल करें.

हमने अब तक रैंडम फ़ॉरेस्ट और ग्रेडिएंट बूस्टेड ट्री एल्गोरिदम नहीं देखा है और ऑटोमैटिक हाइपर पैरामीटर ट्यूनिंग के लिए उदाहरणों की संख्या बहुत कम है, इसलिए आपको मैन्युअल तौर पर मॉडल को बेहतर बनाना होगा.

ऊपर दिखाया गया डिसिज़न ट्री छोटा है और 61 उदाहरण वाली पत्ती में अडेली और चिनस्ट्रैप लेबल का मिक्स शामिल है. एल्गोरिदम ने इस लीफ़ को इसके अलावा क्यों नहीं बांटा? इसके दो संभावित कारण हैं:

  • हर लीफ़ के लिए, सैंपल की कम से कम संख्या (डिफ़ॉल्ट रूप से min_examples=5) हो सकती है.
  • शायद पेड़ को कई हिस्सों में बांट दिया गया हो, ताकि ज़्यादा फ़िट होने से रोका जा सके.

उदाहरणों की कम से कम संख्या को घटाकर 1 करें और नतीजे देखें:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

डिसिज़न ट्री को min_examples=1
के साथ ट्रेन किया गया.

इमेज 18. डिसिज़न ट्री को min_examples=1 के साथ ट्रेन किया गया.

 

जिस लीफ़ नोड में 61 उदाहरण हैं उसे कई बार बांटा गया है.

यह देखने के लिए कि नोड को और भाग देने से फ़ायदा होता है या नहीं, हम टेस्ट डेटासेट पर इस नए मॉडल की क्वालिटी का आकलन करते हैं:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

जांच के बाद मॉडल की क्वालिटी बढ़ गई है. अब यह 0.9167 से 0.97222 हो गई है. हाइपर पैरामीटर में किया गया यह बदलाव अच्छा रहेगा.

डिसिज़न फ़ॉरेस्ट का पिछला हिस्सा

हाइपर पैरामीटर में लगातार सुधार करके, हम पूरी तरह सटीक हो सकते हैं. हालांकि, इस मैन्युअल प्रोसेस के बजाय, हम ज़्यादा ताकतवर मॉडल को ट्रेनिंग दे सकते हैं, जैसे कि जंगल के बीच का कोई भी हिस्सा. साथ ही, यह भी देखा जा सकता है कि यह मॉडल बेहतर काम करता है या नहीं.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

जंगल के जंगल की सटीक जानकारी, हमारे सामान्य पेड़ से बेहतर है. इसकी वजह के बारे में, अगले पेजों में बताया गया है.

इस्तेमाल और सीमा

जैसा कि पहले बताया गया है, एक डिसिज़न ट्री में मशीन लर्निंग के आधुनिक तरीकों, जैसे कि रैंडम फ़ॉरेस्ट, ग्रेडिएंट बूस्टेड ट्री, और न्यूरल नेटवर्क की तुलना में अक्सर कम क्वालिटी होती है. हालांकि, इन मामलों में डिसिज़न ट्री अब भी काम का है:

  • ज़्यादा मुश्किल तरीकों का आकलन करने के लिए, एक आसान और सस्ती बेसलाइन के तौर पर.
  • जब मॉडल की क्वालिटी और समझ में आने के बीच कोई फ़र्क़ हो.
  • डिसिज़न फ़ॉरेस्ट मॉडल को समझने के लिए प्रॉक्सी के रूप में, जिसके बारे में इस कोर्स में आगे चर्चा की जाएगी.