একটি সিদ্ধান্ত গাছ তৈরি করা

এই ইউনিটে, আপনি YDF (Yggdrasil ডিসিশন ফরেস্ট) লাইব্রেরি ট্রেন ব্যবহার করবেন এবং একটি সিদ্ধান্ত গাছের ব্যাখ্যা করবেন।

এই ইউনিটটি 🧭 YDF Getting Start টিউটোরিয়াল থেকে অনুপ্রাণিত।

প্রাথমিক

ডেটাসেট অধ্যয়ন করার আগে, নিম্নলিখিতগুলি করুন:

  1. একটি নতুন Colab নোটবুক তৈরি করুন।
  2. আপনার নতুন Colab নোটবুকে নিম্নলিখিত লাইন কোড রেখে YDF লাইব্রেরি ইনস্টল করুন:
    !pip install ydf -U
    
  3. নিম্নলিখিত লাইব্রেরিগুলি আমদানি করুন:
    import ydf
    import numpy as np
    import pandas as pd
    

পামার পেঙ্গুইন ডেটাসেট

এই Colab পামার পেঙ্গুইন ডেটাসেট ব্যবহার করে, যেটিতে তিনটি পেঙ্গুইন প্রজাতির আকার পরিমাপ রয়েছে:

  • চিনস্ট্র্যাপ
  • জেন্টু
  • অ্যাডেলি

এটি একটি শ্রেণিবিন্যাস সমস্যা—লক্ষ্য হল পালমারের পেঙ্গুইন ডেটাসেটের ডেটার উপর ভিত্তি করে পেঙ্গুইনের প্রজাতির ভবিষ্যদ্বাণী করা। এখানে পেঙ্গুইন আছে:

Three different penguin
species.

চিত্র 16. তিনটি ভিন্ন পেঙ্গুইন প্রজাতি। @অ্যালিসনহর্স্টের ছবি

নিম্নলিখিত কোডটি মেমরিতে পামার পেঙ্গুইন ডেটাসেট লোড করার জন্য একটি পান্ডাস ফাংশনকে কল করে:

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টি উদাহরণ ফর্ম্যাট করে:

সারণী 3. পামার পেঙ্গুইনের প্রথম 3টি উদাহরণ

প্রজাতি দ্বীপ বিল_দৈর্ঘ্য_মিমি বিল_গভীরতা_মিমি ফ্লিপার_দৈর্ঘ্য_মিমি বডি_মাস_জি যৌনতা বছর
0 অ্যাডেলি টর্গার্সেন 39.1 18.7 181.0 3750.0 পুরুষ 2007
1 অ্যাডেলি টর্গার্সেন 39.5 17.4 186.0 3800.0 মহিলা 2007
2 অ্যাডেলি টর্গার্সেন 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 (শ্রেণীবিভাগ এবং রিগ্রেশন ট্রিস) লার্নিং অ্যালগরিদম (ওরফে লার্নার) দিয়ে আপনার প্রথম সিদ্ধান্ত ট্রিকে প্রশিক্ষণ দিতে পারেন। কারণ ydf.CartLearner লার্নার ভাল ডিফল্ট হাইপারপ্যারামিটার মান প্রদান করে। এই ধরনের মডেল কীভাবে কাজ করে সে সম্পর্কে আপনি পরে কোর্সে আরও শিখবেন।

model = ydf.CartLearner(label=label).train(train_dataset)

পূর্ববর্তী কল ইনপুট বৈশিষ্ট্য হিসাবে ব্যবহার করার জন্য কলাম নির্দিষ্ট করেনি। অতএব, প্রশিক্ষণ সেটের প্রতিটি কলাম ব্যবহার করা হয়। কলটি ইনপুট বৈশিষ্ট্যগুলির শব্দার্থবিদ্যা (উদাহরণস্বরূপ, সংখ্যাসূচক, শ্রেণীবদ্ধ, পাঠ্য) নির্দিষ্ট করেনি। অতএব, বৈশিষ্ট্য শব্দার্থবিদ্যা স্বয়ংক্রিয়ভাবে অনুমান করা হয়.

ফলাফলের সিদ্ধান্ত ট্রি প্রদর্শন করতে model.plot_tree() এ কল করুন:

model.plot_tree()

Colab-এ, আপনি প্রতিটি নোডে ক্লাস ডিস্ট্রিবিউশনের মতো নির্দিষ্ট উপাদানের বিবরণ দেখাতে মাউস ব্যবহার করতে পারেন।

A decision tree trained with default
hyperparameters.

চিত্র 17. ডিফল্ট হাইপারপ্যারামিটার সহ প্রশিক্ষিত একটি সিদ্ধান্ত গাছ।

Colab দেখায় যে রুট কন্ডিশনে 243টি উদাহরণ রয়েছে। যাইহোক, আপনি মনে রাখতে পারেন যে প্রশিক্ষণ ডেটাসেটে 272টি উদাহরণ রয়েছে। বাকি 29টি উদাহরণ স্বয়ংক্রিয়ভাবে বৈধকরণ এবং গাছ ছাঁটাইয়ের জন্য সংরক্ষিত করা হয়েছে।

প্রথম শর্তটি bill_depth_mm এর মান পরীক্ষা করে। সারণী 4 এবং 5 প্রথম অবস্থার ফলাফলের উপর নির্ভর করে বিভিন্ন প্রজাতির সম্ভাবনা দেখায়।

সারণি 4. bill_depth_mm ≥ 42.3 হলে বিভিন্ন প্রজাতির সম্ভাবনা

প্রজাতি সম্ভাবনা
অ্যাডেলি (লাল) ৮%
জেন্টু (নীল) 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 জেন্টু এবং জেন্টুস+অ্যাডিলি থেকে প্রায় পুরোপুরি আলাদা করতে পারে কিনা।

নিম্নলিখিত কোড মডেলের প্রশিক্ষণ এবং পরীক্ষার নির্ভুলতা প্রদান করে:

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()

A decision tree trained with
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

এলোমেলো বনের নির্ভুলতা আমাদের সরল গাছের চেয়ে ভাল। কেন তা আপনি পরবর্তী পৃষ্ঠাগুলিতে শিখবেন।

ব্যবহার এবং সীমাবদ্ধতা

যেমন আগে উল্লেখ করা হয়েছে, একটি একক সিদ্ধান্ত গাছের মানের আধুনিক মেশিন লার্নিং পদ্ধতি যেমন র্যান্ডম ফরেস্ট, গ্রেডিয়েন্ট বুস্টেড ট্রি এবং নিউরাল নেটওয়ার্কের চেয়ে কম থাকে। যাইহোক, সিদ্ধান্ত গাছ এখনও নিম্নলিখিত ক্ষেত্রে দরকারী:

  • আরও জটিল পদ্ধতির মূল্যায়ন করার জন্য একটি সহজ এবং সস্তা বেসলাইন হিসাবে।
  • যখন মডেলের গুণমান এবং ব্যাখ্যাযোগ্যতার মধ্যে একটি ট্রেডঅফ থাকে।
  • সিদ্ধান্ত বন মডেলের ব্যাখ্যার জন্য একটি প্রক্সি হিসাবে, যা কোর্সটি পরে অন্বেষণ করবে।