วันพฤหัสบดีที่ 26 เมษายน พ.ศ. 2561

3) ฟีทเจอร์ หรือคุณสมบัติที่ดีเพื่อการเรียนรู้ของคอมพิวเตอร์ What Makes a Good Feature? การเรียนรู้ของคอมพิวเตอร์ แมชชีนเลิร์นนิ่ง ตอนที่ 3

ฟีทเจอร์ หรือคุณสมบัติที่ดีเพื่อการเรียนรู้ของคอมพิวเตอร์
การเรียนรู้ของคอมพิวเตอร์ แมชชีนเลิร์นนิ่ง ตอนที่ 3

https://youtu.be/N9fDIAflCMY


การสร้างฟีทเจอร์หรือคุณสมบัติ ที่ดี  ทำอย่างไร


จากบทเรียนที่ผ่านมา เราได้ทราบแล้วว่าความสามารถในการแยกแยะหรือคลาสสิฟายเออร์ (Classifier) นั้นจะมีความถูกต้องแม่นยำได้มากน้อยเพียงไรขึ้นอยู่กับการเลือกใช้ฟีทเจอร์หรือคุณสมบัติของข้อมูลที่นำมาสอนให้คอมพิวเตอร์ได้เรียนรู้ ได้ดีเพียงไร
ดังนั้นสำหรับนักพัฒนาแมชชีนเลิร์นนิ่งแล้วการเลือกฟีทเจอร์ที่ดีและเหมาะสมจึงเป็นเรื่องสำคัญ ดังนั้นการกำหนดและวิธีการคัดเลือกฟีทเจอร์ที่ดีทำอย่างไร
หากคุณต้องทำการแยกแยะแบบไบนารี่ (Binary Classification)  แน่นอนการกำหนดฟีทเจอร์หรือคุณสมบัติที่ดี ก็จะช่วยให้การตัดสินใจในการแยกแยะระหว่างสิ่งสองสิ่งทำได้ง่ายขึ้นด้วย




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


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


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


ต่อไปเราจะลองมาเขียนโค้ดโปรแกรมภาษาไพธอน


