หลังจากฝึกสอนโมเดลจัดกลุ่มแล้ว จะรู้ได้อย่างไรว่ากลุ่มที่ได้ดีแค่ไหน?
คำตอบสากลไม่มี ในการเรียนรู้แบบมีผู้สอนแบบดั้งเดิม คุณสามารถเปรียบเทียบค่าพยากรณ์กับฉลากจริงและได้ตัวเลขความแม่นยำ แต่กับการจัดกลุ่มทำแบบนั้นไม่ได้ คุณเลือก k=5 แล้วค่า k อื่นจะดีกว่าหรือไม่? เมื่อไม่มีฉลาก ก็แยกไม่ออกว่าอัลกอริทึมหาโครงสร้างจริงเจอหรือเพียงแค่แบ่งข้อมูลเป็นกองสุ่ม ๆ
Silhouette score คือเมตริกที่ตามหา มันวัดว่าจุดแต่ละจุดเข้ากับคลัสเตอร์ที่ถูกกำหนดได้ดีเพียงใดเมื่อเทียบกับคลัสเตอร์ที่ใกล้ที่สุดถัดไป เป็นหนึ่งในเมตริกที่ใช้แพร่หลาย ทำงานได้โดยไม่ต้องมีฉลาก และตีความง่าย
บทความนี้จะพาไปรู้จักสูตรและวิธีอ่านค่า ยกตัวอย่างด้วย Python และ scikit-learn และครอบคลุมสถานการณ์ที่ควรและไม่ควรใช้
ยังใหม่กับการจัดกลุ่ม? อ่านบทความสอนเรื่อง เกริ่นนำสู่ k-Means Clustering ด้วย scikit-learn เพื่อเรียนรู้การทำงานของอัลกอริทึมและการใช้ใน Python
Silhouette Score คืออะไร
Silhouette score เป็นตัวเลขระหว่าง -1 ถึง 1 ที่บอกว่าจุดแต่ละจุดเข้ากับคลัสเตอร์ของตนได้ดีเพียงใด
ตัวเลขนี้สะท้อนสองเรื่อง:
ความใกล้ของจุดกับจุดอื่นในคลัสเตอร์เดียวกัน
ความไกลจากคลัสเตอร์ที่ไม่ใช่ของตนแต่ใกล้ที่สุด
ถ้าจุดอยู่ลึกภายในกลุ่มของตนและห่างจากกลุ่มอื่น คะแนนจะสูง ถ้าอยู่ริมขอบ ใกล้คลัสเตอร์ข้างเคียงมากกว่าของตน คะแนนจะต่ำ
สรุปคือ silhouette score แสดงสมดุลระหว่างความหนาแน่นภายในคลัสเตอร์และการแยกจากคลัสเตอร์อื่น ทั้งสองสำคัญเท่ากัน การจัดกลุ่มที่จับจุดได้แน่นแต่ซ้อนทับกันก็ไร้ประโยชน์ เช่นเดียวกับการแยกกลุ่มได้ชัดแต่จุดภายในกระจัดกระจาย
การแยกคลัสเตอร์ได้ชัดเจน เทียบกับคลัสเตอร์ที่ซ้อนทับ
คะแนนสูงหมายถึงคลัสเตอร์นิยามได้ดี คะแนนใกล้ 1 หมายถึงจุดเกาะกลุ่มแน่นและห่างไกลจากกลุ่มอื่น คะแนนใกล้ 0 หมายถึงคลัสเตอร์ซ้อนทับหรือเส้นแบ่งไม่ชัด คะแนนติดลบหมายถึงจุดนั้นใกล้คลัสเตอร์อื่นมากกว่าคลัสเตอร์ที่ถูกกำหนด
Silhouette Score ทำงานอย่างไร
ทุกจุดจะมี silhouette score ของตนเอง และคะแนนมาจากระยะห่างสองค่า
อย่างแรกคือระยะห่างเฉลี่ยจากจุดนั้นไปยังจุดอื่นทั้งหมดในคลัสเตอร์เดียวกัน ถ้าค่านี้เล็ก แปลว่าอยู่ใกล้เพื่อนร่วมคลัสเตอร์ ถ้าใหญ่ แปลว่าเกาะกับคลัสเตอร์อย่างหลวม ๆ
อย่างที่สองคือระยะห่างเฉลี่ยจากจุดนั้นไปยังจุดในคลัสเตอร์ข้างเคียงที่ใกล้ที่สุด ถ้าค่านี้ใหญ่ แปลว่าแยกจากกลุ่มอื่นอย่างชัดเจน ถ้าเล็ก แปลว่าอยู่ใกล้เส้นแบ่ง
ระยะห่างของจุดถึงคลัสเตอร์ต่าง ๆ
ค่า silhouette เปรียบเทียบตัวเลขสองค่านี้ จุดที่อยู่ลึกในคลัสเตอร์ของตนและห่างจากคลัสเตอร์อื่นจะได้คะแนนสูง จุดที่อยู่ริมขอบ (ใกล้คลัสเตอร์อื่น) จะได้คะแนนต่ำ จุดที่ใกล้คลัสเตอร์อื่นมากกว่าคลัสเตอร์ของตนจะได้คะแนนติดลบ
สิ่งที่ควรจำคือระยะห่างเพียงค่าเดียวไม่พอ
คลัสเตอร์ที่แน่นอาจวางอยู่ติดกับอีกคลัสเตอร์หนึ่ง คลัสเตอร์ที่แยกชัดอาจกระจายตัวภายใน คุณต้องดูทั้งสองระยะเพื่อเชื่อมั่นในผลการกำหนดคลัสเตอร์
สูตรของ Silhouette Score
นี่คือสูตรสำหรับจุดเดียว:
สูตรของ Silhouette score
โดยที่:
สูตรจะหารช่องว่างระหว่าง b กับ a ด้วยค่าที่มากกว่าในสองค่านี้
โดยทั่วไป อาจตีความคะแนนได้ดังนี้:
เมื่อ b มากกว่า a มาก: จุดนั้นห่างจากคลัสเตอร์อื่นและใกล้กับคลัสเตอร์ของตน ตัวเศษใกล้กับ b ตัวส่วนก็เป็น b คะแนนจึงใกล้ 1
เมื่อ a มากกว่า b มาก: จุดนั้นใกล้คลัสเตอร์อื่นมากกว่าของตน ตัวเศษเป็นจำนวนลบขนาดใหญ่ใกล้กับ -a ตัวส่วนเป็น a คะแนนจึงใกล้ -1
เมื่อ a และ b พอ ๆ กัน: จุดนั้นอยู่บนเส้นแบ่งระหว่างคลัสเตอร์ ตัวเศษใกล้ 0 คะแนนก็ใกล้ 0
รายละเอียดเพิ่มเติมอยู่ถัดไป
การตีความค่า Silhouette Score
คู่มือโดยสังเขปสำหรับอ่านค่า silhouette score:
ใกล้ 1: จุดอยู่ลึกในคลัสเตอร์ของตนและห่างจากคลัสเตอร์อื่น
ราว 0.7: การจัดกลุ่มดี กลุ่มแยกจากกันชัดเจน และจุดอยู่ใกล้เพื่อนในกลุ่ม
ราว 0.5: พอใช้ได้ คลัสเตอร์มีการซ้อนทับกันบ้างแต่ยังแยกแยะได้
ใกล้ 0: คลัสเตอร์ซ้อนทับหรือเส้นแบ่งไม่ชัด โครงสร้างอาจไม่จริง
ต่ำกว่า 0: จุดใกล้คลัสเตอร์ที่ผิดมากกว่า อาจเกิดเมื่อเลือกจำนวนคลัสเตอร์ผิด หรือข้อมูลไม่เหมาะกับการจัดกลุ่มตั้งแต่แรก
เกณฑ์ข้างต้นเป็นเพียงแนวทางคร่าว ๆ ความหมายของคะแนนที่ดีขึ้นอยู่กับชุดข้อมูล
ข้อมูลที่เบาบางและมิติมากมักให้คะแนนต่ำแม้กลุ่มจะดี ข้อมูลที่หนาแน่นและแยกชัดอาจให้คะแนนเกิน 0.7 ควรเปรียบเทียบคะแนนข้ามโมเดลบนชุดข้อมูลเดียวกัน ไม่ใช่เทียบกับเกณฑ์สากล
วิธีคำนวณ Silhouette Score
คำนวณทีละจุด ตามขั้นตอนสำหรับจุดเดียวดังนี้
ขั้นที่ 1: คำนวณ a ระยะห่างเฉลี่ยจากจุดไปยังทุกจุดในคลัสเตอร์ของตน สมมติคลัสเตอร์มีสมาชิกอีก 4 จุด และระยะห่างคือ 1.2, 1.5, 1.0, 1.3:
ตัวอย่างการคำนวณ Silhouette (1)
ขั้นที่ 2: หา “คลัสเตอร์ข้างเคียงที่ใกล้ที่สุด” (คลัสเตอร์อื่นที่มีระยะห่างเฉลี่ยจากจุดต่ำสุด) แล้วคำนวณ b ระยะห่างเฉลี่ยจากจุดไปยังทุกจุดในคลัสเตอร์นั้น หากคลัสเตอร์ข้างเคียงมี 5 จุดที่ระยะ 2.4, 2.8, 3.0, 2.6 และ 2.7:
ตัวอย่างการคำนวณ Silhouette (2)
ขั้นที่ 3: นำ a และ b ไปใส่ในสูตร:
ตัวอย่างการคำนวณ Silhouette (3)
ขั้นที่ 4: ทำซ้ำสำหรับทุกจุดในชุดข้อมูล คะแนน silhouette โดยรวมของการจัดกลุ่มคือค่าเฉลี่ยของคะแนนทุกจุด
ตัวอย่าง Silhouette Score ใน Python
Scikit-learn มีสองฟังก์ชันสำหรับคำนวณ silhouette score อยู่ใน sklearn.metrics:
วิธีใช้ร่วมกับ KMeans บนข้อมูลสังเคราะห์มีดังนี้:
from sklearn. cluster import KMeans
from sklearn. datasets import make_blobs
from sklearn. metrics import silhouette_score, silhouette_samples
X, _ = make_blobs( n_samples= 500 , centers= 4 , cluster_std= 1.0 , random_state= 42 )
kmeans = KMeans( n_clusters= 4 , random_state= 42 , n_init= 10 )
labels = kmeans. fit_predict( X)
score = silhouette_score( X, labels)
print ( f"Overall silhouette score: { score: .3f } " )
sample_scores = silhouette_samples( X, labels)
print ( f"First 5 point scores: { sample_scores[ : 5] } " ) ขับเคลื่อนโดย
เมื่อรันโค้ดด้านบน จะได้ผลลัพธ์ดังนี้:
ผลลัพธ์ตัวอย่างใน Python
คะแนนรวม 0.791 หมายความว่าทั้งสี่คลัสเตอร์มีนิยามชัดและแยกจากกันดี
คะแนนรายจุดช่วยให้วิเคราะห์จุดข้อมูลแต่ละจุดได้
จุดที่ได้คะแนนสูงอยู่ลึกในคลัสเตอร์ของตน จุดที่ได้คะแนนต่ำหรือติดลบอยู่บริเวณเส้นแบ่งหรือถูกกำหนดผิด ช่วยตรวจจับ outlier หรือทบทวนจุดก้ำกึ่งได้สะดวก
การเลือกจำนวนคลัสเตอร์ที่เหมาะสม
การใช้ silhouette score ที่พบบ่อยที่สุดอย่างหนึ่งคือการเลือก k ที่เหมาะสมสำหรับ KMeans
ขั้นตอนมีสามข้อ:
ฟิต KMeans สำหรับช่วงค่าของ k หลายค่า
คำนวณ silhouette score สำหรับแต่ละโมเดล
เลือกค่า k ที่ให้คะแนนสูงสุด
โค้ดตัวอย่าง:
from sklearn. cluster import KMeans
from sklearn. datasets import make_blobs
from sklearn. metrics import silhouette_score
X, _ = make_blobs( n_samples= 500 , centers= 4 , cluster_std= 1.0 , random_state= 42 )
k_values = range ( 2 , 11 )
scores = [ ]
for k in k_values:
kmeans = KMeans( n_clusters= k, random_state= 42 , n_init= 10 )
labels = kmeans. fit_predict( X)
scores. append( silhouette_score( X, labels) )
print ( f"k= { k} : silhouette = { scores[ - 1 ] : .3f } " ) ขับเคลื่อนโดย
นี่คือคะแนนที่ได้สำหรับแต่ละค่า k:
Silhouette score สำหรับค่า k ที่ต่างกัน
คะแนนสูงสุดอยู่ที่ k=4 นั่นคือค่าที่ควรเลือก
อย่าลืมว่า silhouette score ไม่ได้แทนที่ความรู้เชิงโดเมน หากปัญหาธุรกิจต้องการ 5 กลุ่มลูกค้า แต่คะแนนสูงสุดอยู่ที่ 4 ก็ไม่ควรเลือก 4 โดยอัตโนมัติ เมตริกนี้ชี้ให้เห็นโครงสร้างที่สะอาดที่สุดในข้อมูล แต่จำนวนคลัสเตอร์ที่ถูกต้องอาจเป็นค่าที่สอดคล้องกับสิ่งที่มีความหมายในปัญหาของคุณ
Silhouette Score เทียบกับเมตริกการจัดกลุ่มอื่น
Silhouette score อาจเป็นเมตริกที่ใช้บ่อยที่สุดสำหรับประเมินการจัดกลุ่ม แต่ก็ไม่ใช่ตัวเดียว ต่อไปนี้คือการเปรียบเทียบกับทางเลือกอื่น
Silhouette score กับวิธี elbow
วิธี elbow เป็นเทคนิคเชิงภาพเพื่อเลือกค่า k ใน KMeans โดยฟิตโมเดลในช่วงค่า k หลายค่า พล็อตค่า inertia (ผลรวมกำลังสองภายในคลัสเตอร์) กับ k แล้วเลือกค่าที่กราฟหักศอกชัด
ข้อดีคือรวดเร็วและทำง่าย แต่ “ศอก” อาจไม่ชัดเสมอไป ในข้อมูลที่ยุ่ง กราฟอาจราบเรียบจนแยกจุดหักไม่ได้
Silhouette score ให้ตัวเลขจริงสำหรับแต่ละค่า k ทำให้เปรียบเทียบได้มีความหมายมากขึ้น แม้คำนวณช้ากว่า แต่ไม่ต้องพึ่งการตีความด้วยตา
ใช้ elbow เพื่อเช็คคร่าว ๆ ใช้ silhouette score เมื่อต้องการคำตอบที่มั่นใจได้
Silhouette score กับดัชนี Davies-Bouldin
Davies-Bouldin index (DBI) วัดความเหมือนเฉลี่ยระหว่างแต่ละคลัสเตอร์กับคลัสเตอร์ที่เหมือนที่สุด ค่าต่ำหมายถึงการจัดกลุ่มที่ดีกว่า และคะแนนที่สมบูรณ์คือ 0
DBI ใช้เซนทรอยด์ของคลัสเตอร์คำนวณความเหมือน จึงคำนวณเร็วกว่า silhouette บนชุดข้อมูลขนาดใหญ่ และยึดหลักการคล้ายกันคือให้รางวัลกับคลัสเตอร์ที่แน่นและแยกชัด
ข้อจำกัดคือ DBI บอกได้เฉพาะระดับภาพรวมของการจัดกลุ่ม ในขณะที่ silhouette ให้คะแนนรายจุด ช่วยหาจุดก้ำกึ่งและ outlier ได้
ใช้ DBI เมื่อทำงานกับข้อมูลใหญ่และต้องการความเร็ว ใช้ silhouette เมื่ออยากดูรายละเอียดระดับจุด
Silhouette score กับดัชนี Calinski-Harabasz
Calinski-Harabasz index (CH) หรือ variance ratio criterion คืออัตราส่วนการกระจายระหว่างคลัสเตอร์ต่อการกระจายภายในคลัสเตอร์ ค่ายิ่งสูงยิ่งดี และไม่มีเพดานบน
CH เร็วและเหมาะกับชุดข้อมูลใหญ่เพราะใช้สถิติระดับคลัสเตอร์เท่านั้น เช่นเดียวกับ silhouette และ DBI จะทำงานได้ดีเมื่อคลัสเตอร์เป็นคอนเว็กซ์และแยกชัด
CH ไม่มีสเกลธรรมชาติ จึงเปรียบเทียบข้ามชุดข้อมูลไม่ได้ ควรเปรียบเทียบเฉพาะข้ามโมเดลบนชุดข้อมูลเดียวกัน
ใช้ CH เมื่อข้อมูลขนาดใหญ่และต้องการผลเร็ว ใช้ silhouette เมื่อให้ความสำคัญกับการตีความและข้อมูลเชิงลึกรายจุด
เมตริกการจัดกลุ่มแบบ internal เทียบกับ external
เมตริกด้านบน (silhouette, DBI, CH, elbow) เป็นเมตริกภายใน ใช้ประเมินการจัดกลุ่มจากข้อมูลเองโดยไม่ต้องมีฉลากจริง จึงเป็นตัวเลือกมาตรฐานสำหรับปัญหาจริงที่มักไม่มีฉลาก
เมตริกภายนอกจะเปรียบเทียบผลการกำหนดคลัสเตอร์กับฉลากที่ทราบ เช่น Adjusted Rand Index (ARI), Normalized Mutual Information (NMI) และ homogeneity ใช้เมื่อมีฉลากและต้องการทดสอบว่าอัลกอริทึมจัดกลุ่มได้ตรงเพียงใด
ใช้เมตริกภายในเมื่อไม่มีฉลาก ซึ่งเป็นกรณีปกติ ใช้เมตริกภายนอกเมื่อทำเบนช์มาร์กอัลกอริทึมจัดกลุ่มบนข้อมูลที่มีฉลาก
สรุปเมตริกต่าง ๆ แบบเทียบข้างกัน:
วิธี ช่วงค่า ค่าดีที่สุด ความเร็ว เหมาะสำหรับ Silhouette score -1 ถึง 1 ใกล้ 1 ช้าบนชุดข้อมูลขนาดใหญ่ ตีความง่ายและเจาะลึกระดับจุด Elbow method 0 ถึงอนันต์ มองหาจุดหักศอก เร็ว ตรวจสอบอย่างรวดเร็ว Davies-Bouldin index 0 ถึงอนันต์ ใกล้ 0 เร็ว ชุดข้อมูลขนาดใหญ่ Calinski-Harabasz index 0 ถึงอนันต์ ยิ่งสูงยิ่งดี เร็ว ชุดข้อมูลใหญ่ที่ไม่มีฉลาก
เปรียบเทียบ Silhouette score กับทางเลือกอื่น
ข้อจำกัดของ Silhouette Score
Silhouette score มีข้อจำกัดบางประการที่ควรรู้:
ตั้งอยู่บนการจัดกลุ่มด้วยระยะทาง: โดยปริยายใช้ระยะยูคลิด เหมาะกับ KMeans และอัลกอริทึมแบบเซนทรอยด์อื่น ๆ แต่ไม่เหมาะกับวิธีแบบความหนาแน่นอย่าง DBSCAN ที่คลัสเตอร์มีรูปร่างและไม่มีเซนทรอยด์ชัดเจน
ทำงานดีที่สุดกับคลัสเตอร์เล็กและแยกชัด: เมตริกนี้ให้รางวัลกับคลัสเตอร์ทรงกลมที่แน่นและอยู่ไกล หากข้อมูลมีคลัสเตอร์ที่อยู่ใกล้กันหรือซ้อนทับ คะแนนจะต่ำแม้การจัดกลุ่มจะถูกต้อง
ไม่เหมาะกับรูปร่างคลัสเตอร์ที่ไม่ปกติ: คลัสเตอร์ในโลกจริงไม่จำเป็นต้องเป็นคอนเว็กซ์ หากไม่ใช่สำหรับข้อมูลของคุณ คะแนนอาจต่ำแม้การกำหนดจะถูกต้อง
ต้นทุนคำนวณบนชุดข้อมูลใหญ่: การคำนวณต้องใช้ระยะคู่ทุกคู่ของจุด ซึ่งสเกลเป็น O(n^2) บนชุดข้อมูลระดับล้านจุดจะมีค่าใช้จ่ายสูง
ไวต่อเมตริกระยะทางที่เลือก : คะแนนจะเปลี่ยนตามการใช้ยูคลิด แมนฮัตตัน โคไซน์ หรือแบบอื่น หากข้อมูลไม่สอดคล้องกับสมมติฐานยูคลิด Silhouette score อาจทำให้เข้าใจผิด
แนวปฏิบัติที่ดีในการใช้ Silhouette Score
Silhouette score จะได้ผลดีที่สุดเมื่อปฏิบัติตามหลักพื้นฐานไม่กี่ข้อ:
เปรียบเทียบหลายวิธีการจัดกลุ่ม : อย่าคำนวณเพียงคะแนนเดียว ควรฟิตโมเดลจัดกลุ่มด้วยค่า k ต่างกัน (หรืออัลกอริทึมต่างกัน) แล้วเปรียบเทียบคะแนนกัน
แสดงภาพคลัสเตอร์ควบคู่กับคะแนน: ตัวเลขอย่างเดียวไม่เล่าเรื่องทั้งหมด พล็อตคลัสเตอร์แล้วดูว่ารูปร่างมีเหตุผลหรือไม่
อย่าปรับให้ได้แค่คะแนนสูงสุด: การจัดกลุ่มที่ k=2 มักได้คะแนนสูงกว่า k=5 แม้ 5 คลัสเตอร์จะมีความหมายในปัญหาของคุณ
ผสานกับความรู้เชิงโดเมน: คะแนนบอกโครงสร้างที่สะอาดที่สุดตามข้อมูล ความรู้เชิงโดเมนบอกว่าโครงสร้างใดใช้การได้จริง ใช้ทั้งสองร่วมกัน
ประเมินหลายเมตริกการจัดกลุ่ม: Silhouette, DBI, CH และเมตริกอื่นวัดคุณภาพต่างกัน เมื่อให้ผลสอดคล้องกัน แปลว่าไปถูกทาง หากไม่สอดคล้อง ให้กลับมาดูข้อมูล
สรุป
Silhouette score เป็นวิธีที่เข้าใจง่ายในการประเมินการจัดกลุ่ม เพราะสะท้อนทั้งความแน่นภายในคลัสเตอร์และการแยกคลัสเตอร์ออกจากกัน
คำนวณทีละจุด นำมาเฉลี่ย ได้ตัวเลขเดียวระหว่าง -1 ถึง 1 ค่ายิ่งใกล้ 1 หมายถึงคลัสเตอร์นิยามดี ค่าใกล้หรือ ต่ำกว่า 0 หมายถึงโครงสร้างนั้นอาจไม่ใช่โครงสร้างจริง
แต่ silhouette score เป็นเพียงจุดเริ่มต้น ควรจับคู่กับการแสดงภาพคลัสเตอร์ และที่สำคัญที่สุดคือความรู้เชิงโดเมนของปัญหา เมื่อทั้งสามสิ่งชี้ไปทิศทางเดียวกัน จึงควรเชื่อผลลัพธ์
Silhouette score เป็นส่วนหนึ่งของภาพรวมเรื่อง การเรียนรู้แบบไม่มีผู้สอนใน Python ลงทะเบียนวันนี้เพื่อเรียนรู้การจัดกลุ่ม แปลงข้อมูล สร้างภาพ และสกัดข้อค้นพบจากข้อมูลไร้ฉลาก
หลังจากฝึกสอนโมเดลจัดกลุ่มแล้ว จะรู้ได้อย่างไรว่ากลุ่มที่ได้ดีแค่ไหน?
คำตอบสากลไม่มี ในการเรียนรู้แบบมีผู้สอนแบบดั้งเดิม คุณสามารถเปรียบเทียบค่าพยากรณ์กับฉลากจริงและได้ตัวเลขความแม่นยำ แต่กับการจัดกลุ่มทำแบบนั้นไม่ได้ คุณเลือก k=5 แล้วค่า k อื่นจะดีกว่าหรือไม่? เมื่อไม่มีฉลาก ก็แยกไม่ออกว่าอัลกอริทึมหาโครงสร้างจริงเจอหรือเพียงแค่แบ่งข้อมูลเป็นกองสุ่ม ๆ
Silhouette score คือเมตริกที่ตามหา มันวัดว่าจุดแต่ละจุดเข้ากับคลัสเตอร์ที่ถูกกำหนดได้ดีเพียงใดเมื่อเทียบกับคลัสเตอร์ที่ใกล้ที่สุดถัดไป เป็นหนึ่งในเมตริกที่ใช้แพร่หลาย ทำงานได้โดยไม่ต้องมีฉลาก และตีความง่าย
บทความนี้จะพาไปรู้จักสูตรและวิธีอ่านค่า ยกตัวอย่างด้วย Python และ scikit-learn และครอบคลุมสถานการณ์ที่ควรและไม่ควรใช้
ยังใหม่กับการจัดกลุ่ม? อ่านบทความสอนเรื่อง เกริ่นนำสู่ k-Means Clustering ด้วย scikit-learn เพื่อเรียนรู้การทำงานของอัลกอริทึมและการใช้ใน Python
Silhouette Score คืออะไร
Silhouette score เป็นตัวเลขระหว่าง -1 ถึง 1 ที่บอกว่าจุดแต่ละจุดเข้ากับคลัสเตอร์ของตนได้ดีเพียงใด
ตัวเลขนี้สะท้อนสองเรื่อง:
ถ้าจุดอยู่ลึกภายในกลุ่มของตนและห่างจากกลุ่มอื่น คะแนนจะสูง ถ้าอยู่ริมขอบ ใกล้คลัสเตอร์ข้างเคียงมากกว่าของตน คะแนนจะต่ำ
สรุปคือ silhouette score แสดงสมดุลระหว่างความหนาแน่นภายในคลัสเตอร์และการแยกจากคลัสเตอร์อื่น ทั้งสองสำคัญเท่ากัน การจัดกลุ่มที่จับจุดได้แน่นแต่ซ้อนทับกันก็ไร้ประโยชน์ เช่นเดียวกับการแยกกลุ่มได้ชัดแต่จุดภายในกระจัดกระจาย
การแยกคลัสเตอร์ได้ชัดเจน เทียบกับคลัสเตอร์ที่ซ้อนทับ
คะแนนสูงหมายถึงคลัสเตอร์นิยามได้ดี คะแนนใกล้ 1 หมายถึงจุดเกาะกลุ่มแน่นและห่างไกลจากกลุ่มอื่น คะแนนใกล้ 0 หมายถึงคลัสเตอร์ซ้อนทับหรือเส้นแบ่งไม่ชัด คะแนนติดลบหมายถึงจุดนั้นใกล้คลัสเตอร์อื่นมากกว่าคลัสเตอร์ที่ถูกกำหนด
Silhouette Score ทำงานอย่างไร
ทุกจุดจะมี silhouette score ของตนเอง และคะแนนมาจากระยะห่างสองค่า
อย่างแรกคือระยะห่างเฉลี่ยจากจุดนั้นไปยังจุดอื่นทั้งหมดในคลัสเตอร์เดียวกัน ถ้าค่านี้เล็ก แปลว่าอยู่ใกล้เพื่อนร่วมคลัสเตอร์ ถ้าใหญ่ แปลว่าเกาะกับคลัสเตอร์อย่างหลวม ๆ
อย่างที่สองคือระยะห่างเฉลี่ยจากจุดนั้นไปยังจุดในคลัสเตอร์ข้างเคียงที่ใกล้ที่สุด ถ้าค่านี้ใหญ่ แปลว่าแยกจากกลุ่มอื่นอย่างชัดเจน ถ้าเล็ก แปลว่าอยู่ใกล้เส้นแบ่ง
ระยะห่างของจุดถึงคลัสเตอร์ต่าง ๆ
ค่า silhouette เปรียบเทียบตัวเลขสองค่านี้ จุดที่อยู่ลึกในคลัสเตอร์ของตนและห่างจากคลัสเตอร์อื่นจะได้คะแนนสูง จุดที่อยู่ริมขอบ (ใกล้คลัสเตอร์อื่น) จะได้คะแนนต่ำ จุดที่ใกล้คลัสเตอร์อื่นมากกว่าคลัสเตอร์ของตนจะได้คะแนนติดลบ
สิ่งที่ควรจำคือระยะห่างเพียงค่าเดียวไม่พอ
คลัสเตอร์ที่แน่นอาจวางอยู่ติดกับอีกคลัสเตอร์หนึ่ง คลัสเตอร์ที่แยกชัดอาจกระจายตัวภายใน คุณต้องดูทั้งสองระยะเพื่อเชื่อมั่นในผลการกำหนดคลัสเตอร์
สูตรของ Silhouette Score
นี่คือสูตรสำหรับจุดเดียว:
สูตรของ Silhouette score
โดยที่:
aคือระยะห่างเฉลี่ยจากจุดนั้นไปยังจุดอื่นทั้งหมดในคลัสเตอร์เดียวกันbคือระยะห่างเฉลี่ยจากจุดนั้นไปยังจุดทั้งหมดในคลัสเตอร์ข้างเคียงที่ใกล้ที่สุดสูตรจะหารช่องว่างระหว่าง
bกับaด้วยค่าที่มากกว่าในสองค่านี้โดยทั่วไป อาจตีความคะแนนได้ดังนี้:
เมื่อ
bมากกว่าaมาก: จุดนั้นห่างจากคลัสเตอร์อื่นและใกล้กับคลัสเตอร์ของตน ตัวเศษใกล้กับbตัวส่วนก็เป็นbคะแนนจึงใกล้ 1เมื่อ
aมากกว่าbมาก: จุดนั้นใกล้คลัสเตอร์อื่นมากกว่าของตน ตัวเศษเป็นจำนวนลบขนาดใหญ่ใกล้กับ-aตัวส่วนเป็นaคะแนนจึงใกล้ -1เมื่อ
aและbพอ ๆ กัน: จุดนั้นอยู่บนเส้นแบ่งระหว่างคลัสเตอร์ ตัวเศษใกล้ 0 คะแนนก็ใกล้ 0รายละเอียดเพิ่มเติมอยู่ถัดไป
การตีความค่า Silhouette Score
คู่มือโดยสังเขปสำหรับอ่านค่า silhouette score:
เกณฑ์ข้างต้นเป็นเพียงแนวทางคร่าว ๆ ความหมายของคะแนนที่ดีขึ้นอยู่กับชุดข้อมูล
ข้อมูลที่เบาบางและมิติมากมักให้คะแนนต่ำแม้กลุ่มจะดี ข้อมูลที่หนาแน่นและแยกชัดอาจให้คะแนนเกิน 0.7 ควรเปรียบเทียบคะแนนข้ามโมเดลบนชุดข้อมูลเดียวกัน ไม่ใช่เทียบกับเกณฑ์สากล
วิธีคำนวณ Silhouette Score
คำนวณทีละจุด ตามขั้นตอนสำหรับจุดเดียวดังนี้
ขั้นที่ 1: คำนวณ
aระยะห่างเฉลี่ยจากจุดไปยังทุกจุดในคลัสเตอร์ของตน สมมติคลัสเตอร์มีสมาชิกอีก 4 จุด และระยะห่างคือ 1.2, 1.5, 1.0, 1.3:ตัวอย่างการคำนวณ Silhouette (1)
ขั้นที่ 2: หา “คลัสเตอร์ข้างเคียงที่ใกล้ที่สุด” (คลัสเตอร์อื่นที่มีระยะห่างเฉลี่ยจากจุดต่ำสุด) แล้วคำนวณ
bระยะห่างเฉลี่ยจากจุดไปยังทุกจุดในคลัสเตอร์นั้น หากคลัสเตอร์ข้างเคียงมี 5 จุดที่ระยะ 2.4, 2.8, 3.0, 2.6 และ 2.7:ตัวอย่างการคำนวณ Silhouette (2)
ขั้นที่ 3: นำ
aและbไปใส่ในสูตร:ตัวอย่างการคำนวณ Silhouette (3)
ขั้นที่ 4: ทำซ้ำสำหรับทุกจุดในชุดข้อมูล คะแนน silhouette โดยรวมของการจัดกลุ่มคือค่าเฉลี่ยของคะแนนทุกจุด
ตัวอย่าง Silhouette Score ใน Python
Scikit-learn มีสองฟังก์ชันสำหรับคำนวณ silhouette score อยู่ใน
sklearn.metrics:silhouette_score()คืนค่าคะแนนเฉลี่ยของการจัดกลุ่มทั้งหมดsilhouette_samples()คืนค่าคะแนนของแต่ละจุดวิธีใช้ร่วมกับ KMeans บนข้อมูลสังเคราะห์มีดังนี้:
เมื่อรันโค้ดด้านบน จะได้ผลลัพธ์ดังนี้:
ผลลัพธ์ตัวอย่างใน Python
คะแนนรวม 0.791 หมายความว่าทั้งสี่คลัสเตอร์มีนิยามชัดและแยกจากกันดี
คะแนนรายจุดช่วยให้วิเคราะห์จุดข้อมูลแต่ละจุดได้
จุดที่ได้คะแนนสูงอยู่ลึกในคลัสเตอร์ของตน จุดที่ได้คะแนนต่ำหรือติดลบอยู่บริเวณเส้นแบ่งหรือถูกกำหนดผิด ช่วยตรวจจับ outlier หรือทบทวนจุดก้ำกึ่งได้สะดวก
การเลือกจำนวนคลัสเตอร์ที่เหมาะสม
การใช้ silhouette score ที่พบบ่อยที่สุดอย่างหนึ่งคือการเลือก
kที่เหมาะสมสำหรับ KMeansขั้นตอนมีสามข้อ:
kที่ให้คะแนนสูงสุดโค้ดตัวอย่าง:
นี่คือคะแนนที่ได้สำหรับแต่ละค่า
k:Silhouette score สำหรับค่า k ที่ต่างกัน
คะแนนสูงสุดอยู่ที่
k=4นั่นคือค่าที่ควรเลือกอย่าลืมว่า silhouette score ไม่ได้แทนที่ความรู้เชิงโดเมน หากปัญหาธุรกิจต้องการ 5 กลุ่มลูกค้า แต่คะแนนสูงสุดอยู่ที่ 4 ก็ไม่ควรเลือก 4 โดยอัตโนมัติ เมตริกนี้ชี้ให้เห็นโครงสร้างที่สะอาดที่สุดในข้อมูล แต่จำนวนคลัสเตอร์ที่ถูกต้องอาจเป็นค่าที่สอดคล้องกับสิ่งที่มีความหมายในปัญหาของคุณ
Silhouette Score เทียบกับเมตริกการจัดกลุ่มอื่น
Silhouette score อาจเป็นเมตริกที่ใช้บ่อยที่สุดสำหรับประเมินการจัดกลุ่ม แต่ก็ไม่ใช่ตัวเดียว ต่อไปนี้คือการเปรียบเทียบกับทางเลือกอื่น
Silhouette score กับวิธี elbow
วิธี elbow เป็นเทคนิคเชิงภาพเพื่อเลือกค่า
kใน KMeans โดยฟิตโมเดลในช่วงค่า k หลายค่า พล็อตค่า inertia (ผลรวมกำลังสองภายในคลัสเตอร์) กับ k แล้วเลือกค่าที่กราฟหักศอกชัดข้อดีคือรวดเร็วและทำง่าย แต่ “ศอก” อาจไม่ชัดเสมอไป ในข้อมูลที่ยุ่ง กราฟอาจราบเรียบจนแยกจุดหักไม่ได้
Silhouette score ให้ตัวเลขจริงสำหรับแต่ละค่า k ทำให้เปรียบเทียบได้มีความหมายมากขึ้น แม้คำนวณช้ากว่า แต่ไม่ต้องพึ่งการตีความด้วยตา
ใช้ elbow เพื่อเช็คคร่าว ๆ ใช้ silhouette score เมื่อต้องการคำตอบที่มั่นใจได้
Silhouette score กับดัชนี Davies-Bouldin
Davies-Bouldin index (DBI) วัดความเหมือนเฉลี่ยระหว่างแต่ละคลัสเตอร์กับคลัสเตอร์ที่เหมือนที่สุด ค่าต่ำหมายถึงการจัดกลุ่มที่ดีกว่า และคะแนนที่สมบูรณ์คือ 0
DBI ใช้เซนทรอยด์ของคลัสเตอร์คำนวณความเหมือน จึงคำนวณเร็วกว่า silhouette บนชุดข้อมูลขนาดใหญ่ และยึดหลักการคล้ายกันคือให้รางวัลกับคลัสเตอร์ที่แน่นและแยกชัด
ข้อจำกัดคือ DBI บอกได้เฉพาะระดับภาพรวมของการจัดกลุ่ม ในขณะที่ silhouette ให้คะแนนรายจุด ช่วยหาจุดก้ำกึ่งและ outlier ได้
ใช้ DBI เมื่อทำงานกับข้อมูลใหญ่และต้องการความเร็ว ใช้ silhouette เมื่ออยากดูรายละเอียดระดับจุด
Silhouette score กับดัชนี Calinski-Harabasz
Calinski-Harabasz index (CH) หรือ variance ratio criterion คืออัตราส่วนการกระจายระหว่างคลัสเตอร์ต่อการกระจายภายในคลัสเตอร์ ค่ายิ่งสูงยิ่งดี และไม่มีเพดานบน
CH เร็วและเหมาะกับชุดข้อมูลใหญ่เพราะใช้สถิติระดับคลัสเตอร์เท่านั้น เช่นเดียวกับ silhouette และ DBI จะทำงานได้ดีเมื่อคลัสเตอร์เป็นคอนเว็กซ์และแยกชัด
CH ไม่มีสเกลธรรมชาติ จึงเปรียบเทียบข้ามชุดข้อมูลไม่ได้ ควรเปรียบเทียบเฉพาะข้ามโมเดลบนชุดข้อมูลเดียวกัน
ใช้ CH เมื่อข้อมูลขนาดใหญ่และต้องการผลเร็ว ใช้ silhouette เมื่อให้ความสำคัญกับการตีความและข้อมูลเชิงลึกรายจุด
เมตริกการจัดกลุ่มแบบ internal เทียบกับ external
เมตริกด้านบน (silhouette, DBI, CH, elbow) เป็นเมตริกภายใน ใช้ประเมินการจัดกลุ่มจากข้อมูลเองโดยไม่ต้องมีฉลากจริง จึงเป็นตัวเลือกมาตรฐานสำหรับปัญหาจริงที่มักไม่มีฉลาก
เมตริกภายนอกจะเปรียบเทียบผลการกำหนดคลัสเตอร์กับฉลากที่ทราบ เช่น Adjusted Rand Index (ARI), Normalized Mutual Information (NMI) และ homogeneity ใช้เมื่อมีฉลากและต้องการทดสอบว่าอัลกอริทึมจัดกลุ่มได้ตรงเพียงใด
ใช้เมตริกภายในเมื่อไม่มีฉลาก ซึ่งเป็นกรณีปกติ ใช้เมตริกภายนอกเมื่อทำเบนช์มาร์กอัลกอริทึมจัดกลุ่มบนข้อมูลที่มีฉลาก
สรุปเมตริกต่าง ๆ แบบเทียบข้างกัน:
เปรียบเทียบ Silhouette score กับทางเลือกอื่น
ข้อจำกัดของ Silhouette Score
Silhouette score มีข้อจำกัดบางประการที่ควรรู้:
O(n^2)บนชุดข้อมูลระดับล้านจุดจะมีค่าใช้จ่ายสูงแนวปฏิบัติที่ดีในการใช้ Silhouette Score
Silhouette score จะได้ผลดีที่สุดเมื่อปฏิบัติตามหลักพื้นฐานไม่กี่ข้อ:
kต่างกัน (หรืออัลกอริทึมต่างกัน) แล้วเปรียบเทียบคะแนนกันk=5แม้ 5 คลัสเตอร์จะมีความหมายในปัญหาของคุณสรุป
Silhouette score เป็นวิธีที่เข้าใจง่ายในการประเมินการจัดกลุ่ม เพราะสะท้อนทั้งความแน่นภายในคลัสเตอร์และการแยกคลัสเตอร์ออกจากกัน
คำนวณทีละจุด นำมาเฉลี่ย ได้ตัวเลขเดียวระหว่าง -1 ถึง 1 ค่ายิ่งใกล้ 1 หมายถึงคลัสเตอร์นิยามดี ค่าใกล้หรือ ต่ำกว่า 0 หมายถึงโครงสร้างนั้นอาจไม่ใช่โครงสร้างจริง
แต่ silhouette score เป็นเพียงจุดเริ่มต้น ควรจับคู่กับการแสดงภาพคลัสเตอร์ และที่สำคัญที่สุดคือความรู้เชิงโดเมนของปัญหา เมื่อทั้งสามสิ่งชี้ไปทิศทางเดียวกัน จึงควรเชื่อผลลัพธ์
Silhouette score เป็นส่วนหนึ่งของภาพรวมเรื่อง การเรียนรู้แบบไม่มีผู้สอนใน Python ลงทะเบียนวันนี้เพื่อเรียนรู้การจัดกลุ่ม แปลงข้อมูล สร้างภาพ และสกัดข้อค้นพบจากข้อมูลไร้ฉลาก