Courses
หลังจากฝึกสอนโมเดลจัดกลุ่มแล้ว จะรู้ได้อย่างไรว่ากลุ่มที่ได้ดีแค่ไหน?
คำตอบสากลไม่มี ในการเรียนรู้แบบมีผู้สอนแบบดั้งเดิม คุณสามารถเปรียบเทียบค่าพยากรณ์กับฉลากจริงและได้ตัวเลขความแม่นยำ แต่กับการจัดกลุ่มทำแบบนั้นไม่ได้ คุณเลือก 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:
- ใกล้ 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:
-
silhouette_score()คืนค่าคะแนนเฉลี่ยของการจัดกลุ่มทั้งหมด -
silhouette_samples()คืนค่าคะแนนของแต่ละจุด
วิธีใช้ร่วมกับ KMeans บนข้อมูลสังเคราะห์มีดังนี้:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples
# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")
# Per-point silhouette values
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)
# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
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 ลงทะเบียนวันนี้เพื่อเรียนรู้การจัดกลุ่ม แปลงข้อมูล สร้างภาพ และสกัดข้อค้นพบจากข้อมูลไร้ฉลาก