บันทึก training data science EP 10: Cluster – เชื่อมก้อนให้เป็นกลุ่ม
ตอนก่อนหน้า: บันทึก training data science EP 9: NetworkX – แผนที่ตัวกวน(ใจ) ที่ไม่ได้อยู่ในฮอกวอตส์
หนึ่งในโจทย์คลาสสิคของ Data Science คือการแบ่งกลุ่มฮะ สมมติว่าเรามีข้อมูลลูกค้าอยู่ 100 คน เราอยากรู้ไลฟ์สไตล์ของพวกเค้าแต่ละคน ว่าใครบ้างชอบอ่านหนังสือ ใครชอบเล่นกีฬา และใครชอบช้อปปิ้ง เพื่อเอาไปทำแคมเปญต่างๆ เราจะทำยังไงดีนะ
Clustering
Clustering หมายถึงกลุ่มก้อน ในที่นี้คือกลุ่มก้อนข้อมูลที่มันอยู่กระจัดกระจายกันไป เราจะหาความเชื่อมโยงของแต่ละกลุ่มเหล่านั้นฮะ
ตัว Sci-kit learn ใน Python เองก็มี module เอาไว้จัดการปัญหานี้เช่นกัน นั่นคือ sklearn.cluster
นี่เองฮะ
เตรียมข้อมูล
เริ่มต้นด้วยการเตรียมข้อมูลโจทย์เอาไว้ก่อนนะฮะ
ครั้งนี้ ผมเอาข้อมูลมาจาก sci-kit learn dataset มีชื่อว่า make_blobs
ฮะ
หยิบมาดังข้างต้นแล้วเอามา plot graph เห็นกันง่ายๆ อย่างน้ีเลยว่ามันมีสามกลุ่มเนอะ แต่เราจะทำให้ model มันรู้ได้ยังไงว่ามีสามกลุ่ม หรือจริงๆ แล้วมันมีกลุ่มมากกว่านั้นกันนะ
DBSCAN
DBSCAN ย่อมาจาก “Density-Based Spatial Clustering of Applications with Noise” โดยหลักการของมันคือ
- กำหนดระยะทางขึ้นมาก่อนค่านึง สมมติเป็น x
- หยิบข้อมูลมา y จุดแล้วหาค่ากลางระหว่าง y จุดนั้น
- หาว่าในระยะรัศมี x รอบจุดกึ่งกลาง มีจุดอื่นอีกหรือไม่ ถ้ามีก็เอาจุดใหม่มาเข้ากลุ่ม แล้วทำข้อ 2 แต่ถ้าไม่มีแล้วก็ถือว่ากลุ่มนั้นมีข้อมูลครบแล้ว
- ทำวนไปจนทุกจุดมีกลุ่มของตัวเอง
ตั้งต้นจากการสร้าง DBSCAN object ด้วย parameter สองตัวตามรูปข้างล่างนะฮะ
eps
ย่อมาจาก epsilon เป็นค่ากำหนดระยะทาง x ที่ว่าmin_samples
เป็นค่าบอกจำนวนจุดขั้นต่ำ y
eps
(epsilon) as the distance xmin_samples
as the minimum dots or the number y
จากนั้นก็ .fit_predict()
และผลลัพท์จะอยู่ใน .labels_
ฮะ ผมใช้ pd.unique()
เพื่อเช็คว่า model คำนวณได้กลุ่มอะไรบ้างนะฮะ
ลองเปลี่ยนค่า eps
และ min_samples
ดู ก็พบว่าผลลัพท์เปลี่ยนไปเลย
Reference link: https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html
K-means
K-means เนี่ย ได้ชื่อว่าเป็นพระเอกของ clustering เลยฮะ ด้วยความที่มันใช้งานง่าย และแพร่หลายเลย โดยตัวมันเองต้องการค่าจำนวนกลุ่ม หรือ n_clusters
ที่เหลือมันจะคำนวณให้เราเองฮะ
เริ่มแรก ผมลองให้มันจัดกลุ่มมา 3 กลุ่ม ได้ผลลัพท์สวยงาม
เราอยากรู้จุดกึ่งกลางของกลุ่ม ก็ใช้ .cluster_centers_
ได้เลยฮะ
ลองเปลี่ยนเป็นจัดกลุ่ม 5 กลุ่มดูซิ
ไม่เลวๆ
Reference link: https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
OPTICS
ตัวสุดท้ายของ blog นี้นะฮะ OPTICS ย่อมาจาก “Ordering Points To Identify the Clustering Structure” หลักการคล้ายๆ กับ DBSCAN เพียงแต่มันไม่มีค่า epsilon นั่นคือมันพิจารณาระยะห่างทั้งหมด ทำให้มันประมวลผลใช้เวลานานกว่า DBSCAN แต่ก็เหมาะกับข้อมูลจำนวนมากๆ ฮะ
ลองเปลี่ยนค่า min_samples
ดูก็ได้ผลลัพท์ที่แปลกตาไปฮะ
Reference link: https://scikit-learn.org/stable/modules/generated/sklearn.cluster.OPTICS.html
วัดผลด้วย Metrics
เมื่อทำ model กันแล้ว เราก็ต้องมาดูความถูกต้องกันหน่อย สำหรับ score ที่จะใช้ประเมิน clustering model เรามีด้วยกัน 3 ตัวหลักๆ ได้แก่
- Silhouette score
คำนวณระยะห่างระหว่างกลุ่ม เทียบกับระยะห่างระหว่างจุดในกลุ่มเดียวกัน ค่าที่ดีที่สุดคือ 1 และแย่ที่สุดคือ -1 - Davies-Bouldin score
คำนวณการกระจายของข้อมูลในกลุ่มกับการแยกห่างของแต่ละกลุ่ม ค่าที่ดีที่สุดคือ 0 ฮะ ยิ่งสูงยิ่งไม่ดี - Calinski-Harabasz Score
คำนวณการกระจายของข้อมูลในกลุ่มเดียวกัน เทียบกับการกระจายระหว่างกลุ่ม ค่ายิ่งสูงยิ่งดีฮะ
from sklearn import metrics
# Silhouette score
metrics.silhouette_score(dataframe, clustering.labels_)
# Davies-Bouldin score
metrics.davies_bouldin_score(dataframe, clustering.labels_)
# Calinski-Harabasz Score
metrics.calinski_harabasz_score(dataframe, clustering.labels_)
หวังว่าจะมีประโยชน์นะฮะ เพราะโจทย์การแบ่งกลุ่มเนี่ย ค่อนข้างเจอง่ายเลยแหละ ในชีวิตจริง
คราวหน้าจะเป็นเรื่องอะไร จะเอามาแชร์ให้อ่านอีกนะฮะ
บาย
ตอนต่อไป: บันทึก training data science EP 11: NLP & Spacy – สอนภาษารัก