K-means clustering เป็นอัลกอริธึมการเรียนรู้แบบ unsupervised ซึ่งจัดกลุ่มข้อมูลตามระยะทางแบบยุคลิดแต่ละจุดไปยังจุดศูนย์กลางที่เรียกว่า เซนทรอยด์. เซนทรอยด์ถูกกำหนดโดยจุดทั้งหมดที่อยู่ในคลัสเตอร์เดียวกัน อัลกอริทึมจะเลือกจุดสุ่มเป็นเซนทรอยด์ก่อน จากนั้นจึงปรับซ้ำจนกว่าจะมีการบรรจบกันทั้งหมด
สิ่งสำคัญที่ต้องจำไว้เมื่อใช้ K-mean คือจำนวนคลัสเตอร์เป็นไฮเปอร์พารามิเตอร์ ซึ่งจะถูกกำหนดก่อนรันโมเดล
K-mean สามารถใช้งานได้โดยใช้ Scikit-Learn ด้วยโค้ดเพียง 3 บรรทัด Scikit-learn ยังมีวิธีการเพิ่มประสิทธิภาพ centroid อยู่แล้ว กม.++ซึ่งช่วยให้โมเดลมาบรรจบกันเร็วขึ้น
ในการใช้อัลกอริทึมการจัดกลุ่ม K-mean ให้โหลด เพนกวินพาลเมอร์ ชุดข้อมูล เลือกคอลัมน์ที่จะจัดกลุ่ม และใช้ Seaborn เพื่อพล็อตพล็อตแบบกระจายด้วยคลัสเตอร์ที่มีรหัสสี
หมายเหตุ: คุณสามารถดาวน์โหลดชุดข้อมูลได้จากสิ่งนี้ ลิงค์.
มานำเข้าไลบรารีและโหลดชุดข้อมูลของ Penguins กัน ตัดแต่งไปยังคอลัมน์ที่เลือก และวางแถวที่มีข้อมูลที่ขาดหายไป (มีเพียง 2 อันเท่านั้น):
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
df = pd.read_csv('penguins.csv')
print(df.shape)
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)
เราสามารถใช้วิธี Elbow เพื่อบ่งชี้คลัสเตอร์สำหรับข้อมูลของเรา ประกอบด้วยการตีความพล็อตเส้นที่มีรูปทรงศอก จำนวนกลุ่มคือส่วนโค้งศอก แกน x ของแผนภาพคือจำนวนคลัสเตอร์ และแกน y คือผลรวมของคลัสเตอร์ภายใน (WCSS) สำหรับแต่ละจำนวนคลัสเตอร์:
wcss = []
for i in range(1, 11):
clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
clustering.fit(df)
wcss.append(clustering.inertia_)
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);
วิธีข้อศอกระบุว่าข้อมูลของเรามี 2 กลุ่ม ลองพล็อตข้อมูลก่อนและหลังการทำคลัสเตอร์:
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');
ตัวอย่างนี้แสดงให้เห็นว่าวิธี Elbow เป็นเพียงข้อมูลอ้างอิงเมื่อใช้เพื่อเลือกจำนวนคลัสเตอร์ เรารู้อยู่แล้วว่าเรามีนกเพนกวิน 3 ชนิดในชุดข้อมูล แต่ถ้าเราจะกำหนดจำนวนของมันโดยใช้วิธี Elbow ก็จะได้ผลลัพธ์จาก 2 กลุ่ม
เนื่องจากค่า K-mean มีความอ่อนไหวต่อความแปรปรวนของข้อมูล ลองดูที่สถิติเชิงพรรณนาของคอลัมน์ที่เราจัดกลุ่มไว้:
df.describe().T
ผลลัพธ์นี้ใน:
count mean std min 25% 50% 75% max
bill_length_mm 342.0 43.921930 5.459584 32.1 39.225 44.45 48.5 59.6
flipper_length_mm 342.0 200.915205 14.061714 172.0 190.000 197.00 213.0 231.0
สังเกตว่าค่าเฉลี่ยอยู่ไกลจากค่าเบี่ยงเบนมาตรฐาน (std) ซึ่งแสดงถึงความแปรปรวนสูง ลองลดขนาดข้อมูลด้วย Standard Scaler:
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
scaled = ss.fit_transform(df)
ตอนนี้ มาทำซ้ำขั้นตอนวิธี Elbow สำหรับข้อมูลที่ปรับขนาด:
wcss_sc = []
for i in range(1, 11):
clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
clustering_sc.fit(scaled)
wcss_sc.append(clustering_sc.inertia_)
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);
ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!
ครั้งนี้ จำนวนคลัสเตอร์ที่แนะนำคือ 3 เราสามารถพล็อตข้อมูลด้วยป้ายกำกับคลัสเตอร์อีกครั้งพร้อมกับแปลงก่อนหน้าสองแปลงเพื่อเปรียบเทียบ:
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');
เมื่อใช้ K-means Clustering คุณต้องกำหนดจำนวนคลัสเตอร์ล่วงหน้า อย่างที่เราได้เห็นเมื่อใช้วิธีการเลือกของเรา k จำนวนคลัสเตอร์ ผลลัพธ์เป็นเพียงข้อเสนอแนะและอาจได้รับผลกระทบจากปริมาณความแปรปรวนของข้อมูล เป็นสิ่งสำคัญที่ต้องทำการวิเคราะห์เชิงลึกและสร้างแบบจำลองมากกว่าหนึ่งตัวที่มี _k_s ต่างกันเมื่อทำคลัสเตอร์
หากไม่มีการระบุล่วงหน้าว่ามีคลัสเตอร์จำนวนเท่าใดในข้อมูล ให้เห็นภาพ ทดสอบและตีความเพื่อดูว่าผลการจัดกลุ่มมีความสมเหตุสมผลหรือไม่ ถ้าไม่คลัสเตอร์อีกครั้ง นอกจากนี้ ให้ดูที่ตัววัดมากกว่าหนึ่งตัวและยกตัวอย่างโมเดลการจัดกลุ่มที่แตกต่างกัน สำหรับ K-mean ให้ดูที่คะแนนเงาและอาจจะจัดกลุ่มตามลำดับชั้นเพื่อดูว่าผลลัพธ์ยังคงเหมือนเดิมหรือไม่