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

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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น