การสร้างแผนผังการตัดสินใจ

ในหน่วยนี้ คุณจะใช้ YDF (Yggdrasil Decision Forest) ห้องสมุดจะฝึกและตีความแผนผังการตัดสินใจ

หน่วยนี้ได้รับแรงบันดาลใจจาก 🧭 การเริ่มต้นใช้งาน YDF Google Analytics

รอบคัดเลือก

ก่อนที่จะศึกษาชุดข้อมูล ให้ทำดังต่อไปนี้

  1. สร้าง Colab ใหม่ Notebook
  2. ติดตั้งไลบรารี YDF โดยวางและเรียกใช้โค้ดบรรทัดต่อไปนี้ ใน Colab Notebook ใหม่
    !pip install ydf -U
    
  3. นำเข้าไลบรารีต่อไปนี้
    import ydf
    import numpy as np
    import pandas as pd
    

ชุดข้อมูล Palmer Penguins

Colab นี้ใช้ ชุดข้อมูลขนาด Palmer Penguins ซึ่งมีการวัดขนาดทั้ง 3 รายการ สายพันธุ์เพนกวิน:

  • ชินสแตรป
  • เจนทู
  • Adelie

นี่คือปัญหาการจำแนกประเภท เป้าหมายคือการคาดการณ์ชนิดพันธุ์ของ เพนกวินตามข้อมูลในชุดข้อมูล Penguins ของ Palmer นี่คือเพนกวิน

เพนกวิน 3 ตัว
ชนิดนี้

รูปที่ 16 เพนกวิน 3 สายพันธุ์ที่ต่างกัน รูปภาพโดย @allisonhorst

 

โค้ดต่อไปนี้เรียก แพนด้า เพื่อโหลดชุดข้อมูล 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 รายการแรกในเพนกวินปาล์มเมอร์ ชุดข้อมูล:

ตาราง 3. 3 ตัวอย่างแรกใน Palmer Penguins

ชนิดพันธุ์ เกาะ bill_length_mm bill_depth_mm flipper_length_mm body_mass_g เพศ ปี
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 ชาย 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 เป็นเพศหญิง 2007
2 Adelie 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 (การแยกประเภทและ อัลกอริทึมการเรียนรู้ (หรือที่เรียกว่า 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

สายพันธุ์ ความเป็นไปได้
Adelie (แดง) 8%
Gentoo (สีน้ำเงิน) 58%
ชินสแตรป (สีเขียว) 36%

 

ตาราง 5. ความเป็นไปได้ของสปีชีส์ต่างๆ หาก bill_depth_mm < 42.3

สายพันธุ์ ความเป็นไปได้
Adelie (แดง) 97%
Gentoo (สีน้ำเงิน) 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 รายการประกอบด้วย ของ Adelie และ Chinstrap ทำไมอัลกอริทึมไม่แบ่งส่วน Leaf นี้ เพิ่มเติม มีสาเหตุที่เป็นไปได้สองข้อ:

  • จำนวนตัวอย่างขั้นต่ำต่อใบ (โดยค่าเริ่มต้น 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

ความถูกต้องแม่นยำของป่าแบบสุ่มดีกว่าต้นไม้ทั่วไปของเรา คุณจะ ดูสาเหตุในหน้าถัดไป

การใช้งานและข้อจำกัด

ดังที่กล่าวไว้ก่อนหน้านี้ แผนผังการตัดสินใจเดี่ยวๆ มักมีคุณภาพต่ำกว่าภาพสมัยใหม่ วิธีการแมชชีนเลิร์นนิง เช่น ป่าแบบสุ่ม ต้นไม้ที่เพิ่มระดับแบบไล่ระดับสี และระบบประสาทเทียม เครือข่าย อย่างไรก็ตาม ต้นไม้การตัดสินใจยังคงมีประโยชน์ในกรณีต่อไปนี้

  • เพื่อเป็นเกณฑ์พื้นฐานที่เรียบง่ายและราคาไม่แพงในการประเมินวิธีการที่ซับซ้อนมากขึ้น
  • เมื่อต้องเลือกระหว่างคุณภาพของโมเดลกับความสามารถในการตีความ
  • เป็นตัวแทนในการตีความโมเดลของป่าการตัดสินใจ ซึ่ง หลักสูตรนี้จะสำรวจในภายหลัง