Scikit Learn - วิธีการจัดกลุ่ม

ที่นี่เราจะศึกษาเกี่ยวกับวิธีการจัดกลุ่มใน Sklearn ซึ่งจะช่วยในการระบุความคล้ายคลึงกันในตัวอย่างข้อมูล

วิธีการจัดกลุ่มซึ่งเป็นวิธี ML ที่ไม่ได้รับการดูแลที่มีประโยชน์มากที่สุดวิธีหนึ่งที่ใช้ในการค้นหารูปแบบความเหมือนและความสัมพันธ์ระหว่างตัวอย่างข้อมูล หลังจากนั้นจะรวมกลุ่มตัวอย่างเหล่านั้นเป็นกลุ่มที่มีความคล้ายคลึงกันตามคุณลักษณะต่างๆ การทำคลัสเตอร์จะกำหนดการจัดกลุ่มภายในระหว่างข้อมูลที่ไม่มีป้ายกำกับในปัจจุบันนั่นเป็นเหตุผลว่าทำไมจึงมีความสำคัญ

ห้องสมุด Scikit-learn มี sklearn.clusterเพื่อดำเนินการจัดกลุ่มข้อมูลที่ไม่มีป้ายกำกับ ภายใต้โมดูลนี้ scikit-leran มีวิธีการทำคลัสเตอร์ดังต่อไปนี้ -

KMeans

อัลกอริทึมนี้จะคำนวณเซนทรอยด์และทำซ้ำจนกว่าจะพบเซนทรอยด์ที่เหมาะสมที่สุด ต้องมีการระบุจำนวนคลัสเตอร์นั่นจึงถือว่าเป็นที่รู้จักแล้ว ตรรกะหลักของอัลกอริทึมนี้คือการจัดกลุ่มข้อมูลที่แยกตัวอย่างใน n จำนวนกลุ่มที่มีความแปรปรวนเท่ากันโดยการลดเกณฑ์ที่เรียกว่าความเฉื่อย จำนวนคลัสเตอร์ที่ระบุโดยอัลกอริทึมแสดงโดย 'K

Scikit-learn มี sklearn.cluster.KMeansโมดูลเพื่อดำเนินการคลัสเตอร์ K-Means ในขณะที่คำนวณคลัสเตอร์ศูนย์และค่าของความเฉื่อยพารามิเตอร์ที่ชื่อsample_weight อนุญาต sklearn.cluster.KMeans โมดูลเพื่อกำหนดน้ำหนักให้กับตัวอย่างบางส่วนมากขึ้น

การแพร่กระจายความสนใจ

อัลกอริทึมนี้ขึ้นอยู่กับแนวคิดของ 'การส่งผ่านข้อความ' ระหว่างคู่ต่างๆของตัวอย่างจนถึงการบรรจบกัน ไม่จำเป็นต้องระบุจำนวนคลัสเตอร์ก่อนรันอัลกอริทึม อัลกอริทึมมีความซับซ้อนของเวลาของคำสั่ง (2) ซึ่งเป็นข้อเสียที่ใหญ่ที่สุดของมัน

Scikit-learn มี sklearn.cluster.AffinityPropagation โมดูลเพื่อดำเนินการคลัสเตอร์ Affinity Propagation

ค่าเฉลี่ยกะ

อัลกอริทึมนี้ส่วนใหญ่ค้นพบ blobsในความหนาแน่นของตัวอย่างที่ราบรื่น กำหนดจุดข้อมูลให้กับคลัสเตอร์ซ้ำ ๆ โดยการเปลี่ยนจุดไปยังความหนาแน่นสูงสุดของดาต้าพอยต์ แทนที่จะอาศัยพารามิเตอร์ชื่อbandwidth การกำหนดขนาดของพื้นที่ที่ต้องการค้นหาจะกำหนดจำนวนคลัสเตอร์โดยอัตโนมัติ

Scikit-learn มี sklearn.cluster.MeanShift โมดูลเพื่อดำเนินการคลัสเตอร์ Mean Shift

การจัดกลุ่มสเปกตรัม

ก่อนที่จะจัดกลุ่มอัลกอริทึมนี้โดยพื้นฐานแล้วจะใช้ค่าลักษณะเฉพาะเช่นสเปกตรัมของเมทริกซ์ความคล้ายคลึงกันของข้อมูลเพื่อทำการลดขนาดในมิติที่น้อยลง ไม่แนะนำให้ใช้อัลกอริทึมนี้เมื่อมีคลัสเตอร์จำนวนมาก

