K-Means Clustering ด้วยวิธี Elbow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

K-Means Clustering ด้วยวิธีข้อศอก

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');

K-Means Clustering ด้วยวิธี Elbow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

ตัวอย่างนี้แสดงให้เห็นว่าวิธี 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);

K-Means Clustering ด้วยวิธี Elbow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ 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 ด้วยวิธี Elbow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

เมื่อใช้ K-means Clustering คุณต้องกำหนดจำนวนคลัสเตอร์ล่วงหน้า อย่างที่เราได้เห็นเมื่อใช้วิธีการเลือกของเรา k จำนวนคลัสเตอร์ ผลลัพธ์เป็นเพียงข้อเสนอแนะและอาจได้รับผลกระทบจากปริมาณความแปรปรวนของข้อมูล เป็นสิ่งสำคัญที่ต้องทำการวิเคราะห์เชิงลึกและสร้างแบบจำลองมากกว่าหนึ่งตัวที่มี _k_s ต่างกันเมื่อทำคลัสเตอร์

หากไม่มีการระบุล่วงหน้าว่ามีคลัสเตอร์จำนวนเท่าใดในข้อมูล ให้เห็นภาพ ทดสอบและตีความเพื่อดูว่าผลการจัดกลุ่มมีความสมเหตุสมผลหรือไม่ ถ้าไม่คลัสเตอร์อีกครั้ง นอกจากนี้ ให้ดูที่ตัววัดมากกว่าหนึ่งตัวและยกตัวอย่างโมเดลการจัดกลุ่มที่แตกต่างกัน สำหรับ K-mean ให้ดูที่คะแนนเงาและอาจจะจัดกลุ่มตามลำดับชั้นเพื่อดูว่าผลลัพธ์ยังคงเหมือนเดิมหรือไม่

ประทับเวลา:

เพิ่มเติมจาก สแต็ค