ตอนก่อนหน้า: บันทึก 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” โดยหลักการของมันคือ

  1. กำหนดระยะทางขึ้นมาก่อนค่านึง สมมติเป็น x
  2. หยิบข้อมูลมา y จุดแล้วหาค่ากลางระหว่าง y จุดนั้น
  3. หาว่าในระยะรัศมี x รอบจุดกึ่งกลาง มีจุดอื่นอีกหรือไม่ ถ้ามีก็เอาจุดใหม่มาเข้ากลุ่ม แล้วทำข้อ 2 แต่ถ้าไม่มีแล้วก็ถือว่ากลุ่มนั้นมีข้อมูลครบแล้ว
  4. ทำวนไปจนทุกจุดมีกลุ่มของตัวเอง

ตั้งต้นจากการสร้าง DBSCAN object ด้วย parameter สองตัวตามรูปข้างล่างนะฮะ

  • eps ย่อมาจาก epsilon เป็นค่ากำหนดระยะทาง x ที่ว่า
  • min_samples เป็นค่าบอกจำนวนจุดขั้นต่ำ y
  • eps (epsilon) as the distance x
  • min_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 ตัวหลักๆ ได้แก่

  1. Silhouette score
    คำนวณระยะห่างระหว่างกลุ่ม เทียบกับระยะห่างระหว่างจุดในกลุ่มเดียวกัน ค่าที่ดีที่สุดคือ 1 และแย่ที่สุดคือ -1
  2. Davies-Bouldin score
    คำนวณการกระจายของข้อมูลในกลุ่มกับการแยกห่างของแต่ละกลุ่ม ค่าที่ดีที่สุดคือ 0 ฮะ ยิ่งสูงยิ่งไม่ดี
  3. 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 – สอนภาษารัก