เริ่มต้นกำหนดขนาดของประชากรสุนัขที่ใช้ในการทดลองครั้งนี้ทั้งสิ้้น 1,000 รายการ โดยแบ่งเป็น เกรย์ฮาวด์ จำนวน 500 รายการ (greyhounds = 500) และลาบราดอร์ 500 รายการ (labs = 500)
และกำหนดความสูงให้สุนัขแต่ละรายการ (ตัว)
โดยกำหนดให้ความสูงโดยเฉลี่ยของเกรย์ฮาวด์ เป็น 28 และมีค่าเบี่ยงเบน เป็น 4 นิ้ว (28 + 4 * np.random() ) หมายถึงสุนัขสายพันธ์นี้มีค่าฉลี่ยส่วนสูงที่ 28 นิ้ว บวก ลบ 4 และเช่นเดียวกันในสุนัขสายพันธ์ลาบราดอร์ที่มีค่าเฉลี่ยส่วนสูง เป็น 24 นิ้ว บวกลบ 4 (24 + 4 * np.random())
ข้อมูลทั้งสองตัวเกิดเป็นข้อมูลจำนวนสองอะเรย์
จากนั้นแสดงผลให้เห็นด้วยกราฟแท่ง (Histogram) ด้วยคำสั่งต่อไปนี้
จากโค้ดโปรแกรม เรากำหนดให้เกรย์ฮาวด์เป็นกราฟแท่งสีแดง และลาบราดอร์เป็นแท่งสีน้ำเงิน จากนั้นเราลองรันสคริปที่เขียนขึ้น ซึ่งจะได้ผลดังนี้
จากกราฟแท่งหากเราลองพิจารณาแนวแกนนอนคือความสูง (0 - 50) ส่วนแกนตั้งคือจำนวน (0 - 250) จะพบว่า ตั้งแต่ความสูง 15 นิ้ว ไปจนถึง 35 นิ้ว นั้น แท่งสีน้ำเงินมีจำนวนมากกว่า หมายความว่า จำนวนของสุนัขลาบราดอร์ ในแต่ละช่วงความสูง ตั้งแต่ 15 ถึง 35 นิ้วนั้น โดยเฉลี่ยแล้วลาบราดอร์มีจำนวนมากกว่า ซึ่งผิดไปจากสมมติฐานที่เราตั้งไว้ ว่า เกรย์ฮาวด์ มีความสูงมากกว่าลาบราดอร์
(หมายเหตุ อาจเกิดจากในแต่ละช่วงวัย ลาบราดอร์เจริญเติบโตเร็วกว่า แต่เมื่อจนถึงความสูงที่ประมาณ 35 นิ้วแล้ว ลาบราดอร์หยุดเจริญเติบโต ในขณะที่ เกรย์ฮาวด์ยังคงเจริญเติบโตต่อไปทำให้มีความสูงมากกว่า)
จากตัวอย่างที่แสดงให้เห็นนี้ทำให้เห็นได้ว่า ความสูงเป็นฟีทเจอร์หรือคุณสมบัติที่เป็นประโยชน์ในการแยกแยะ แต่ไม่ดีเสมอไป นั่นจึงเป็นเหตุผลที่ว่า เพราะเหตุใด การทำแมชชีนเลิร์นนิ่งจึงจำเป็นต้องใช้ฟีทเจอร์หรือคุณสมบัติเพื่อการแยกแยะมากกว่าหนึ่งเสมอ
Features capture different types of information
นอกจากนี้ ให้เราเขียนเงื่อนไขคำสั่ง If statement แทนที่จะใช้การแยกแยะทั้งสองแบบ
เพื่อให้เห็นภาพว่า ฟีทเจอร์หรือคุณสมบัติประเภทใดที่เราควรเลือกใช้ ในการทำแมชชีนเลิร์นนิ่ง
เริ่มต้นด้วยการคิดเชิงทดลอง หากเราลองคิดดูว่าสุนัขนั้นเป็นสายพันธ์ุเกรย์ฮาวด์ หรือลาบราดอร์ เราจะต้องทราบคุณสมบัติอื่นๆ นอกเหนือจากที่ได้ยกตัวอย่างไปแล้วหรือไม่
เราอาจต้องทราบถึงความยาวของขนสุนัข แต่ละประเภท
หรืออาจต้องทราบว่าสุนัขแต่ละประเภทสามารถวิ่งได้เร็วเท่าใด รวมทั้งอาจต้องทราบว่าพวกมันมีน้ำหนักมากน้อยเพียงไร


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


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


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


ประการสุดท้ายที่เราต้องคำนึงถึงคือ ฟีทเจอร์หรือคุณสมบัติที่เลือกใช้นั้น ต้องสามารถเข้าใจได้ง่าย


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


ทบทวนเทคนิคในการเลือกใช้ฟีทเจอร์หรือคุณสมบัติของเซ็ตข้อมูลที่เป็นประโยชน์ ซึ่งเราได้เรียนรู้ไปในบทเรียนนี้
  • ต้องมีความหมายหรือเป็นประโยชน์ต่อการแยกแยะข้อมูล Informative
  • ต้องมีความเป็นอิสระ Independent
  • ต้องเป็นฟีทเจอร์เชิงเดียว Simple ไม่เป็นฟีทเจอร์ หรือคุณสมบัติเชิงซ้อน สามารถเข้าใจได้ง่าย


โดย ผศ. ณัฏฐ์ โอธนาทรัพย์
สาขาวิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเอเชียอาคเนย์
By Asst., Prof. Nuth OTANASAP
Department of Computer Engineering, Faculty of Engineering,
Southeast Asia University, Bangkok 10160 THA

