K Nearest Neighbor เบื้องต้น

หมายเหตุ ผู้อ่านสามารถดู table of contents ของ machine learning ได้ที่ https://goo.gl/BExvUQ

ในบทความนี้เราจะมาทำความรู้จักกับ classification algorithm อีก 1 ตัวนั้นคือ k nearest neighbor แต่โดยส่วนตัวผมอยากเรียกมันว่า “algorithm เพื่อนมากลากไป” ซึ่งเดียวผมจะอธิบายว่าทำไมถึงเรียกมันเป็นเช่นนั้น

จากรูปด้านล่างเรามีข้อมูลอยู่ด้วยกัน 2 ประเภทนั้นคือข้อมูลรูปสามเหลี่ยมและข้อมูลรูปสี่เหลี่ยม โดย 1 จุดแทนข้อมูล 1 ตัว ส่วนวงกลมสีเขียวนั้นคือข้อมูลที่เราจะทำการ predict ว่าวงกลมนั้นควรจะเป็นข้อมูลในกลุ่มสี่เหลี่ยมหรือสามเหลี่ยมโดยใช้หลักการของ knn (k nearest neighbor) ซึ่งอันดับแรกสิ่งที่เราต้องทำคือกำหนดตัวเลขให้กับ k เช่นจากรูปเราทำการเลือก k เท่ากับ 3 จากนั้นโดยหลักการของ knn มันจะทำการวิ่งหาจุดข้อมูลที่ใกล้ตัวมันมากที่สุดจำนวน 3 จุดข้อมูล ซึ่งจากรูปข้อมูลที่อยู่ในเส้นวงกลมทึบนั้นคือข้อมูล 3 ตัวที่เราคัดมาแล้วว่าใกล้วงกลมเขียวมากที่สุด จากนั้นสิ่งที่ knn จะทำต่อก็คือหาว่าในกลุ่มข้อมูลที่จับมา 3 ตัวมีข้อมูลประเภทไหนเยอะที่สุด ซึ่งในที่นี้จะเห็นได้ว่า ข้อมูล 3 ตัวนั้นแบ่งได้เป็นสามเหลี่ยม 2 ตัวและสี่เหลี่ยม 1 ตัว เท่ากับว่าข้อมูลสามเหลี่ยมมีจำนวนเยอะกว่า จากนั้น knn จะเปลี่ยนวงกลมสีเขียวให้เป็นข้อมูลประเภทสามเหลี่ยม จ บ จบ! หรือถ้าเราจะเปลี่ยนตัว k ให้เท่ากับ 5 ก็จะแสดงออกมาได้ตามข้อมูลที่อยู่ในเส้นวงกลมเส้นปะ ซึ่งครั้งนี้มีสามเหลี่ยมอยู่แค่ 2 ตัวแต่มีข้อมูลประเภทสี่เหลี่ยมถึง 3 ตัวนั้นเท่ากับว่าในรอบนี้ knn จะกำหนดให้ข้อมูลวงกลมสีเขียวของเรากลายเป็นข้อมูลสี่เหลี่ยมแทน และเนี้ยละครับการทำการเบื้องต้นของ knn หรือ algorithm เพื่อนมากลากไป

อ้างอิง https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm

ทีนี้เราลองมาดูการ code knn กันดูนะครับ อันดับแรกเรามาทำความรู้จักกับ dataset ที่เราจะใช้ในบทความนี้กันก่อนนะครับ โดย dataset ที่ผมเลือกคือ Iris Dataset ซึ่งเป็น dataset พันธุ์กล้วยไม้ที่ประกอบไปด้วยข้อมูลของ sepal_length, sepal_width, petal_length, petal_width และ species โดย species ที่มีอยู่ใน dataset นี้มีอยู่ด้วยกัน 3 ประเภทนั้นคือ Iris-setosa, Iris-versicolor และ Iris-virginica

อันดับแรกเราจะทำการ import library ที่จำเป็นต่อการทดสอบนี้

import library

จากนั้นเราก็ทำการ load dataset ซึ่ง Iris dataset นั้นได้ถูก pack มาใน library ที่ชื่อว่า seaborn ซึ่ง library สำหรับ visualization

load dataset จาก seaborn

