ในหน่วยนี้ คุณจะใช้ YDF (Yggdrasil Decision Forest) ห้องสมุดจะฝึกและตีความแผนผังการตัดสินใจ
หน่วยนี้ได้รับแรงบันดาลใจจาก 🧭 การเริ่มต้นใช้งาน YDF Google Analytics
รอบคัดเลือก
ก่อนที่จะศึกษาชุดข้อมูล ให้ทำดังต่อไปนี้
- สร้าง Colab ใหม่ Notebook
- ติดตั้งไลบรารี YDF โดยวางและเรียกใช้โค้ดบรรทัดต่อไปนี้
ใน Colab Notebook ใหม่
!pip install ydf -U
- นำเข้าไลบรารีต่อไปนี้
import ydf import numpy as np import pandas as pd
ชุดข้อมูล Palmer Penguins
Colab นี้ใช้ ชุดข้อมูลขนาด Palmer Penguins ซึ่งมีการวัดขนาดทั้ง 3 รายการ สายพันธุ์เพนกวิน:
- ชินสแตรป
- เจนทู
- Adelie
นี่คือปัญหาการจำแนกประเภท เป้าหมายคือการคาดการณ์ชนิดพันธุ์ของ เพนกวินตามข้อมูลในชุดข้อมูล Penguins ของ Palmer นี่คือเพนกวิน
รูปที่ 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 ตัวอย่าง) ดังนั้น การประเมินความแม่นยำจึงไม่ชัดเจน
ในทางปฏิบัติ สำหรับชุดข้อมูลขนาดเล็ก การตรวจสอบข้ามแพลตฟอร์ม น่าจะดีกว่าเนื่องจากสามารถคำนวณค่าเมตริกการประเมินได้แม่นยำกว่า แต่ในตัวอย่างนี้ เราจะยังคงจัดการฝึกอบรมและ เพื่อประโยชน์ของ ความเรียบง่าย
การปรับปรุงไฮเปอร์พารามิเตอร์ของโมเดล
โมเดลเป็นแผนผังการตัดสินใจเดี่ยวที่ได้รับการฝึกด้วยไฮเปอร์พารามิเตอร์เริ่มต้น หากต้องการรับการคาดการณ์ที่ดีขึ้น คุณสามารถทำดังนี้
ใช้ผู้เรียนที่มีประสิทธิภาพมากขึ้น เช่น ป่าจำลอง หรือต้นไม้ที่เพิ่มสีแบบไล่ระดับสี โมเดล เราจะอธิบายอัลกอริทึมการเรียนรู้เหล่านั้นในหน้าถัดไป
เพิ่มประสิทธิภาพไฮเปอร์พารามิเตอร์โดยใช้การสังเกตการณ์และการตั้งต้นของคุณ คู่มือการปรับปรุงโมเดล อาจมีประโยชน์
ใช้การปรับแต่งไฮเปอร์พารามิเตอร์ เพื่อทดสอบไฮเปอร์พารามิเตอร์ที่เป็นไปได้จำนวนมากโดยอัตโนมัติ
เนื่องจากเรายังไม่เคยเห็นป่าไม้ที่สุ่มและต้นไม้ที่ไล่ระดับสี และเนื่องจากจำนวนตัวอย่าง มีจำนวนน้อยเกินกว่าที่จะสร้าง การปรับแต่งไฮเปอร์พารามิเตอร์ คุณจะปรับปรุงโมเดลด้วยตนเอง
แผนผังการตัดสินใจซึ่งแสดงอยู่ด้านบนมีขนาดเล็ก และใบไม้ที่มีตัวอย่าง 61 รายการประกอบด้วย ของ Adelie และ Chinstrap ทำไมอัลกอริทึมไม่แบ่งส่วน Leaf นี้ เพิ่มเติม มีสาเหตุที่เป็นไปได้สองข้อ:
- จำนวนตัวอย่างขั้นต่ำต่อใบ (โดยค่าเริ่มต้น
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(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111
ความถูกต้องแม่นยำของป่าแบบสุ่มดีกว่าต้นไม้ทั่วไปของเรา คุณจะ ดูสาเหตุในหน้าถัดไป
การใช้งานและข้อจำกัด
ดังที่กล่าวไว้ก่อนหน้านี้ แผนผังการตัดสินใจเดี่ยวๆ มักมีคุณภาพต่ำกว่าภาพสมัยใหม่ วิธีการแมชชีนเลิร์นนิง เช่น ป่าแบบสุ่ม ต้นไม้ที่เพิ่มระดับแบบไล่ระดับสี และระบบประสาทเทียม เครือข่าย อย่างไรก็ตาม ต้นไม้การตัดสินใจยังคงมีประโยชน์ในกรณีต่อไปนี้
- เพื่อเป็นเกณฑ์พื้นฐานที่เรียบง่ายและราคาไม่แพงในการประเมินวิธีการที่ซับซ้อนมากขึ้น
- เมื่อต้องเลือกระหว่างคุณภาพของโมเดลกับความสามารถในการตีความ
- เป็นตัวแทนในการตีความโมเดลของป่าการตัดสินใจ ซึ่ง หลักสูตรนี้จะสำรวจในภายหลัง