2) การแยกแยะข้อมูลด้วยต้นไม้ตัดสินใจ Visualizing a Decision Tree การเรียนรู้ของคอมพิวเตอร์ แมชชีนเลิร์นนิ่ง ตอนที่ 2

การแยกแยะข้อมูลด้วยต้นไม้ตัดสินใจ

การเรียนรู้ของคอมพิวเตอร์ แมชชีนเลิร์นนิ่ง ตอนที่ 2



จากบทเรียนที่แล้วที่เราได้ใช้วิธีการแยกแยะด้วยต้นไม้การตัดสินใจ หรือ Decision tree ในบทเรียนนี้เราจะทำการแสดงผลหน้าตาของต้นไม้การตัดสินใจ ที่ได้จากการประมวลผลจากโปรแกรมของเรา เพื่อให้เราเข้าใจวิธีการตัดสินใจในการแยกแยะหรือคลาสสิฟายเออร์ ได้ดีขึ้น
ด้วยประเภทของวิธีการแยกแยะที่หลากหลาย ไม่ว่าจะเป็น
  • โครงข่ายประสาทเทียม Artificial neural network
  • ซัพพอร์ทเว็กเตอรแมชชีน Support Vector Machine
  • และวิธีการอื่นๆ อีกเป็นจำนวนมาก
ในตอนนี้มีคำถามว่า เพราะเหตุใดเราจึงเลือกใช้ ต้นไม้ตัดสินใจ เป็นวิธีการเริ่มแรกสำหรับการเรียนรู้เรื่องแมชชีนเลิร์นนิ่ง
เนื่องจากข้อมูลเหล่านั้น มีคุณสมบัติที่เฉพาะเจาะจงมาก ทำให้สามารถอ่านและเข้าใจได้ง่าย
แต่ในความเป็นจริงแล้วจะมี โมเดลหรือรูปแบบในการแยกแยะเพียงหนึ่งเดียวเท่านั้นที่สามารถตีความข้อมูลแต่ละลักษณะได้ จึงทำให้เราต้องมีความเข้าใจว่าจะสร้างวิธีการแยกแยะหรือคลาสสิฟายเออร์ ขึ้นมาได้อย่างไร ซึ่งแน่นอนการทดลองเป็นเครื่องมือในการเรียนรู้ที่ดี
ในบทเรียนนี้ เราจะใช้เซ็ตข้อมูล (Data set) ที่ินิยมนำมาใช้ทดลองกัน ก็คือ Iris flower data set ซึ่งนิยมนำมาใช้ในการทดลองการแก้ไขปัญหาด้วยแมชชีนเลิร์นนิ่ง ในเซ็ตข้อมูลนี้เราจะทดลองแยกแยะประเภทของดอกไม้ โดยพิจารณาจากวิธีการวัดขนาดส่วนต่างๆ ของดอกไม้ ไม่ว่าจะเป็นความกว้าง ความยาวของ กลีบดอก (Petal)








โดย เซ็ตข้อมูลนี้ประกอบด้วย ดอกไม้ที่มีประเภทแตกต่างกัน 3 ประเภท อยู่ในสปีชี่ ไอริส iris ประกอบด้วย เซ็ตโตซา (setosa) เวอร์ซีคัลเลอร์ (versicolor) และ เวอร์จินิก้า (verginica) หากเราเลื่อนข้อมูลลงไปเรื่อยๆ พบว่าดอกไม้แต่ละประเภทมี 50 ตัวอย่าง รวมตัวอย่างทั้งหมดของดอกไม้ทั้งสามประเภทมี 150 ตัวอย่าง โดยเซ็ตข้อมูลนี้ประกอบด้วยฟีทเจอร์หรือคุณสมบัติของข้อมูล 4 ฟีทเจอร์ ทำหน้าที่ระบุรายละเอียดของแต่ละตัวอย่าง ประกอบด้วย ความยาว (length) และความกว้าง (width) ของกลีบเลี้ยง (Sepal) และกลีบดอก (Petal) และเช่นเดียวกันกับปัญหาแอปเปิ้ลกับส้ม ในบทเรียนที่แล้ว คอลัมน์ทั้งสี่คอลัมน์แรก ก็คือฟีทเจอร์หรือคุณสมบัติของข้อมูล และคอลัมน์สุดท้าย คือ เลเบล ( labels) ซึ่งระบุประเภทของดอกไม้ในแต่ละรายการไว้ ซึ่งก็คือผลลัพท์ที่ต้องการนั่นเอง