Scikit-learn มี sklearn.cluster.SpectralClustering โมดูลเพื่อดำเนินการจัดกลุ่มสเปกตรัม

การจัดกลุ่มตามลำดับชั้น

อัลกอริทึมนี้สร้างคลัสเตอร์ที่ซ้อนกันโดยการรวมหรือแยกคลัสเตอร์อย่างต่อเนื่อง ลำดับชั้นของคลัสเตอร์นี้แสดงเป็นต้นไม้ dendrogram ie แบ่งออกเป็นสองประเภทดังต่อไปนี้ -

Agglomerative hierarchical algorithms- ในอัลกอริธึมแบบลำดับชั้นประเภทนี้จุดข้อมูลทุกจุดจะถือว่าเป็นคลัสเตอร์เดียว จากนั้นจะรวมกลุ่มของกระจุกดาวคู่อย่างต่อเนื่อง สิ่งนี้ใช้วิธีการจากล่างขึ้นบน

Divisive hierarchical algorithms- ในอัลกอริทึมแบบลำดับชั้นนี้จุดข้อมูลทั้งหมดจะถือว่าเป็นคลัสเตอร์ใหญ่กลุ่มเดียว ในกระบวนการจัดกลุ่มนี้เกี่ยวข้องกับการแบ่งโดยใช้วิธีการจากบนลงล่างกลุ่มใหญ่กลุ่มหนึ่งออกเป็นคลัสเตอร์ขนาดเล็กต่างๆ

Scikit-learn มี sklearn.cluster.AgglomerativeClustering โมดูลเพื่อดำเนินการจัดกลุ่มตามลำดับชั้นแบบ Agglomerative

DBSCAN

ย่อมาจาก “Density-based spatial clustering of applications with noise”. อัลกอริทึมนี้อิงตามแนวคิดที่ใช้งานง่ายของ "คลัสเตอร์" และ "สัญญาณรบกวน" ที่คลัสเตอร์เป็นบริเวณที่หนาแน่นและมีความหนาแน่นต่ำกว่าในพื้นที่ข้อมูลคั่นด้วยพื้นที่ที่มีความหนาแน่นต่ำกว่าของจุดข้อมูล

Scikit-learn มี sklearn.cluster.DBSCANโมดูลเพื่อดำเนินการทำคลัสเตอร์ DBSCAN มีพารามิเตอร์ที่สำคัญสองพารามิเตอร์ ได้แก่ min_samples และ eps ที่อัลกอริทึมนี้ใช้เพื่อกำหนดความหนาแน่น

ค่าพารามิเตอร์ที่สูงขึ้น min_samples หรือค่าต่ำกว่าของพารามิเตอร์ eps จะให้ข้อบ่งชี้เกี่ยวกับความหนาแน่นของจุดข้อมูลที่สูงขึ้นซึ่งจำเป็นในการสร้างคลัสเตอร์

OPTICS

ย่อมาจาก “Ordering points to identify the clustering structure”. อัลกอริทึมนี้ยังค้นหาคลัสเตอร์ตามความหนาแน่นในข้อมูลเชิงพื้นที่ ตรรกะการทำงานพื้นฐานเหมือน DBSCAN

กล่าวถึงจุดอ่อนที่สำคัญของอัลกอริทึม DBSCAN ซึ่งเป็นปัญหาในการตรวจจับคลัสเตอร์ที่มีความหมายในข้อมูลที่มีความหนาแน่นแตกต่างกันโดยการจัดลำดับจุดของฐานข้อมูลในลักษณะที่จุดที่ใกล้เคียงที่สุดในเชิงพื้นที่กลายเป็นเพื่อนบ้านในการสั่งซื้อ

Scikit-learn มี sklearn.cluster.OPTICS โมดูลเพื่อดำเนินการคลัสเตอร์ OPTICS

ไม้เรียว

ย่อมาจาก Balanced ซ้ำการลดและการทำคลัสเตอร์โดยใช้ลำดับชั้น ใช้เพื่อทำการคลัสเตอร์แบบลำดับชั้นบนชุดข้อมูลขนาดใหญ่ มันสร้างต้นไม้ชื่อCFT กล่าวคือ Characteristics Feature Treeสำหรับข้อมูลที่ระบุ

ข้อดีของ CFT คือโหนดข้อมูลที่เรียกว่าโหนด CF (คุณลักษณะคุณลักษณะ) เก็บข้อมูลที่จำเป็นสำหรับการทำคลัสเตอร์ซึ่งจะช่วยป้องกันไม่ให้ต้องเก็บข้อมูลอินพุตทั้งหมดไว้ในหน่วยความจำ

