ایجاد درخت تصمیم

در این واحد، از قطار کتابخانه YDF (Yggdrasil Decision Forest) استفاده می‌کنید و درخت تصمیم را تفسیر می‌کنید.

این واحد از آموزش شروع 🧭 YDF الهام گرفته شده است.

مقدماتی

قبل از مطالعه مجموعه داده، موارد زیر را انجام دهید:

  1. یک نوت بوک Colab جدید ایجاد کنید.
  2. کتابخانه YDF را با قرار دادن و اجرای خط کد زیر در نوت بوک Colab جدید خود نصب کنید:
    !pip install ydf -U
    
  3. کتابخانه های زیر را وارد کنید:
    import ydf
    import numpy as np
    import pandas as pd
    

مجموعه داده پنگوئن های پالمر

این Colab از مجموعه داده Palmer Penguins استفاده می کند که شامل اندازه گیری اندازه برای سه گونه پنگوئن است:

  • بند سینه
  • جنتو
  • آدلی

این یک مشکل طبقه بندی است - هدف پیش بینی گونه پنگوئن بر اساس داده های مجموعه داده پنگوئن های پالمر است. در اینجا پنگوئن ها هستند:

Three different penguin
species.

شکل 16. سه گونه مختلف پنگوئن. تصویر توسط @allisonhorst

کد زیر یک تابع pandas را برای بارگذاری مجموعه داده Palmer Penguins در حافظه فراخوانی می کند:

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 نمونه اول مجموعه داده Palmer Penguins را قالب بندی می کند:

جدول 3. 3 مثال اول در پنگوئن های پالمر

گونه ها جزیره طول_صورتحساب_میلی متر bill_depth_mm باله_طول_میلی متر جرم_بدن_گرم ارتباط جنسی سال
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

گونه ها احتمال
آدلی (قرمز) 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 و Gentoos+Adelie را جدا کند.

کد زیر آموزش و دقت تست مدل را ارائه می دهد:

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

دقت جنگل تصادفی بهتر از درخت ساده ماست. در صفحات بعدی دلیل آن را خواهید آموخت.

استفاده و محدودیت

همانطور که قبلاً ذکر شد، یک درخت تصمیم واحد اغلب کیفیت پایین‌تری نسبت به روش‌های یادگیری ماشین مدرن مانند جنگل‌های تصادفی، درخت‌های تقویت‌شده گرادیان و شبکه‌های عصبی دارد. با این حال، درختان تصمیم هنوز در موارد زیر مفید هستند:

  • به عنوان یک پایه ساده و ارزان برای ارزیابی رویکردهای پیچیده تر.
  • زمانی که بین کیفیت مدل و تفسیرپذیری تعادل وجود دارد.
  • به عنوان نماینده ای برای تفسیر مدل جنگل های تصمیم گیری، که دوره بعداً آن را بررسی خواهد کرد.