Goals
  1. Import dataset นำเข้าเซ็ตข้อมูล
  2. Train a classifier สอนการแยกแยะ
  3. Predict label for a new flower ทำนายผลลัพท์ ว่าดอกไม้ที่ใช้ทดสอบเป็นประเภทอะไร
  4. Visualize the tree แสดงผลกราฟของต้นไม้ตัดสินใจ


เป้าหมายการทดลองในครั้งนี้เพื่อใช้เซ็ตข้อมูลสำหรับการสอนคอมพิวเตอร์ในการแยกแยะ
และทำนายผลว่าดอกไม้ที่ใช้ทดสอบซึ่งคอมพิวเตอร์ไม่เคยรู้จักมาก่อนนั้นเป็นดอกไม้ประเภทอะไร และสุดท้ายทำการแสดงผลกราฟของต้นไม้ตัดสินใจเพื่อให้เข้าใจถึงวิธีการตัดสินใจในการแยกแยะประเภทดอกไม้ที่คอมพิวเตอร์ได้เรียนรู้จากเซ็ตข้อมูล
ลำดับต่อไปเรามาทดลองการเขียนโค้ดโปรแกรมเพื่อให้เข้าใจมากยิ่งขึ้น
เริ่มต้นด้วยการนำเข้า เซ็ตข้อมูลไอริส ไว้ใน ไซคิทเลิร์น โดยเราสามารถดาวน์โหลดเซ็ตข้อมูลได้จาก http://scikit-learn.org/stable/datasets/index.html ที่หัวข้อที่ 5.2 Toy datasets
จากนั้นให้ทำการเพิ่มเซ็ตข้อมูลเข้าไว้ในโปรแกรม ดังนี้
หมายเหตุ สำหรับคำสั่ง print ในไพธอนเวอร์ชั่น 3.5 ขึ้นไป ให้ใช้ print()  ต้องมีวงเล็บ ตัวอย่างเช่น print( iris.features_names) และ print(iris.target_names)


จากนั้นทำการทดลองรันโปรแกรม สำหรับ metadata ที่ทำหน้าที่อธิบายหรือบอกถึงชื่อของฟิทเจอร์หรือคุณสมบัติของข้อมูลในตาราง รวมถึงชื่อของตอกไม้ประเภทต่างๆ นั้น เราสามารถดูได้จาก https://en.wikipedia.org/wiki/Iris_flower_data_set
และข้อแสดงผลตัวอย่างข้อมูลในเซ็ตข้อมูล (บรรทัดที่ 5)
ตัวอย่างเช่น หากเราต้องให้โปรแกรมพิมพ์แสดงผลของข้อมูลรายการแรก ในเซ็ตข้อมูล
เราก็จะเห็นผลลัพท์ที่ได้จากโปรแกรม ดังนี้
[5.1 3.5 1.4 0.2]
หมายถึง ข้อมูลรายการที่แรก [0] มีขนาดกลีบดอก sepal สูง length (cm) คือ 5.1 และกว้าง width (cm) คือ 3.5 โดยที่ฐานดอก petal สูง length (cm) คือ 1.4 และกว้าง width (cm) คือ 0.2 ตามลำดับ
และในบรรทัดที่ 6 ให้แสดงผลเลเบลของข้อมูลรายการแรก [0] ว่าข้อมูลรายการแรกนั้นเป็นประเภทดอกไม้แบบใด ดังผลลัพท์ต่อไปนี้
จากผลลัพท์ที่ได้ มีค่าเป็น 0 หมายถึง เป็นดอกไม้ประเภท “setosa” นั่นเอง


