โพสต์นี้ได้รับการออกแบบเพื่อให้มีความเข้าใจพื้นฐานเกี่ยวกับตัวแยกประเภท k-Neighbors และนำไปใช้โดยใช้ python ไม่ได้มีเจตนาให้ครบถ้วนสมบูรณ์แต่อย่างใด

k-Nearest Neighbors (kNN) เป็นอัลกอริทึมที่ใช้จัดประเภทจุดข้อมูลที่ไม่ได้จัดประเภทตามระยะห่างจากจุดที่ทราบ แม้ว่าส่วนใหญ่จะใช้เป็นตัวแยกประเภท แต่ก็สามารถใช้เพื่อแก้ปัญหาการถดถอยได้เช่นกัน ตัวอย่างต่อไปนี้จะถูกใช้ในโพสต์นี้:

ในตัวอย่างพื้นฐานข้างต้น แบบจำลองของเรากำลังพยายามคาดเดาว่ายานพาหนะเป็น SUV หรือรถเก๋งโดยอาศัยปัจจัยเพียง 2 ประการ ประสิทธิภาพการใช้เชื้อเพลิง (ระบุว่าเป็น MPG) อยู่บนแกน x- และน้ำหนักของยานพาหนะอยู่บนแกน y- ดาวสีแดงแสดงถึงจุดข้อมูลที่ไม่รู้จัก ในขณะที่จุดสีม่วงคือรถซีดาน และจุดสีเหลืองคือรถ SUV

วิธีที่โมเดล k-Nearest Neighbours ตัดสินใจว่าจะจำแนกจุดที่ไม่ทราบได้อย่างไรคือการสร้างวงกลมโดยมีจุดเป็นจุดศูนย์กลาง ขนาดของวงกลมถูกกำหนดโดยการเลือกไฮเปอร์พารามิเตอร์ k การตั้งค่านี้ไม่ได้อ้างอิงถึงขนาดที่แท้จริงของวงกลม แต่หมายถึงจำนวนจุดที่อยู่ใกล้เคียงที่จะตกอยู่ภายในวงกลม

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

โปรดสังเกตในตัวอย่างด้านบน วงกลมเล็กๆ แทน k = 3 ภายในวงกลมนั้น มีจุดสีม่วง (รถเก๋ง) 2 จุด และจุดสีเหลือง (SUV) 1 ​​จุด โมเดลทำการโหวต และเนื่องจากมีจุดสีม่วงมากกว่า จุดที่ไม่รู้จักจึงถูกจัดประเภทเป็นรถเก๋ง

ในวงกลมขนาดใหญ่ โดยที่ k = 6มีจุดสีเหลือง 4 จุดและจุดสีม่วง 2 จุด ดังนั้น หากคุณตั้งค่าพารามิเตอร์ n_neighbors เป็น 6 ยานพาหนะที่ไม่รู้จักจะถูกจัดประเภทเป็น SUV

การใช้ kNN ในหลาม

kNN ปฏิบัติตามขั้นตอนการทำงานที่คล้ายคลึงกับโมเดลภายใต้การดูแลอื่นๆ และเป็นหนึ่งในโมเดลที่ใช้งานง่ายกว่า คุณเริ่มต้นด้วยการตั้งค่า X (คุณสมบัติ) และ y (เป้าหมาย) และทำ train_test_split():

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

ตอนนี้เราจะสร้างอินสแตนซ์ของโมเดล kNN ให้พอดีกับชุดทดสอบของเรา และให้คะแนนชุดฝึกและชุดทดสอบแยกกัน เราจะไม่เปลี่ยนไฮเปอร์พารามิเตอร์ใดๆ ในตอนนี้ ดังนั้น k_neighbors จะถูกตั้งค่าเป็นค่าเริ่มต้นที่ 5

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

โปรดทราบว่าเมื่อดูที่ Predict_proba() คุณจะสามารถบอกได้ว่ามีเพื่อนบ้านโดยรอบกี่รายที่ถูกจำแนกประเภท เนื่องจาก n_neighbors ถูกตั้งค่าเป็นค่าเริ่มต้นที่ 5 แต่ละ "โหวต" จึงมีค่าเท่ากับ 0.2 ในตัวอย่างข้างต้น แต่ละคะแนนที่ได้รับการโหวตเป็น [1. , 0. ] ได้รับการโหวต 5–0 การโหวตแต่ละครั้งของ [0.6, 0.4]คือคะแนนเสียง 3–2

kNN ใน GridSearchCV

ไฮเปอร์พารามิเตอร์ที่พบบ่อยที่สุดบางตัวคือ:
- n_neighbors, ซึ่งได้รับการ metioned ก่อนหน้านี้
- weights ซึ่งสามารถตั้งค่าเป็น 'สม่ำเสมอ' โดยที่เพื่อนบ้านแต่ละรายภายในขอบเขตจะมีน้ำหนักเท่ากันหรือ 'ระยะทาง' โดยที่ จุดที่ใกล้กว่าจะมีน้ำหนักมากขึ้นต่อการตัดสินใจ โปรดทราบว่าเมื่อ weights = 'distance' คลาสที่มีจำนวนสูงสุดในขอบเขตอาจไม่ “ชนะการโหวต”
- metric ซึ่งหมายถึงวิธีการเลือกระยะห่างของจุดใกล้เคียงจากจุดที่ไม่รู้จัก เนื่องจากโดยทั่วไปการสร้างแบบจำลองจะทำในมิติมากกว่า 3 มิติ จึงเป็นเรื่องยากที่จะแสดงภาพ

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

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

4 ความเป็นไปได้สำหรับ n_neighbors *
2 ความเป็นไปได้สำหรับ weights *
2 ความเป็นไปได้สำหรับ metric *
3 การตรวจสอบข้าม

สำหรับเวลาทั้งหมดที่ใช้โมเดล 4 * 2 * 2 * 3 = 48 สิ่งสำคัญคือต้องตั้งค่ารายละเอียดเพื่อที่คุณจะได้รับคำติชมเกี่ยวกับโมเดลและรู้ว่าต้องใช้เวลานานเท่าใดจึงจะเสร็จสิ้น kNN อาจใช้เวลานานจึงจะเสร็จสมบูรณ์เนื่องจากวัดระยะทางแต่ละจุดในแต่ละจุดในชุดทดสอบ

อีกสิ่งหนึ่งที่สังเกตได้จาก GridSearch คือ n_jobs = -1 ด้วยการตั้งค่า n_jobs เป็น -1 คุณกำลังบอกให้คอมพิวเตอร์ใช้โปรเซสเซอร์ทั้งหมดในการดำเนินการแบบจำลอง โปรดทราบว่าความเข้าใจผิดที่พบบ่อยคือ -1 หมายถึงใช้ "ตัวประมวลผลทั้งหมด -1" (เช่น 4–1 = 3 ตัวประมวลผล) แต่คอมพิวเตอร์ตีความว่าใช้ตัวประมวลผลทั้งหมด

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไฮเปอร์พารามิเตอร์ kNN

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

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

คุณควรใช้ kNN หรือไม่

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