You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
340 lines
42 KiB
340 lines
42 KiB
# บทนำสู่การทำคลัสเตอร์
|
|
|
|
การทำคลัสเตอร์เป็นประเภทหนึ่งของ [การเรียนรู้แบบไม่ต้องมีผู้สอน](https://wikipedia.org/wiki/Unsupervised_learning) ที่สมมุติว่าชุดข้อมูลไม่มีป้ายกำกับ หรืออินพุตไม่มีการจับคู่กับผลลัพธ์ที่กำหนดไว้ล่วงหน้า ใช้อัลกอริธึมต่าง ๆ เพื่อจัดเรียงข้อมูลที่ไม่มีป้ายกำกับและจัดกลุ่มตามรูปแบบที่มันวิเคราะห์พบในข้อมูล
|
|
|
|
[](https://youtu.be/ty2advRiWJM "No One Like You by PSquare")
|
|
|
|
> 🎥 คลิกที่รูปภาพด้านบนเพื่อดูวิดีโอ ขณะที่คุณกำลังเรียนรู้แมชชีนเลิร์นนิงด้วยการทำคลัสเตอร์ ขอให้สนุกกับเพลงแนวนิการ์เจียนแดนซ์ฮอลล์ - นี่เป็นเพลงอันดับสูงจากปี 2014 โดย PSquare
|
|
|
|
## [แบบทดสอบก่อนบรรยาย](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
### บทนำ
|
|
|
|
[การทำคลัสเตอร์](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) มีประโยชน์มากสำหรับการสำรวจข้อมูล ลองดูว่ามันช่วยค้นหาแนวโน้มหรือรูปแบบในการบริโภคเพลงของผู้ฟังชาวไนจีเรียได้หรือไม่
|
|
|
|
✅ ใช้เวลาสักครู่คิดเกี่ยวกับการใช้การทำคลัสเตอร์ ในชีวิตจริงการทำคลัสเตอร์เกิดขึ้นเมื่อคุณมีกองผ้าสกปรกและต้องจัดแยกเสื้อผ้าของสมาชิกในครอบครัว 🧦👕👖🩲 ในวิทยาศาสตร์ข้อมูล การทำคลัสเตอร์เกิดขึ้นเมื่อพยายามวิเคราะห์ความชอบของผู้ใช้ หรือกำหนดลักษณะของชุดข้อมูลที่ไม่มีป้ายกำกับการทำคลัสเตอร์ในทางหนึ่งช่วยให้เข้าใจความยุ่งเหยิง เหมือนลิ้นชักใส่ถุงเท้า
|
|
|
|
[](https://youtu.be/esmzYhuFnds "Introduction to Clustering")
|
|
|
|
> 🎥 คลิกที่รูปภาพด้านบนเพื่อดูวิดีโอ: John Guttag จาก MIT แนะนำการทำคลัสเตอร์
|
|
|
|
ในสถานการณ์ทางวิชาชีพ การทำคลัสเตอร์สามารถใช้กำหนดสิ่งต่าง ๆ เช่น การแบ่งส่วนตลาด การกำหนดกลุ่มอายุที่ซื้อสินค้ารายการใด อย่างเช่น อีกการใช้งานคือการตรวจจับความผิดปกติ อาจใช้ตรวจจับการฉ้อโกงจากชุดข้อมูลธุรกรรมบัตรเครดิต หรือคุณอาจใช้การทำคลัสเตอร์เพื่อตรวจหาก้อนเนื้อในชุดการสแกนทางการแพทย์
|
|
|
|
✅ ใช้เวลาคิดสักนาทีว่าคุณอาจเคยพบการทำคลัสเตอร์ใน 'สถานการณ์จริง' ในการธนาคาร อีคอมเมิร์ซ หรือธุรกิจอย่างไร
|
|
|
|
> 🎓 น่าสนใจว่าการวิเคราะห์คลัสเตอร์เริ่มขึ้นในสาขามนุษยวิทยาและจิตวิทยาในทศวรรษ 1930 คุณนึกภาพได้ไหมว่ามันถูกใช้ในรูปแบบใดบ้าง?
|
|
|
|
อีกทางเลือกหนึ่งคือใช้เพื่อจัดกลุ่มผลการค้นหา เช่น แยกลิงก์ช็อปปิ้ง รูปภาพ หรือรีวิว การทำคลัสเตอร์มีประโยชน์เมื่อต้องการลดขนาดชุดข้อมูลขนาดใหญ่และต้องการทำการวิเคราะห์เชิงลึกต่อไป ดังนั้นเทคนิคนี้จึงใช้สำหรับเรียนรู้เกี่ยวกับข้อมูลก่อนสร้างโมเดลอื่นๆ
|
|
|
|
✅ เมื่อข้อมูลถูกจัดเรียงในคลัสเตอร์แล้ว คุณจะกำหนดไอดีคลัสเตอร์ให้ และเทคนิคนี้ช่วยรักษาความเป็นส่วนตัวของชุดข้อมูลคุณสามารถแทนการอ้างถึงจุดข้อมูลด้วยไอดีคลัสเตอร์แทนข้อมูลที่เปิดเผยได้ คุณนึกถึงเหตุผลอื่นที่ใช้ไอดีคลัสเตอร์แทนส่วนอื่น ๆ ของคลัสเตอร์เพื่อระบุตัวตนได้ไหม?
|
|
|
|
เพิ่มพูนความเข้าใจเกี่ยวกับเทคนิคการทำคลัสเตอร์ใน [โมดูลการเรียนรู้](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)
|
|
|
|
## การเริ่มต้นกับการทำคลัสเตอร์
|
|
|
|
[Scikit-learn มีวิธีมากมาย](https://scikit-learn.org/stable/modules/clustering.html) สำหรับทำคลัสเตอร์ ชนิดที่เลือกใช้ขึ้นอยู่กับกรณีการใช้งานของคุณ ตามเอกสารแต่ละวิธีมีข้อดีต่างกัน นี่คือตารางสรุปวิธียอดนิยมใน Scikit-learn และการใช้งานที่เหมาะสม:
|
|
|
|
| ชื่อวิธี | กรณีใช้งาน |
|
|
| :--------------------------- | :--------------------------------------------------------------------- |
|
|
| K-Means | วัตถุประสงค์ทั่วไป, inductive |
|
|
| Affinity propagation | คลัสเตอร์จำนวนมากและไม่เท่ากัน, inductive |
|
|
| Mean-shift | คลัสเตอร์จำนวนมากและไม่เท่ากัน, inductive |
|
|
| Spectral clustering | คลัสเตอร์จำนวนน้อยและเท่าเทียม, transductive |
|
|
| Ward hierarchical clustering | คลัสเตอร์จำนวนมากและมีข้อจำกัด, transductive |
|
|
| Agglomerative clustering | คลัสเตอร์จำนวนมาก, มีข้อจำกัด, ระยะทางไม่เป็นแบบยูคลิด, transductive |
|
|
| DBSCAN | รูปทรงไม่เรียบ, คลัสเตอร์ไม่เท่ากัน, transductive |
|
|
| OPTICS | รูปทรงไม่เรียบ, คลัสเตอร์ไม่เท่ากันซึ่งมีความหนาแน่นไม่เท่ากัน, transductive |
|
|
| Gaussian mixtures | รูปทรงเรียบ, inductive |
|
|
| BIRCH | ชุดข้อมูลใหญ่ที่มีค่าผิดปกติ, inductive |
|
|
|
|
> 🎓 วิธีที่เราสร้างคลัสเตอร์เกี่ยวข้องกับวิธีการรวบรวมจุดข้อมูลเข้ากลุ่มกัน ลองทำความเข้าใจคำศัพท์ต่าง ๆ:
|
|
>
|
|
> 🎓 ['Transductive' กับ 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))
|
|
>
|
|
> การอนุมานแบบ transductive มาจากกรณีฝึกที่สังเกตเห็นซึ่งจับคู่กับกรณีทดสอบเฉพาะเจาะจง ในขณะที่การอนุมานแบบ inductive มาจากกรณีฝึกที่จับคู่กับกฎทั่วไปซึ่งนำไปใช้กับกรณีทดสอบ
|
|
>
|
|
> ตัวอย่าง: สมมติว่าคุณมีชุดข้อมูลที่มีป้ายกำกับบางส่วน บางอย่างเป็น 'แผ่นเสียง' บางอย่างเป็น 'ซีดี' และบางอย่างไม่มีป้าย คุณมีหน้าที่กำหนดป้ายสำหรับข้อมูลที่ไม่มีป้าย หากใช้วิธี inductive คุณจะฝึกโมเดลให้มองหา 'แผ่นเสียง' และ 'ซีดี' แล้วนำป้ายเหล่านั้นไปใช้กับข้อมูลที่ไม่มีป้าย วิธีนี้จะมีปัญหาเมื่อต้องจัดประเภทสิ่งที่เป็น 'เทปคาสเซ็ท' ขณะที่วิธีแบบ transductive จะจัดการข้อมูลที่ไม่รู้จักนี้ได้ดีขึ้นโดยการรวบรวมวัตถุที่คล้ายกันเข้าด้วยกันและระบุป้ายในกลุ่มนั้น เช่น คลัสเตอร์อาจแยกออกเป็น 'สิ่งดนตรีทรงกลม' และ 'สิ่งดนตรีทรงสี่เหลี่ยม'
|
|
>
|
|
> 🎓 ['รูปร่างไม่เรียบ' กับ 'รูปร่างเรียบ'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
|
|
>
|
|
> มาจากคำศัพท์ทางคณิตศาสตร์ รูปร่างไม่เรียบกับรูปร่างเรียบหมายถึงการวัดระยะห่างระหว่างจุดโดยวิธีรูปร่าง 'เรียบ' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) หรือ 'ไม่เรียบ' (non-Euclidean)
|
|
>
|
|
> 'รูปร่างเรียบ' ในที่นี้หมายถึงเรขาคณิตยูคลิด (ซึ่งส่วนหนึ่งสอนเป็น 'เรขาคณิตระนาบ') และ 'รูปร่างไม่เรียบ' หมายถึงเรขาคณิตแบบไม่ใช่ยูคลิด แล้วเรขาคณิตเกี่ยวข้องกับแมชชีนเลิร์นนิงอย่างไร? เนื่องจากทั้งสองศาสตร์นี้มีรากฐานจากคณิตศาสตร์ จึงต้องมีวิธีวัดระยะห่างระหว่างจุดในคลัสเตอร์ที่เหมาะสม โดยวิธี 'เรียบ' หรือ 'ไม่เรียบ' ขึ้นอยู่กับลักษณะของข้อมูล [ระยะห่างแบบยูคลิด](https://wikipedia.org/wiki/Euclidean_distance) วัดโดยความยาวเส้นตรงระหว่างจุดสองจุด ขณะที่ [ระยะห่างแบบไม่ใช่ยูคลิด](https://wikipedia.org/wiki/Non-Euclidean_geometry) วัดบนเส้นโค้ง หากข้อมูลของคุณเมื่อแสดงภาพแล้วดูเหมือนไม่อยู่บนระนาบ อาจต้องใช้อัลกอริธึมเฉพาะมาแก้ไข
|
|
>
|
|

|
|
> แผนภูมิภาพโดย [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
|
>
|
|
> 🎓 ['ระยะห่าง'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
|
|
>
|
|
> คลัสเตอร์ถูกกำหนดโดยเมทริกซ์ระยะห่าง เช่น ระยะห่างระหว่างจุด ซึ่งสามารถวัดได้หลากหลายวิธี คลัสเตอร์แบบยูคลิดกำหนดโดยค่าเฉลี่ยของค่าจุด และมี 'จุดศูนย์กลาง' หรือเซ็นทรอยด์ ระยะห่างจึงวัดจากจุดศูนย์กลางนี้ ส่วนระยะห่างแบบไม่ใช่ยูคลิดอ้างถึง 'คลัสโตรยด์' ซึ่งเป็นจุดที่ใกล้กับจุดอื่นมากที่สุด คลัสโตรยด์สามารถกำหนดได้หลายวิธี
|
|
>
|
|
> 🎓 ['มีข้อจำกัด'](https://wikipedia.org/wiki/Constrained_clustering)
|
|
>
|
|
> [การทำคลัสเตอร์ที่มีข้อจำกัด](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) คือการนำการเรียนรู้กึ่งมีผู้สอนมาใช้ในวิธีแบบไม่มีผู้สอน ความสัมพันธ์ระหว่างจุดถูกกำหนดว่า 'ไม่สามารถเชื่อมโยง' หรือ 'ต้องเชื่อมโยง' เพื่อบังคับกฎบางอย่างกับชุดข้อมูล
|
|
>
|
|
> ตัวอย่าง: หากปล่อยให้อัลกอริธึมทำงานอย่างอิสระบนชุดข้อมูลที่ไม่มีป้ายหรือกึ่งมีป้าย คุณภาพคลัสเตอร์ที่ได้อาจต่ำ ได้คลัสเตอร์กลุ่ม 'สิ่งดนตรีทรงกลม' 'สิ่งดนตรีทรงสี่เหลี่ยม' 'สิ่งทรงสามเหลี่ยม' และ 'คุกกี้' หากมีข้อจำกัดหรือกฎ ("วัตถุต้องทำจากพลาสติก", "วัตถุต้องสามารถทำดนตรีได้") จะช่วยให้อัลกอริธึมเลือกทำงานได้ดีขึ้น
|
|
>
|
|
> 🎓 'ความหนาแน่น'
|
|
>
|
|
> ข้อมูลที่ 'มีเสียงรบกวน' ถือว่ามีความหนาแน่น ระยะห่างระหว่างจุดในคลัสเตอร์อาจแตกต่างกันและต้องวิเคราะห์ด้วยวิธีการทำคลัสเตอร์ที่เหมาะสม [บทความนี้](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) ชี้ให้เห็นความแตกต่างระหว่างการใช้ K-Means กับ HDBSCAN ในการสำรวจชุดข้อมูลที่มีเสียงรบกวนและความหนาแน่นในคลัสเตอร์ไม่เท่ากัน
|
|
|
|
## อัลกอริธึมการทำคลัสเตอร์
|
|
|
|
มีอัลกอริธึมการทำคลัสเตอร์มากกว่า 100 แบบ และการใช้งานขึ้นอยู่กับลักษณะของข้อมูล ลองพูดถึงอัลกอริธึมหลักๆ บางตัว:
|
|
|
|
- **การทำคลัสเตอร์แบบลำดับชั้น (Hierarchical clustering)** หากวัตถุถูกจัดกลุ่มโดยพิจารณาระยะห่างกับวัตถุใกล้เคียงแทนที่จะกับวัตถุที่อยู่ไกลกว่าสร้างคลัสเตอร์ขึ้นตามระยะห่างระหว่างสมาชิก Scikit-learn ใช้การทำคลัสเตอร์แบบ agglomerative ซึ่งเป็นแบบลำดับชั้น
|
|
|
|

|
|
> แผนภูมิภาพโดย [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
|
|
|
- **การทำคลัสเตอร์แบบเซ็นทรอยด์ (Centroid clustering)** อัลกอริธึมยอดนิยมที่ต้องเลือก 'k' หรือจำนวนคลัสเตอร์ที่จะสร้าง หลังจากนั้นอัลกอริธึมจะกำหนดจุดศูนย์กลางของคลัสเตอร์และรวบรวมข้อมูลรอบๆ จุดนั้น [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) เป็นเวอร์ชันยอดนิยมของการทำคลัสเตอร์แบบเซ็นทรอยด์ เซ็นทรอยด์ถูกกำหนดโดยค่าเฉลี่ยที่ใกล้ที่สุด ชื่อก็จึงมาจากตรงนี้ ระยะห่างกำหนดโดยระยะห่างยกกำลังสองจากคลัสเตอร์จะถูกลดให้น้อยที่สุด
|
|
|
|

|
|
> แผนภูมิภาพโดย [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
|
|
|
- **การทำคลัสเตอร์แบบฐานะการกระจายตัว (Distribution-based clustering)** โดยอิงจากการจำลองทางสถิติ มุ่งเน้นการกำหนดความน่าจะเป็นที่จุดข้อมูลจะอยู่ในคลัสเตอร์ และกำหนดสมาชิกตามนั้น วิธี Gaussian mixture อยู่ในประเภทนี้
|
|
|
|
- **การทำคลัสเตอร์แบบฐานะความหนาแน่น (Density-based clustering)** จุดข้อมูลถูกจัดกลุ่มตามความหนาแน่นหรือการรวมตัวกันของพวกมัน จุดที่อยู่ห่างจากกลุ่มถือเป็นค่าผิดปกติหรือเสียงรบกวน DBSCAN, Mean-shift และ OPTICS อยู่ในประเภทนี้
|
|
|
|
- **การทำคลัสเตอร์แบบตาราง (Grid-based clustering)** สำหรับชุดข้อมูลหลายมิติ จะสร้างตาราง และแบ่งข้อมูลลงในเซลล์ของตารางเพื่อสร้างคลัสเตอร์
|
|
|
|
## แบบฝึกหัด - ทำคลัสเตอร์ข้อมูลของคุณ
|
|
|
|
การทำคลัสเตอร์ในฐานะเทคนิคได้รับการช่วยเหลืออย่างมากจากการแสดงผลภาพ ดังนั้นเรามาเริ่มต้นด้วยการแสดงผลข้อมูลเพลงของเรา แบบฝึกหัดนี้จะช่วยเราเลือกวิธีการทำคลัสเตอร์ที่เหมาะสมกับลักษณะข้อมูลนี้มากที่สุด
|
|
|
|
1. เปิดไฟล์ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) ในโฟลเดอร์นี้
|
|
|
|
1. นำเข้าแพ็กเกจ `Seaborn` เพื่อการแสดงผลข้อมูลที่ดี
|
|
|
|
```python
|
|
!pip install seaborn
|
|
```
|
|
|
|
1. เพิ่มข้อมูลเพลงจาก [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv) โหลด dataframe ที่มีข้อมูลเพลง เตรียมพร้อมสำรวจข้อมูลนี้โดยนำเข้าไลบรารีและแสดงข้อมูลออกมา:
|
|
|
|
```python
|
|
import matplotlib.pyplot as plt
|
|
import pandas as pd
|
|
|
|
df = pd.read_csv("../data/nigerian-songs.csv")
|
|
df.head()
|
|
```
|
|
|
|
ตรวจสอบข้อมูลแถวแรกๆ:
|
|
|
|
| | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
|
|
| --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- |
|
|
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
|
|
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
|
|
| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
|
|
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
|
|
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
|
|
|
|
1. รับข้อมูลบางอย่างเกี่ยวกับ dataframe โดยเรียกใช้ `info()`:
|
|
|
|
```python
|
|
df.info()
|
|
```
|
|
|
|
ผลลัพธ์จะดูเหมือนนี้:
|
|
|
|
```output
|
|
<class 'pandas.core.frame.DataFrame'>
|
|
RangeIndex: 530 entries, 0 to 529
|
|
Data columns (total 16 columns):
|
|
# Column Non-Null Count Dtype
|
|
--- ------ -------------- -----
|
|
0 name 530 non-null object
|
|
1 album 530 non-null object
|
|
2 artist 530 non-null object
|
|
3 artist_top_genre 530 non-null object
|
|
4 release_date 530 non-null int64
|
|
5 length 530 non-null int64
|
|
6 popularity 530 non-null int64
|
|
7 danceability 530 non-null float64
|
|
8 acousticness 530 non-null float64
|
|
9 energy 530 non-null float64
|
|
10 instrumentalness 530 non-null float64
|
|
11 liveness 530 non-null float64
|
|
12 loudness 530 non-null float64
|
|
13 speechiness 530 non-null float64
|
|
14 tempo 530 non-null float64
|
|
15 time_signature 530 non-null int64
|
|
dtypes: float64(8), int64(4), object(4)
|
|
memory usage: 66.4+ KB
|
|
```
|
|
|
|
1. ตรวจสอบค่าที่หายไปอีกครั้งด้วยการเรียกใช้ `isnull()` และตรวจสอบผลรวมว่าคือ 0:
|
|
|
|
```python
|
|
df.isnull().sum()
|
|
```
|
|
|
|
ดูดีมาก:
|
|
|
|
```output
|
|
name 0
|
|
album 0
|
|
artist 0
|
|
artist_top_genre 0
|
|
release_date 0
|
|
length 0
|
|
popularity 0
|
|
danceability 0
|
|
acousticness 0
|
|
energy 0
|
|
instrumentalness 0
|
|
liveness 0
|
|
loudness 0
|
|
speechiness 0
|
|
tempo 0
|
|
time_signature 0
|
|
dtype: int64
|
|
```
|
|
|
|
1. อธิบายข้อมูล:
|
|
|
|
```python
|
|
df.describe()
|
|
```
|
|
|
|
| | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
|
|
| ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
|
|
| count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
|
|
| mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
|
|
| std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
|
|
| min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
|
|
| 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
|
|
| 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
|
|
| 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
|
|
| max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 |
|
|
|
|
> 🤔 ถ้าเรากำลังทำงานกับการจัดกลุ่ม (clustering) ซึ่งเป็นวิธีการแบบไม่มีผู้สอน (unsupervised) ที่ไม่จำเป็นต้องใช้ข้อมูลที่มีป้ายกำกับ (labeled data) ทำไมเราถึงแสดงข้อมูลนี้พร้อมกับป้ายกำกับ? ในขั้นตอนการสำรวจข้อมูล ป้ายกำกับเหล่านี้มีประโยชน์ แต่ไม่ได้จำเป็นสำหรับอัลกอริทึมการจัดกลุ่มที่จะทำงาน คุณอาจแค่ลบหัวคอลัมน์แล้วอ้างอิงข้อมูลด้วยหมายเลขคอลัมน์แทนก็ได้
|
|
|
|
ดูค่าทั่วไปของข้อมูล โปรดสังเกตว่า popularity อาจเป็น '0' ซึ่งแสดงถึงเพลงที่ยังไม่มีการจัดอันดับ เราจะลบข้อมูลเหล่านี้ในไม่ช้า
|
|
|
|
1. ใช้กราฟแท่ง (barplot) เพื่อค้นหาแนวเพลงที่ได้รับความนิยมมากที่สุด:
|
|
|
|
```python
|
|
import seaborn as sns
|
|
|
|
top = df['artist_top_genre'].value_counts()
|
|
plt.figure(figsize=(10,7))
|
|
sns.barplot(x=top[:5].index,y=top[:5].values)
|
|
plt.xticks(rotation=45)
|
|
plt.title('Top genres',color = 'blue')
|
|
```
|
|
|
|

|
|
|
|
✅ หากคุณต้องการดูค่าท็อปมากกว่านี้ ให้เปลี่ยน `[:5]` เป็นค่ามากขึ้น หรือจะลบออกเพื่อดูทั้งหมด
|
|
|
|
โปรดทราบว่าเมื่อแนวเพลงท็อปถูกระบุว่าเป็น 'Missing' หมายความว่า Spotify ไม่ได้จัดประเภทให้ ดังนั้นเราจะลบออก
|
|
|
|
1. ลบข้อมูลที่หายไปโดยการกรองออก
|
|
|
|
```python
|
|
df = df[df['artist_top_genre'] != 'Missing']
|
|
top = df['artist_top_genre'].value_counts()
|
|
plt.figure(figsize=(10,7))
|
|
sns.barplot(x=top.index,y=top.values)
|
|
plt.xticks(rotation=45)
|
|
plt.title('Top genres',color = 'blue')
|
|
```
|
|
|
|
ตอนนี้ตรวจสอบแนวเพลงอีกครั้ง:
|
|
|
|

|
|
|
|
1. โดยรวมแล้ว สามแนวเพลงที่ครองชุดข้อมูลนี้ ได้แก่ `afro dancehall`, `afropop`, และ `nigerian pop` ให้โฟกัสที่แนวเพลงเหล่านี้ และกรองชุดข้อมูลเพื่อเอาข้อมูลที่มีค่า popularity เป็น 0 ออก (ซึ่งหมายถึงไม่ได้ถูกจัดประเภทด้วยค่า popularity ในชุดข้อมูลนี้ และสามารถถือเป็นสัญญาณรบกวนสำหรับวัตถุประสงค์ของเรา):
|
|
|
|
```python
|
|
df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
|
|
df = df[(df['popularity'] > 0)]
|
|
top = df['artist_top_genre'].value_counts()
|
|
plt.figure(figsize=(10,7))
|
|
sns.barplot(x=top.index,y=top.values)
|
|
plt.xticks(rotation=45)
|
|
plt.title('Top genres',color = 'blue')
|
|
```
|
|
|
|
1. ทดสอบอย่างรวดเร็วเพื่อตรวจสอบว่าข้อมูลมีความสัมพันธ์ในรูปแบบที่แข็งแรงเป็นพิเศษหรือไม่:
|
|
|
|
```python
|
|
corrmat = df.corr(numeric_only=True)
|
|
f, ax = plt.subplots(figsize=(12, 9))
|
|
sns.heatmap(corrmat, vmax=.8, square=True)
|
|
```
|
|
|
|

|
|
|
|
ความสัมพันธ์ที่แข็งแรงเพียงอย่างเดียวคือระหว่าง `energy` และ `loudness` ซึ่งไม่แปลกใจนัก เพราะเพลงที่เสียงดังมักจะมีพลังงานสูง นอกเหนือจากนี้ ความสัมพันธ์ค่อนข้างอ่อน มันจะน่าสนใจที่จะดูว่าสิ่งที่อัลกอริทึมการจัดกลุ่มสามารถทำได้กับข้อมูลนี้
|
|
|
|
> 🎓 โปรดทราบว่าความสัมพันธ์ไม่ได้บ่งชี้ถึงสาเหตุ! เรามีหลักฐานความสัมพันธ์แต่ไม่มีหลักฐานว่าสาเหตุเป็นไปตามนั้น เว็บไซต์ [ผลงานขำขัน](https://tylervigen.com/spurious-correlations) แสดงภาพที่เน้นจุดนี้
|
|
|
|
ในชุดข้อมูลนี้ มีการบรรจบกันในเรื่องความนิยมและความสามารถในการเต้นของเพลงหรือไม่? FacetGrid แสดงให้เห็นว่ามีวงกลมรอบศูนย์กลางที่ตรงกันโดยไม่ขึ้นกับแนวเพลง อาจเป็นไปได้ว่าความชอบของชาวไนจีเรียบรรจบกันที่ระดับความสามารถในการเต้นระดับหนึ่งสำหรับแนวเพลงนี้หรือเปล่า?
|
|
|
|
✅ ทดลองจุดข้อมูลต่าง ๆ (energy, loudness, speechiness) และแนวเพลงที่มากกว่าหรือแตกต่างกัน คุณจะค้นพบอะไร? ดูตาราง `df.describe()` เพื่อดูการกระจายทั่วไปของจุดข้อมูล
|
|
|
|
### แบบฝึกหัด - การกระจายของข้อมูล
|
|
|
|
แนวเพลงทั้งสามนี้แตกต่างกันอย่างมีนัยสำคัญในความรู้สึกเรื่องความสามารถในการเต้นหรือไม่ ขึ้นอยู่กับความนิยมของพวกเขา?
|
|
|
|
1. ตรวจสอบการกระจายข้อมูลของสามแนวเพลงท็อปในเรื่องของความนิยมและความสามารถในการเต้นตลอดแกนนอนและแกนตั้งที่กำหนด
|
|
|
|
```python
|
|
sns.set_theme(style="ticks")
|
|
|
|
g = sns.jointplot(
|
|
data=df,
|
|
x="popularity", y="danceability", hue="artist_top_genre",
|
|
kind="kde",
|
|
)
|
|
```
|
|
|
|
คุณจะค้นพบวงกลมรอบศูนย์กลางที่แนวร่วมแสดงการกระจายของจุดข้อมูล
|
|
|
|
> 🎓 โปรดทราบว่านี่คือตัวอย่างที่ใช้กราฟ KDE (Kernel Density Estimate) ซึ่งเป็นกราฟความหนาแน่นของความน่าจะเป็นแบบต่อเนื่อง ซึ่งช่วยให้เราแปรผลข้อมูลเมื่อทำงานกับหลายการกระจาย
|
|
|
|
โดยทั่วไปทั้งสามแนวเพลงจัดกลุ่มได้อย่างไม่เข้มงวดในแง่ของความนิยมและความสามารถในการเต้น การกำหนดกลุ่มในข้อมูลที่จัดวางไม่เข้มงวดนี้จะเป็นความท้าทาย:
|
|
|
|

|
|
|
|
1. สร้างกราฟกระจาย:
|
|
|
|
```python
|
|
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
|
|
.map(plt.scatter, "popularity", "danceability") \
|
|
.add_legend()
|
|
```
|
|
|
|
กราฟกระจายของแกนเดียวกันแสดงรูปแบบการบรรจบกันในลักษณะคล้ายกัน
|
|
|
|

|
|
|
|
โดยทั่วไป สำหรับการจัดกลุ่ม คุณสามารถใช้กราฟกระจายเพื่อแสดงกลุ่มข้อมูลได้ ดังนั้นการควบคุมการสร้างภาพประเภทนี้จึงมีประโยชน์มาก บทเรียนถัดไปเราจะใช้ข้อมูลที่กรองนี้และใช้การจัดกลุ่มแบบ k-means เพื่อค้นหากลุ่มในข้อมูลนี้ที่ดูเหมือนจะทับซ้อนกันในรูปแบบที่น่าสนใจ
|
|
|
|
---
|
|
|
|
## 🚀ความท้าทาย
|
|
|
|
เพื่อเตรียมพร้อมสำหรับบทเรียนถัดไป สร้างแผนภูมิอธิบายอัลกอริทึมการจัดกลุ่มต่าง ๆ ที่คุณอาจค้นพบและใช้ในสภาพแวดล้อมการผลิต อัลกอริทึมการจัดกลุ่มเหล่านี้พยายามแก้ปัญหาอะไร?
|
|
|
|
## [แบบทดสอบหลังบทเรียน](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
## ทบทวน & ศึกษาด้วยตนเอง
|
|
|
|
ก่อนที่คุณจะประยุกต์ใช้อัลกอริทึมการจัดกลุ่ม อย่างที่เราได้เรียนรู้ เป็นความคิดที่ดีที่จะเข้าใจลักษณะของชุดข้อมูลของคุณ อ่านเพิ่มเติมในหัวข้อนี้ [ที่นี่](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
|
|
|
|
[บทความที่เป็นประโยชน์นี้](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) จะอธิบายวิธีการต่าง ๆ ที่อัลกอริทึมการจัดกลุ่มมีพฤติกรรมแตกต่างกัน ตามรูปร่างข้อมูลที่แตกต่างกัน
|
|
|
|
## การบ้าน
|
|
|
|
[ค้นคว้าการแสดงผลภาพเพิ่มเติมสำหรับการจัดกลุ่ม](assignment.md)
|
|
|
|
---
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
**ปฏิเสธความรับผิดชอบ**:
|
|
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |