๋น์ง๋ ํ์ต์ด๋?
ํ๊น ๊ฐ์ ์ ์ ์๊ฑฐ๋ ์์ธกํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ตํ๋ ๋ฐฉ๋ฒ
์ง๋ ํ์ต๊ณผ ๋ฌ๋ฆฌ ์ ๋ต(๋ผ๋ฒจ)์ด ์์ผ๋ฉฐ, ๋ฐ์ดํฐ์ ํจํด์ ๋ฐ๊ฒฌํ๊ณ ๊ทธ๋ฃนํํ๋ ๋ฐ ์ด์ ์ ๋ง์ถค
ex) ๊ตฐ์ง, ์ฐจ์์ถ์
1. ๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ (Clustering)
๋น์ทํ ์ํ๋ผ๋ฆฌ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋ ๊ณผ์ , ์ด๋ฅผ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ
ํด๋ฌ์คํฐ: ๊ตฐ์ง์์ ๋ง๋ค์ด์ง ๊ฐ ๊ทธ๋ฃน
K-Means ๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ
K-Means๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, K๊ฐ์ ํด๋ฌ์คํฐ ์ค์ฌ(์ผํธ๋ก์ด๋, Centroid)์ ์๋์ผ๋ก ์ฐพ๋ ๋ฐฉ์
K-Means ์๊ณ ๋ฆฌ์ฆ ์๋ ๋ฐฉ์
- ์์๋ก K๊ฐ์ ํด๋ฌ์คํฐ ์ค์ฌ์ ์ง์
- ๊ฐ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋ฌ์คํฐ ์ค์ฌ์ ํ ๋น
- ํด๋ฌ์คํฐ์ ์ํ ์ํ๋ค์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ์ฌ ์๋ก์ด ํด๋ฌ์คํฐ ์ค์ฌ์ ๊ฐฑ์
- ํด๋ฌ์คํฐ ์ค์ฌ์ด ๋ ์ด์ ๋ณํํ์ง ์์ ๋๊น์ง 2~3๋จ๊ณ๋ฅผ ๋ฐ๋ณต
์ฌ์ดํท๋ฐ์ ํ์ฉํ K-Means ๊ตฌํ
from sklearn.cluster import KMeans
# KMeans ๋ชจ๋ธ ์์ฑ: ํด๋ฌ์คํฐ ๊ฐ์ 3๊ฐ, ๋๋ค ์๋ ์ค์
km = KMeans(n_clusters=3, random_state=42)
km.fit(X)
# ํด๋ฌ์คํฐ ์ค์ฌ ํ์ธ
print(km.cluster_centers_)
- cluster_centers_: K๊ฐ์ ํด๋ฌ์คํฐ ์ค์ฌ์ ๋ฐํ
ํด๋ฌ์คํฐ ๊ฐ์(K) ์ ํ: ์๋ณด์ฐ ๋ฐฉ๋ฒ, K๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด์ผ ํ๋ ๊ฒ์ด K-Means์ ๋จ์ ์ด๋ค.
์ต์ ์ K๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ์๋ณด์ฐ ๋ฐฉ๋ฒ
- ์ด๋์ (Inertia): ํด๋ฌ์คํฐ ์ค์ฌ๊ณผ ์ํ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ์ ๊ณฑํฉ. ํด๋ฌ์คํฐ ๊ฐ์๊ฐ ๋์ด๋๋ฉด ์ด๋์ ๊ฐ์ด ๊ฐ์ํ๋ค.
- ์๋ณด์ฐ ์ง์ : ์ด๋์
๊ฐ์ด ๊ธ๊ฒฉํ ์ค์ด๋ค๋ค๊ฐ ์๋งํด์ง๋ K ์ง์ ์ ์ฐพ๋๋ค.
์๋ณด์ฐ ๋ฐฉ๋ฒ ๊ตฌํ
import matplotlib.pyplot as plt
inertia = []
K_range = range(1, 11)
for k in K_range:
km = KMeans(n_clusters=k, random_state=42)
km.fit(X)
inertia.append(km.inertia_)
plt.plot(K_range, inertia, marker='o')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method for Optimal K')
plt.show()
๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ ๋น๊ต
์๊ณ ๋ฆฌ์ฆ | ํน์ง | ์ฅ์ | ๋จ์ |
K-Means | K๊ฐ์ ์ค์ฌ์ ๊ธฐ์ค์ผ๋ก ์ํ์ ๋ฐฐ์ | ๋น ๋ฅด๊ณ ํจ์จ์ | K๊ฐ์ ๋ฏธ๋ฆฌ ์ง์ ํด์ผ ํจ |
๊ณ์ธต์ ๊ตฐ์ง | ํธ๋ฆฌ ๊ตฌ์กฐ(๋ด๋๋ก๊ทธ๋จ)๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฐ์ง ํ์ฑ | ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๋ถ์ ๊ฐ๋ฅ | ๊ณ์ฐ๋์ด ๋ง์ |
DBSCAN | ๋ฐ์ง๋๊ฐ ๋์ ์ง์ญ์ ํด๋ฌ์คํฐ๋ก ์ ์ | ์ด์์น(๋ ธ์ด์ฆ)์ ๊ฐํจ | ํด๋ฌ์คํฐ ๊ฐ์๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ํ ํ์ ์์, ํ์ง๋ง ๋งค๊ฐ๋ณ์ ์กฐ์ ์ด ํ์ |
2. ์ฐจ์ ์ถ์
๋ฐ์ดํฐ์ ์ค์ํ ํน์ฑ์ ์ ์งํ๋ฉด์ ์ฐจ์์ ์ค์ด๋ ๊ธฐ๋ฒ
์ฃผ์ฑ๋ถ ๋ถ์(Principal Component Analysis)
๋ฐ์ดํฐ์ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ์ฐพ์ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐจ์์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฒ
PCA ์๋ ์๋ฆฌ
- ๋ฐ์ดํฐ์์ ๋ถ์ฐ์ด ๊ฐ์ฅ ํฐ ๋ฐฉํฅ(์ฃผ์ฑ๋ถ ๋ฒกํฐ)์ ์ฐพ์
- ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ฑ๋ถ ๋ฒกํฐ์ ํฌ์ํ์ฌ ์ฐจ์์ ์ถ์
- ์ ๋ณด ์์ค์ ์ต์ํํ๋ฉด์ ์ฃผ์ ํน์ฑ์ ์ ์ง
์ฌ๋ก
- ์ด๋ฏธ์ง ์์ถ: ๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ ์ฐจ์์ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ์ ์ฅ ์ฉ๋์ ์ค์ด๊ณ , ๋ณต์ํ ๋๋ ์๋ณธ๊ณผ ์ ์ฌํ ํ์ง ์ ์ง ๊ฐ๋ฅ
- ๋ฐ์ดํฐ ์๊ฐํ: ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ 2D ๋๋ 3D๋ก ๋ณํํ์ฌ ๋ถ์ ๋ฐ ์๊ฐํ
์ฌ์ดํท๋ฐ์์ PCA ์ฌ์ฉํ๊ธฐ
from sklearn.decomposition import PCA
# PCA ๋ชจ๋ธ ์์ฑ: ์ฃผ์ฑ๋ถ ๊ฐ์(n_components) ์ง์
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# PCA๋ก ์๋ณธ ๋ฐ์ดํฐ ์ฌ๊ตฌ์ฑ
# ์๋ณธ ๋ฐ์ดํฐ ๋ณต์
X_reconstructed = pca.inverse_transform(X_pca)
print(pca.explained_variance_ratio_)
- ์ฒซ ๋ฒ์งธ ์ฃผ์ฑ๋ถ์ด ๊ฐ์ฅ ํฐ ๋ถ์ฐ์ ์ค๋ช ํ๋ฉฐ, ์ดํ ์ฃผ์ฑ๋ถ๋ค์ด ์ ์ฐจ ์์ ๋ถ์ฐ์ ๋ํ๋
์ฐจ์ ์ถ์์ ์ฅ์
- ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ์ ์ฅ ์ฉ๋ ์ ์ฝ
- ๋ถํ์ํ ํน์ฑ์ ์ ๊ฑฐํ์ฌ ๋ชจ๋ธ ์ฑ๋ฅ์ ํฅ์
- ๋ฐ์ดํฐ๋ฅผ 2D ๋๋ 3D๋ก ๋ณํํ์ฌ ์๊ฐ์ ์ผ๋ก ๋ถ์
'๐ฆญ AI&Big Data > ML' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MLFlow (0) | 2025.03.19 |
---|---|
๊ฒฐ์ ํธ๋ฆฌ & ์์๋ธ (1) | 2025.03.05 |
๋ก์ง์คํฑ ํ๊ท (0) | 2025.03.05 |
ํ๊ท (0) | 2025.02.28 |
K ์ต๊ทผ์ ์ด์ (0) | 2025.02.27 |