Scikit-learn มี sklearn.cluster.Birch โมดูลเพื่อดำเนินการทำคลัสเตอร์ BIRCH

การเปรียบเทียบอัลกอริทึมการทำคลัสเตอร์

ตารางต่อไปนี้จะให้การเปรียบเทียบ (ตามพารามิเตอร์ความสามารถในการปรับขนาดและเมตริก) ของอัลกอริทึมการทำคลัสเตอร์ใน scikit-learn

ซีเนียร์ No ชื่ออัลกอริทึม พารามิเตอร์ ความสามารถในการปรับขนาด เมตริกที่ใช้
1 K- หมายถึง จำนวนคลัสเตอร์ ตัวอย่างขนาดใหญ่มาก ระยะห่างระหว่างจุด
2 การแพร่กระจายความสนใจ การทำให้หมาด ๆ ไม่สามารถปรับขนาดได้ด้วย n_samples ระยะกราฟ
3 ค่าเฉลี่ยกะ แบนด์วิดท์ ไม่สามารถปรับขนาดได้ด้วย n_samples ระยะห่างระหว่างจุด
4 การจัดกลุ่มสเปกตรัม จำนวนคลัสเตอร์ ความสามารถในการปรับขนาดได้ปานกลางด้วย n_samples ความสามารถในการปรับขนาดได้เล็กน้อยด้วย n_clusters ระยะกราฟ
5 การจัดกลุ่มตามลำดับชั้น เกณฑ์ระยะทางหรือจำนวนคลัสเตอร์ กลุ่มตัวอย่างขนาดใหญ่ n_clusters ขนาดใหญ่ ระยะห่างระหว่างจุด
6 DBSCAN ขนาดพื้นที่ใกล้เคียง n_samples ขนาดใหญ่มากและ n_clusters ขนาดกลาง ระยะจุดที่ใกล้ที่สุด
7 OPTICS การเป็นสมาชิกคลัสเตอร์ขั้นต่ำ n_samples ขนาดใหญ่มากและ n_clusters ขนาดใหญ่ ระยะห่างระหว่างจุด
8 ไม้เรียว เกณฑ์ปัจจัยการแตกแขนง กลุ่มตัวอย่างขนาดใหญ่ n_clusters ขนาดใหญ่ ระยะห่างแบบยุคลิดระหว่างจุด

K-Means Clustering บนชุดข้อมูล Scikit-learn Digit

ในตัวอย่างนี้เราจะใช้ K-mean clustering กับชุดข้อมูลหลัก อัลกอริทึมนี้จะระบุตัวเลขที่คล้ายกันโดยไม่ต้องใช้ข้อมูลฉลากดั้งเดิม การใช้งานเสร็จสิ้นบนสมุดบันทึก Jupyter

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape

เอาต์พุต

1797, 64)

ผลลัพธ์นี้แสดงให้เห็นว่าชุดข้อมูลหลักมีตัวอย่าง 1797 ตัวอย่างที่มีคุณลักษณะ 64 อย่าง

ตัวอย่าง

ตอนนี้ดำเนินการคลัสเตอร์ K-Means ดังนี้ -

kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape

เอาต์พุต

(10, 64)

ผลลัพธ์นี้แสดงให้เห็นว่าการทำคลัสเตอร์ K-mean สร้าง 10 คลัสเตอร์ที่มีคุณลักษณะ 64

ตัวอย่าง

fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks = [], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)

เอาต์พุต

ผลลัพธ์ด้านล่างมีภาพที่แสดงศูนย์คลัสเตอร์ที่เรียนรู้โดย K-Means Clustering

จากนั้นสคริปต์ Python ด้านล่างจะจับคู่ป้ายกำกับคลัสเตอร์ที่เรียนรู้ (โดย K-Means) กับป้ายกำกับที่แท้จริงที่พบในพวกเขา -

from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]

นอกจากนี้เรายังสามารถตรวจสอบความถูกต้องด้วยความช่วยเหลือของคำสั่งที่กล่าวถึงด้านล่าง

from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)

เอาต์พุต

0.7935447968836951

ตัวอย่างการใช้งานที่สมบูรณ์

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np

from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
   axi.set(xticks=[], yticks = [])
   axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
   mask = (clusters == i)
   labels[mask] = mode(digits.target[mask])[0]
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)