หากเราลองกลับไปดูรายละเอียดข้อมูลในตารางเซ็ตข้อมูล จะพบว่าข้อมูลรายการแรก มีข้อมูลดังที่โปรแกรมแสดงผล
จากนั้นให้เราทดลองเขียนโปรแกรมให้แสดงผลข้อมูลทั้งหมดในเซ็ตข้อมูลด้วยการวนรอบโปรแกรม ดังนี้
หมายเหตุ สามารถดาวน์โหลดตัวอย่างโค้ดโปรแกรมทั้งหมดได้จาก คลิก


เมื่อเราเขียนโค้ดโปรแกรมมาถึงขั้นตอนนี้หมายถึงเราสามารถทำให้บรรลุเป้าหมายที่กำหนดไว้ในตอนแรก คือการนำเข้าเซ็ตข้อมูลได้เรียบร้อยแล้ว สำหรับขั้นตอนต่อไปคือ การนำข้อมูลสอนให้ระบบเรียนรู้การแยกแยะ แต่ก่อนที่เราจะไปที่ขั้นตอนดังกล่าว เราต้องทำการแบ่งข้อมูลในเซ็ตข้อมูลทั้งหมดก่อน
เราจำเป็นต้องแยกข้อมูลตัวอย่างจำนวนหนึ่งออกจากเซ็ตข้อมูลเสียก่อน เพื่อนำกลับมาใช้ในการทดสอบความถูกต้องในการแยกแยะในภายหลัง ซึ่งต้องไม่ซ้ำกับข้อมูลที่ถูกนำไปใช้ในขั้นตอนการสอนการแยกแยะให้กับคอมพิวเตอร์ไปแล้ว ซึ่งเราเรียกข้อมูลชุดนี้ว่า ข้อมูลทดสอบ “testing data” ส่วนข้อมูลที่ใช้สอนนั้นเรียกว่า ข้อมูลสอน “training data” เมื่อเราทำการสอนการแยกแยะให้กับคอมพิวเตอร์ด้วยข้อมูลสอนแล้ว ก็จะทำการทดสอบการแยกแยะด้วยข้อมูลทดสอบ เพื่อวัดความถูกต้องแม่นยำในการแยกแยะที่คอมพิวเตอร์ไม่เคยรู้จักมาก่อนนั่นเอง ในขั้นตอนการทดสอบนั้นนับว่าเป็นขั้นตอนที่สำคัญมาก ซึ่งเป็นขั้นตอนที่ทำให้เราสามารถยืนยันได้ว่า รูปแบบการแยกแยะที่พัฒนาขึ้นนั้นสามารถใช้งานได้จริง ซึ่งจะได้อธิบายถึงต่อไป
ในการทดลองนี้ เราได้แบ่งข้อมูลเพื่อใช้ในการทดสอบออกมาเพียงตัวอย่างเดียว จากดอกไม้แต่ละประเภท และลำดับของข้อมูลในเซ็ตข้อมูลจะเริ่มจากดัชนีลำดับ 0 สำหรับรายการแรกของดอกไม้ประเภทที่ 1 และลำดับที่ 50 ของดอกไม้ประเภทที่ 2 และสุดท้ายคือลำดับที่ 100 ของดอกไม้ประเภทที่ 3
เราจะทำการคัดแยกรายการข้อมูลทั้งสามรายการออกจากเซ็ตข้อมูล ด้วยตัวแปรดังโค้ดโปรแกรมบรรทัดที่ 7 และ 8 เพื่อนำมาใช้ในการทดสอบภายหลัง
จากนั้นเราจะทำการสร้างตัวแปรขึ้นใหม่อีก สองตัวแปร เช่นกัน เพื่อนำรายการข้อมูลที่คัดแยกออกมานั้นไปใช้ในการทดสอบการทำนายต่อไป ดังโค้ดโปรแกรมบรรทัดที่ 11 และ 12
จากนั้นเราจะทำการสร้าง ตัวแปรเพื่อทำการแยกแยะแบบต้นไม้ตัดสินใจ
จากนั้นมาทำการทดสอบโปรแกรมโดยการแสดงผลการทดสอบ
ซึ่งได้ผลลัพท์ตามที่เราคาดหวังดังนี้
[0 1 2] หมายถึง ข้อมูลรายการแรกเป็นดอกไม้ประเภท 0 รายการที่ 50 เป็นดอกไม้ประเภท 1 และข้อมูลรายการที่ 100 เป็นดอกไม้ประเภท 2 นั่นเอง
หากเราลองพิจาณาผลลัพท์ที่ได้ จากโปรแกรมบรรทัดที่ 19 และ 20 แล้วได้ผลลัพท์ดังต่อไปนี้
ก็จะเห็นได้ว่า รายการข้อมูลที่เราต้องการทำนายนั้น ถูกต้องตรงกับผลลัพท์ที่ได้กำหนดไว้ในโปรแกรม ซึ่งเป็นสิ่งที่เราต้องการ อย่างไรก็ตามสิ่งที่เราต้องคำนึงเสมอ คือการทดสอบนี้ทำด้วยวิธีการง่ายๆ และจะได้อธิบายถึงเพื่อให้เข้าใจในรายละเอียดในลำดับต่อไป
เมื่อถึงขั้นตอนนี้ซึ่งเป็นขั้นตอนที่ 3 ก็คือการทดสอบการแยกแยะ ด้วยการทำนายเลเบลสำหรับดอกไม้ใหม่ที่เราไม่เคยรู้จักมาก่อน ในลำดับต่อไปเราจะมาทำการแสดงผลกราฟของต้นไม้ตัดสินใจ หรือ Visualize the tree เพื่อทำความเข้าใจการทำงานของวิธีการแยกแยะ ด้วยความรวดเร็ว ให้ทำการสำเนาโค้ดโปรแกรมจากไฟล์ที่กำหนดให้จากลิงค์ต่อไปนี้ Part02.py
จากนั้นให้ทำการสร้างกราฟของต้นไม้ตัดสินใจที่ได้เป็นขั้นตอนสุดท้ายจากกระบวนการนี้ โดยแสดงผลในรูปแบบไฟล์ pdf ดังโค้ดโปรแกรมบรรทัดที่ 33 - 34 ซึ่งจะได้ผลลัพท์เป็นไฟล์ pdf เมื่อทำการรันโปรแกรมจะได้ผลลัพท์ดังนี้