ทีนี้ก่อนจะไปเข้าสู่การขบวนการ knn เรามาลองทำการแสดงข้อมูลในรูปแบบกราฟกันนะครับ

compare features ใน dataset

จากรูปเป็นการแสดงการจับคู่ของ 2 features จาก 4 features เพื่อแสดงกราฟโดยใช้ species เป็นตัวแยกสีของประเภทพันธุ์กล้วยไม้ จะเห็นได้ว่ามีหลายคู่ features ที่สามารถออกมาแล้วทำให้การแสดง species ดูง่าย ในการประมวลผล knn เราสามารถใส่ทั้ง 4 features เข้าไปในสูตรได้ แต่เพื่อความง่ายของตัวอย่างในบทความนี้เราจะเลือกแค่ 2 features เท่านั้นคือ petal_length และ petal_width

กราฟแสดงผล features petal_length และ petal_width

ทีนี้เราก็จะทำการ train knn ด้วย dataset ที่เรามีโดยใช้ petal_length และ petal_width เป็นตัวแยกประเภทของพันธุ์กล้วยไม้ แต่จากที่เราเห็นในบทความก่อนหน้าแล้วว่าก่อนการประมวลผล ML เราต้องเปลี่ยนข้อมูล text ให้เป็นตัวเลขสะก่อน ซึ่งจากตัวอย่างเราต้องแปลงข้อมูล species เห็นเป็นตัวเลขโดย แทน setosa ด้วย 0, แทน versicolor ด้วย 1 และแทน virginica ด้วย 2

แปลง species เป็นตัวเลข

จากนั้นเราจะทำการทดสอบแนวคิดเรื่อง knn ด้วยการใส่ข้อมูลที่กำหนดเองจำนวน 2 ตัวเข้าสู่ dataset เพื่อใช้ knn ทำนายว่าข้อมูลเป็นกล้วยไม้เป็น species ใด

ใส่ข้อมูลกำหนดเองคือ custom1 และ custom2 เพื่อให้ knn กำหนด species

ขั้นตอนการ train knn จะเริ่มจากแทนค่า X หรือ Input ด้วย features petal_length และ petal_width และแทน y หรือ output ด้วยข้อมูล species จากนั้นกำหนดให้ k ใน k nearest neighbor เท่ากับ 3 นั้นหมายความว่า knn จะทำให้ใช้ข้อมูลจำนวน 3 ตัวเพื่อมาทำนายข้อมูลที่เราจะทำการใส่เข้าไป

train knn

มาถึงขั้นตอนการทำนายผลของ custom data ของเราแล้วนะครับ โดยเราจะเริ่มจากการทำนาย custom1 ซึ่งถ้าดูด้วยตาเปล่าจะเห็นได้ว่าวงกลม 3 วงที่ใกล้ custom 1 ประกอบไปด้วย species2 จำนวน 2 ตัวและ species1 จำนวน 1 ตัว และถ้าเป็นไปตามหลักการของ knn นั้น custom1 ก็ควรจะถูกทำนายว่าเป็น species2 หรือ virginica ทีนี้มาลองทดสอบการประมวลผลกันดูนะครับ

การ predict ข้อมูล custom1

ในข้อมูล custom1 เราใส่ข้อมูล petal_length เป็น 5.1 และ petal_width เป็น 1.75 ซึ่งจากข้อมูลดังกล่าว knn ทำนายว่าข้อมูลนี้เป็นของ species2 หรือ virginica นั้นเอง ต่อไปมาดูการทดสอบข้อมูล custom2 กันดูนะครับ

การ predict ข้อมูล custom2

ในข้อมูล custom2 เราใส่ข้อมูล petal_length เป็น 5.0 และ petal_width เป็น 1.4 ซึ่งจากข้อมูลดังกล่าว knn ทำนายว่าข้อมูลนี้เป็นของ species1 หรือ versicolor

หลักการ knn ในเบื้องต้นก็มีอยู่ประมาณนี้ครับ หากท่านใดมีข้อสงสัยหรือคำชี้แนะใดๆสามารถฝากข้อความได้ที่ https://www.facebook.com/coeffest/ นะครับ ขอบคุณมากครับที่ติดตาม