การใช้งานการแยกแยะข้อมูลด้วยกราฟหรือแผนภาพนี้ต้องทำการอ่านจากด้านบนลงล่าง ในแต่ละโหนด (node) จะทำหน้าที่ตอบคำถามแต่ละคำถามว่าใช่หรือไม่ ในแต่ละฟีทเจอร์หรือคุณสมบัติ ตัวอย่างเช่น ในโหนดแรกที่อยู่บนสุด มีคำถามว่า ความกว้างของกลีบดอก Petal มีค่าน้อยกว่าหรือเท่ากับ 0.8 cm หรือไม่ หากใช่ให้ไปทางซ้ายหมายถึงจากตัวอย่างทั้งหมด 49 ตัวอย่าง หากกลีบดอกมีค่าน้อยกว่าหรือเท่ากับ 0.8 cm นั้นจะเป็นดอกไม้ประเภท ‘setosa’ แต่หากไม่ใช้ให้ไปทางขวา ซึ่งต้องทำการพิจารณาเงื่อนไขต่อไป ซึ่งในโหนดระดับที่สองนี้จะพิจารณาว่า กลีบดอก Petal มีค่าน้อยกว่าหรือเท่ากับ 1.75 cm หรือไม่ จากตัวอย่างพบว่ามี 98 รายการที่ มีค่าน้อยกว่า 1.75 ซึ่งเป็นประเภท versicolor จำนวน 49 รายการ และเป็นประเภท virginica จำนวน 49 รายการเช่นเดียวกัน ดังนั้นจากกรณีนี้หมายความว่า กลีบดอกที่มีขนาดความกว้างน้อยกว่าหรือเท่ากับ 1.75 cm นั้น เป็นได้ทั้ง versicolor และ virginica ในจำนวนที่เท่าๆ กัน ซึงคอมพิวเตอร์ก็จะพิจารณาเช่นนี้ลงไปเป็นลำดับชั้น ที่ละชั้น จนถึงโหนดสุดท้ายหรือลีฟโหนด เป็นอันสิ้นสุด
ต่อไปจะเป็นการนำข้อมูลที่เราได้คัดแยกไว้ก่อนหน้านี้แล้วมาทำการทดสอบ ด้วยคำสั่งโปรแกรมต่อไปนี้
ซึ่งเป็นการนำรายการข้อมูลลำดับแรก [0] มาใช้ในการทดสอบ
เมื่อสั่งให้โปรแกรมทำงานแล้วจะได้ผลลัพท์ดังต่อไปนี้
[5.1  3.5 1.4  0.2] 0
โดยตัวเลข 0 ตัวสุดท้าย ทางขวา หมายถึงรายการข้อมูลที่ลำดับแรก [0] นั้น เป็นดอกไม่ประเภท setosa ซึ่งเป็นผลลัพท์ที่ถูกต้องนั่นเอง
ซึ่งเราสามารถดึงชื่อของฟีทเจอร์หรือคุณสมบัติ และชื่อของผลลัพท์ที่ได้มาดูดังโปรแกรมคำสั่งบรรทัดที่ 38 (หมายเหตุ หากเป็น Python 3.5 ขี้นไป คำสั่ง print ต้องตามด้วยวงเล็บ เช่น print(iris.feature_names) เป้นต้น) เมื่อสั่งให้โปรแกรมทำงานหรือรันโปรแกรมแล้ว ผลลัพท์ท่ี่ได้ดังนี้
หากเราลองเปลี่ยนข้อมูลที่ใช้ในการทดสอบ โดยแก้ไขในบรรทัดที่ 36
ในเครื่องหมาย [0] เป็น [1] เมื่อเราสั่งให้โปรแกรมทำงานผลลัพท์ที่ได้ก็จะเปลี่ยนแปลงไป
เมื่อเราพิจารณาค่าความกว้างและความยาวของ กลีบดอก Petal และ กลีบเลี้ยง Sepal การตัดสินใจตามลำดับชั้นของแต่ละโหนดก็จะเกิดขึ้น ซึ่งในชั้นล่างสุดคือ หากกลีบดอกที่มีความกว้างน้อยกว่า หรือเท่ากับ 1.65 cm พบว่ามีทั้งสิ้นจำนวน 46 ตัวอย่างเป็นประเภท versicolor แต่หากมากกว่า 1.65 cm พบ 1 ตัวอย่างเป็น virginica คอมพิวเตอร์ก็จะคืนค่าผลลัพท์ให้ตามกราฟการตัดสินใจของต้นไม้ตัดสินใจ นั่นเอง


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


โดย ผศ. ณัฏฐ์ โอธนาทรัพย์
สาขาวิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเอเชียอาคเนย์
By Asst., Prof. Nuth OTANASAP
Department of Computer Engineering, Faculty of Engineering,
Southeast Asia University, Bangkok 10160 THA