๋น์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๋น์ง๋ ํ์ต
๋น์ง๋ ํ์ต์ ๋ ์ด๋ธ์ด ์๋ ์๋ต์ผ๋ก ๋ฐ์ดํฐ์ ๋ํด ๋ชจ๋ธ์ ํ๋ จ์ํค๋ ๊ธฐ๊ณ ํ์ต์ ํ ์ ํ์ ๋๋ค. ๋ชฉํ๋ ๋ฐ์ดํฐ ๋ด์์ ํจํด, ๊ตฌ์กฐ ๋๋ ๊ด๊ณ๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค. ๋ ์ด๋ธ์ด ์๋ ์์ ์์ ๋ชจ๋ธ์ด ํ์ตํ๋ ๊ฐ๋ ํ์ต๊ณผ ๋ฌ๋ฆฌ, ๋น์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๋ ์ด๋ธ์ด ์๋ ๋ฐ์ดํฐ๋ก ์์ ํฉ๋๋ค. ๋น์ง๋ ํ์ต์ ํด๋ฌ์คํฐ๋ง, ์ฐจ์ ์ถ์ ๋ฐ ์ด์ ํ์ง์ ๊ฐ์ ์์ ์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ์ดํฐ ๋ด์ ์จ๊ฒจ์ง ํจํด์ ๋ฐ๊ฒฌํ๊ฑฐ๋ ์ ์ฌํ ํญ๋ชฉ์ ๊ทธ๋ฃนํํ๊ฑฐ๋ ๋ฐ์ดํฐ์ ๋ณธ์ง์ ์ธ ํน์ฑ์ ์ ์งํ๋ฉด์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
K-ํ๊ท ํด๋ฌ์คํฐ๋ง
K-ํ๊ท ์ ๊ฐ ์ ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋ฌ์คํฐ ํ๊ท ์ ํ ๋นํ์ฌ ๋ฐ์ดํฐ๋ฅผ K๊ฐ์ ํด๋ฌ์คํฐ๋ก ๋ถํ ํ๋ ์ค์ฌ ๊ธฐ๋ฐ ํด๋ฌ์คํฐ๋ง ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค:
- ์ด๊ธฐํ: K๊ฐ์ ์ด๊ธฐ ํด๋ฌ์คํฐ ์ค์ฌ(์ผํธ๋ก์ด๋)์ ์ ํํฉ๋๋ค. ๋ณดํต ๋ฌด์์๋ก ๋๋ k-means++์ ๊ฐ์ ๋ ์ค๋งํธํ ๋ฐฉ๋ฒ์ ํตํด ์ ํํฉ๋๋ค.
- ํ ๋น: ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ(์: ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ)์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ์ผํธ๋ก์ด๋์ ํ ๋นํฉ๋๋ค.
- ์ ๋ฐ์ดํธ: ๊ฐ ํด๋ฌ์คํฐ์ ํ ๋น๋ ๋ชจ๋ ๋ฐ์ดํฐ ํฌ์ธํธ์ ํ๊ท ์ ์ทจํ์ฌ ์ผํธ๋ก์ด๋๋ฅผ ์ฌ๊ณ์ฐํฉ๋๋ค.
- ๋ฐ๋ณต: ํด๋ฌ์คํฐ ํ ๋น์ด ์์ ํ๋ ๋๊น์ง(์ผํธ๋ก์ด๋๊ฐ ๋ ์ด์ ํฌ๊ฒ ์ด๋ํ์ง ์์) 2-3๋จ๊ณ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
Tip
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: K-ํ๊ท ์ ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ํด๋ฌ์คํฐ๋งํ์ฌ ์นจ์ ํ์ง์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๊ตฌ์๋ค์ KDD Cup 99 ์นจ์ ๋ฐ์ดํฐ์ ์ K-ํ๊ท ์ ์ ์ฉํ์ฌ ํธ๋ํฝ์ ์ ์ ํด๋ฌ์คํฐ์ ๊ณต๊ฒฉ ํด๋ฌ์คํฐ๋ก ํจ๊ณผ์ ์ผ๋ก ๋ถํ ํ์ต๋๋ค. ์ค์ ๋ก ๋ณด์ ๋ถ์๊ฐ๋ ๋ก๊ทธ ํญ๋ชฉ์ด๋ ์ฌ์ฉ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ฌ์คํฐ๋งํ์ฌ ์ ์ฌํ ํ๋ ๊ทธ๋ฃน์ ์ฐพ์ ์ ์์ต๋๋ค. ์ ํ์ฑ๋ ํด๋ฌ์คํฐ์ ์ํ์ง ์๋ ํฌ์ธํธ๋ ์ด์ ์งํ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค(์: ์๋ก์ด ๋งฌ์จ์ด ๋ณ์ข ์ด ์์ฒด ์์ ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๋ ๊ฒฝ์ฐ). K-ํ๊ท ์ ํ๋ ํ๋กํ์ด๋ ํน์ฑ ๋ฒกํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด์ง ํ์ผ์ ๊ทธ๋ฃนํํ์ฌ ๋งฌ์จ์ด ๊ฐ์กฑ ๋ถ๋ฅ์๋ ๋์์ ์ค ์ ์์ต๋๋ค.
K ์ ํ
ํด๋ฌ์คํฐ ์(K)๋ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๊ธฐ ์ ์ ์ ์ํด์ผ ํ๋ ํ์ดํผํ๋ผ๋ฏธํฐ์ ๋๋ค. Elbow Method ๋๋ Silhouette Score์ ๊ฐ์ ๊ธฐ์ ์ ํด๋ฌ์คํฐ๋ง ์ฑ๋ฅ์ ํ๊ฐํ์ฌ K์ ์ ์ ํ ๊ฐ์ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค:
- Elbow Method: ๊ฐ ์ ์์ ํ ๋น๋ ํด๋ฌ์คํฐ ์ผํธ๋ก์ด๋๊น์ง์ ์ ๊ณฑ ๊ฑฐ๋ฆฌ์ ํฉ์ K์ ํจ์๋ก ํ๋กฏํฉ๋๋ค. ๊ฐ์์จ์ด ๊ธ๊ฒฉํ ๋ณํํ๋ โํ๊ฟ์นโ ์ง์ ์ ์ฐพ์ ์ ์ ํ ํด๋ฌ์คํฐ ์๋ฅผ ๋ํ๋ ๋๋ค.
- Silhouette Score: ๋ค์ํ K ๊ฐ์ ๋ํ ์ค๋ฃจ์ฃ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋ ๋์ ์ค๋ฃจ์ฃ ์ ์๋ ๋ ์ ์ ์๋ ํด๋ฌ์คํฐ๋ฅผ ๋ํ๋ ๋๋ค.
๊ฐ์ ๋ฐ ํ๊ณ
K-ํ๊ท ์ ํด๋ฌ์คํฐ๊ฐ ๊ตฌํ์ด๊ณ ํฌ๊ธฐ๊ฐ ๋์ผํ๋ค๊ณ ๊ฐ์ ํ๋ฉฐ, ์ด๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ๋ํด ์ฑ๋ฆฝํ์ง ์์ ์ ์์ต๋๋ค. ์ด๊ธฐ ์ผํธ๋ก์ด๋ ๋ฐฐ์น์ ๋ฏผ๊ฐํ๋ฉฐ ์ง์ญ ์ต์๊ฐ์ผ๋ก ์๋ ดํ ์ ์์ต๋๋ค. ๋ํ K-ํ๊ท ์ ๋ฐ๋๊ฐ ๋ค๋ฅด๊ฑฐ๋ ๋น๊ตฌํ ๋ชจ์์ ๋ฐ์ดํฐ์ ๋ฐ ์๋ก ๋ค๋ฅธ ์ค์ผ์ผ์ ํน์ฑ์๋ ์ ํฉํ์ง ์์ต๋๋ค. ๋ชจ๋ ํน์ฑ์ด ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ๋์ผํ๊ฒ ๊ธฐ์ฌํ๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด ์ ๊ทํ ๋๋ ํ์คํ์ ๊ฐ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์์ -- ๋คํธ์ํฌ ์ด๋ฒคํธ ํด๋ฌ์คํฐ๋ง
์๋์์๋ ๋คํธ์ํฌ ํธ๋ํฝ ๋ฐ์ดํฐ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ K-ํ๊ท ์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋งํฉ๋๋ค. ์ฐ๊ฒฐ ์ง์ ์๊ฐ ๋ฐ ๋ฐ์ดํธ ์์ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง ์ด๋ฒคํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. "์ ์" ํธ๋ํฝ์ 3๊ฐ ํด๋ฌ์คํฐ์ ๊ณต๊ฒฉ ํจํด์ ๋ํ๋ด๋ 1๊ฐ์ ์์ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ K-ํ๊ท ์ ์คํํ์ฌ ์ด๋ค์ด ๋ถ๋ฆฌ๋๋์ง ํ์ธํฉ๋๋ค. ```python import numpy as np from sklearn.cluster import KMeansSimulate synthetic network traffic data (e.g., [duration, bytes]).
Three normal clusters and one small attack cluster.
rng = np.random.RandomState(42) normal1 = rng.normal(loc=[50, 500], scale=[10, 100], size=(500, 2)) # Cluster 1 normal2 = rng.normal(loc=[60, 1500], scale=[8, 200], size=(500, 2)) # Cluster 2 normal3 = rng.normal(loc=[70, 3000], scale=[5, 300], size=(500, 2)) # Cluster 3 attack = rng.normal(loc=[200, 800], scale=[5, 50], size=(50, 2)) # Small attack cluster
X = np.vstack([normal1, normal2, normal3, attack])
Run K-Means clustering into 4 clusters (we expect it to find the 4 groups)
kmeans = KMeans(n_clusters=4, random_state=0, n_init=10) labels = kmeans.fit_predict(X)
Analyze resulting clusters
clusters, counts = np.unique(labels, return_counts=True) print(fโCluster labels: {clusters}โ) print(fโCluster sizes: {counts}โ) print(โCluster centers (duration, bytes):โ) for idx, center in enumerate(kmeans.cluster_centers_): print(fโ Cluster {idx}: {center}โ)
์ด ์์ ์์ K-Means๋ 4๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค. ๋น์ ์์ ์ผ๋ก ๋์ ์ง์ ์๊ฐ(~200)์ ๊ฐ์ง ์์ ๊ณต๊ฒฉ ํด๋ฌ์คํฐ๋ ์ ์ ํด๋ฌ์คํฐ์์ ๊ฑฐ๋ฆฌ๋ก ์ธํด ์ด์์ ์ผ๋ก ์์ฒด ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ธฐ ์ํด ํด๋ฌ์คํฐ ํฌ๊ธฐ์ ์ค์ฌ์ ์ถ๋ ฅํฉ๋๋ค. ์ค์ ์๋๋ฆฌ์ค์์๋ ๋ช ๊ฐ์ ํฌ์ธํธ๋ก ํด๋ฌ์คํฐ์ ์ ์ฌ์ ์ด์ ์งํ๋ก ๋ ์ด๋ธ์ ๋ถ์ด๊ฑฐ๋ ์
์์ ์ธ ํ๋์ ์ํด ๊ตฌ์ฑ์์ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
### ๊ณ์ธต์ ํด๋ฌ์คํฐ๋ง
๊ณ์ธต์ ํด๋ฌ์คํฐ๋ง์ ๋ฐ๋ฅ์์ ์๋ก(์์ง์ ) ์ ๊ทผ ๋ฐฉ์ ๋๋ ์์์ ์๋๋ก(๋ถํ ์ ) ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ๊ณ์ธต์ ๊ตฌ์ถํฉ๋๋ค:
1. **์์ง์ (Bottom-Up)**: ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋ณ๋์ ํด๋ฌ์คํฐ๋ก ์์ํ๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋ฌ์คํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ณํฉํ์ฌ ๋จ์ผ ํด๋ฌ์คํฐ๊ฐ ๋จ๊ฑฐ๋ ์ค์ง ๊ธฐ์ค์ด ์ถฉ์กฑ๋ ๋๊น์ง ์งํํฉ๋๋ค.
2. **๋ถํ ์ (Top-Down)**: ๋ชจ๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋จ์ผ ํด๋ฌ์คํฐ๋ก ์์ํ๊ณ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์์ ์ ํด๋ฌ์คํฐ๊ฐ ๋๊ฑฐ๋ ์ค์ง ๊ธฐ์ค์ด ์ถฉ์กฑ๋ ๋๊น์ง ํด๋ฌ์คํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ถํ ํฉ๋๋ค.
์์ง์ ํด๋ฌ์คํฐ๋ง์ ํด๋ฌ์คํฐ ๊ฐ ๊ฑฐ๋ฆฌ ์ ์์ ์ด๋ค ํด๋ฌ์คํฐ๋ฅผ ๋ณํฉํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ฐ๊ฒฐ ๊ธฐ์ค์ด ํ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์๋ ๋จ์ผ ์ฐ๊ฒฐ(๋ ํด๋ฌ์คํฐ ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ๊ฑฐ๋ฆฌ), ์์ ์ฐ๊ฒฐ(๊ฐ์ฅ ๋จผ ์ ์ ๊ฑฐ๋ฆฌ), ํ๊ท ์ฐ๊ฒฐ ๋ฑ์ด ์์ผ๋ฉฐ, ๊ฑฐ๋ฆฌ ์ธก์ ๊ธฐ์ค์ ์ข
์ข
์ ํด๋ฆฌ๋์
๋๋ค. ์ฐ๊ฒฐ์ ์ ํ์ ์์ฑ๋ ํด๋ฌ์คํฐ์ ํํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํด๋ฌ์คํฐ ์ K๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ํ ํ์๋ ์์ผ๋ฉฐ, ์ํ๋ ํด๋ฌ์คํฐ ์๋ฅผ ์ป๊ธฐ ์ํด ์ ํํ ์์ค์์ ๋ด๋๋ก๊ทธ๋จ์ "์๋ฅผ" ์ ์์ต๋๋ค.
๊ณ์ธต์ ํด๋ฌ์คํฐ๋ง์ ๋ด๋๋ก๊ทธ๋จ์ ์์ฑํ๋ฉฐ, ์ด๋ ์๋ก ๋ค๋ฅธ ์์ค์ ์ธ๋ถ์ฑ์์ ํด๋ฌ์คํฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋๋ฌด์ ๊ฐ์ ๊ตฌ์กฐ์
๋๋ค. ๋ด๋๋ก๊ทธ๋จ์ ํน์ ํด๋ฌ์คํฐ ์๋ฅผ ์ป๊ธฐ ์ํด ์ํ๋ ์์ค์์ ์๋ฆด ์ ์์ต๋๋ค.
> [!TIP]
> *์ฌ์ด๋ฒ ๋ณด์์ ์ฌ์ฉ ์ฌ๋ก:* ๊ณ์ธต์ ํด๋ฌ์คํฐ๋ง์ ์ด๋ฒคํธ๋ ์ํฐํฐ๋ฅผ ํธ๋ฆฌ๋ก ์กฐ์งํ์ฌ ๊ด๊ณ๋ฅผ ํ์
ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์
์ฑ ์ฝ๋ ๋ถ์์์ ์์ง์ ํด๋ฌ์คํฐ๋ง์ ์ํ์ ํ๋ ์ ์ฌ์ฑ์ ๋ฐ๋ผ ๊ทธ๋ฃนํํ์ฌ ์
์ฑ ์ฝ๋ ํจ๋ฐ๋ฆฌ์ ๋ณ์ข
์ ๊ณ์ธต์ ๋๋ฌ๋ผ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ๋ณด์์์๋ IP ํธ๋ํฝ ํ๋ฆ์ ํด๋ฌ์คํฐ๋งํ๊ณ ๋ด๋๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ํ์ ๊ทธ๋ฃน์ ๋ณผ ์ ์์ต๋๋ค(์: ํ๋กํ ์ฝ๋ณ, ํ๋๋ณ). K๋ฅผ ๋ฏธ๋ฆฌ ์ ํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฒฉ ์นดํ
๊ณ ๋ฆฌ ์๊ฐ ์๋ ค์ง์ง ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ์ ์ฉํฉ๋๋ค.
#### ๊ฐ์ ๋ฐ ํ๊ณ
๊ณ์ธต์ ํด๋ฌ์คํฐ๋ง์ ํน์ ํด๋ฌ์คํฐ ํํ๋ฅผ ๊ฐ์ ํ์ง ์์ผ๋ฉฐ ์ค์ฒฉ๋ ํด๋ฌ์คํฐ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ทธ๋ฃน ๊ฐ์ ๋ถ๋ฅ๋ฒ์ด๋ ๊ด๊ณ๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค(์: ์
์ฑ ์ฝ๋๋ฅผ ํจ๋ฐ๋ฆฌ ํ์ ๊ทธ๋ฃน์ผ๋ก ๊ทธ๋ฃนํ). ์ด๋ ๊ฒฐ์ ์ ์ด๋ฉฐ(๋ฌด์์ ์ด๊ธฐํ ๋ฌธ์ ์์) ์ฃผ์ ์ฅ์ ์ ๋ด๋๋ก๊ทธ๋จ์ผ๋ก, ๋ชจ๋ ๊ท๋ชจ์์ ๋ฐ์ดํฐ์ ํด๋ฌ์คํฐ๋ง ๊ตฌ์กฐ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค โ ๋ณด์ ๋ถ์๊ฐ๋ ์๋ฏธ ์๋ ํด๋ฌ์คํฐ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ ์ ํ ์ปท์คํ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๋ฉฐ(์ผ๋ฐ์ ์ผ๋ก $O(n^2)$ ์๊ฐ ๋๋ ๋จ์ ๊ตฌํ์ ๊ฒฝ์ฐ ๋ ๋์จ) ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ์๋ ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค. ๋ํ ์ด๋ ํ์์ ์ ์ฐจ๋ก, ๋ณํฉ์ด๋ ๋ถํ ์ด ์ด๋ฃจ์ด์ง ํ์๋ ๋๋๋ฆด ์ ์์ผ๋ฉฐ, ์ด๊ธฐ ์ค์๋ก ์ธํด ์ต์ ์ด ์๋ ํด๋ฌ์คํฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด์์น๋ ์ผ๋ถ ์ฐ๊ฒฐ ์ ๋ต(๋จ์ผ ์ฐ๊ฒฐ์ด ํด๋ฌ์คํฐ๊ฐ ์ด์์น๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋ "์ฒด์ธ" ํจ๊ณผ๋ฅผ ์ ๋ฐํ ์ ์์)์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
<details>
<summary>์์ -- ์ด๋ฒคํธ์ ์์ง์ ํด๋ฌ์คํฐ๋ง
</summary>
K-Means ์์ ์์ ์์ฑ๋ ํฉ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ(3๊ฐ์ ์ ์ ํด๋ฌ์คํฐ + 1๊ฐ์ ๊ณต๊ฒฉ ํด๋ฌ์คํฐ) ์์ง์ ํด๋ฌ์คํฐ๋ง์ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ด๋๋ก๊ทธ๋จ๊ณผ ํด๋ฌ์คํฐ ๋ ์ด๋ธ์ ์ป๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
```python
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import linkage, dendrogram
# Perform agglomerative clustering (bottom-up) on the data
agg = AgglomerativeClustering(n_clusters=None, distance_threshold=0, linkage='ward')
# distance_threshold=0 gives the full tree without cutting (we can cut manually)
agg.fit(X)
print(f"Number of merge steps: {agg.n_clusters_ - 1}") # should equal number of points - 1
# Create a dendrogram using SciPy for visualization (optional)
Z = linkage(X, method='ward')
# Normally, you would plot the dendrogram. Here we'll just compute cluster labels for a chosen cut:
clusters_3 = AgglomerativeClustering(n_clusters=3, linkage='ward').fit_predict(X)
print(f"Labels with 3 clusters: {np.unique(clusters_3)}")
print(f"Cluster sizes for 3 clusters: {np.bincount(clusters_3)}")
DBSCAN (๋ฐ๋ ๊ธฐ๋ฐ ๊ณต๊ฐ ํด๋ฌ์คํฐ๋ง ์๊ณ ๋ฆฌ์ฆ)
DBSCAN์ ๋ฐ๋ ๊ธฐ๋ฐ ํด๋ฌ์คํฐ๋ง ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ฐ์ง๋ ์ ๋ค์ ํจ๊ป ๊ทธ๋ฃนํํ๊ณ ์ ๋ฐ๋ ์ง์ญ์ ์ ๋ค์ ์ด์์น๋ก ํ์ํฉ๋๋ค. ์ด๋ ๋ค์ํ ๋ฐ๋์ ๋น๊ตฌํ ํํ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ์ ์ ํนํ ์ ์ฉํฉ๋๋ค.
DBSCAN์ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ์ฌ ์๋ํฉ๋๋ค:
- Epsilon (ฮต): ๋์ผ ํด๋ฌ์คํฐ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋ ๋ ์ ๊ฐ์ ์ต๋ ๊ฑฐ๋ฆฌ.
- MinPts: ๋ฐ์ง ์ง์ญ(ํต์ฌ ์ )์ ํ์ฑํ๋ ๋ฐ ํ์ํ ์ต์ ์ ์.
DBSCAN์ ํต์ฌ ์ , ๊ฒฝ๊ณ ์ ๋ฐ ๋ ธ์ด์ฆ ์ ์ ์๋ณํฉ๋๋ค:
- ํต์ฌ ์ : ฮต ๊ฑฐ๋ฆฌ ๋ด์ ์ต์ MinPts ์ด์์ด ์๋ ์ .
- ๊ฒฝ๊ณ ์ : ํต์ฌ ์ ์ ฮต ๊ฑฐ๋ฆฌ ๋ด์ ์์ง๋ง MinPts ์ด์์ด ๋ถ์กฑํ ์ .
- ๋ ธ์ด์ฆ ์ : ํต์ฌ ์ ๋ ๊ฒฝ๊ณ ์ ๋ ์๋ ์ .
ํด๋ฌ์คํฐ๋ง์ ๋ฐฉ๋ฌธํ์ง ์์ ํต์ฌ ์ ์ ์ ํํ๊ณ ์ด๋ฅผ ์๋ก์ด ํด๋ฌ์คํฐ๋ก ํ์ํ ๋ค์, ๊ทธ๋ก๋ถํฐ ๋ฐ๋์ ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์ (ํต์ฌ ์ ๋ฐ ๊ทธ ์ด์ ๋ฑ)์ ์ฌ๊ท์ ์ผ๋ก ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค. ๊ฒฝ๊ณ ์ ์ ์ธ๊ทผ ํต์ฌ์ ํด๋ฌ์คํฐ์ ์ถ๊ฐ๋ฉ๋๋ค. ๋ชจ๋ ๋๋ฌ ๊ฐ๋ฅํ ์ ์ ํ์ฅํ ํ, DBSCAN์ ๋ค๋ฅธ ๋ฐฉ๋ฌธํ์ง ์์ ํต์ฌ์ผ๋ก ์ด๋ํ์ฌ ์๋ก์ด ํด๋ฌ์คํฐ๋ฅผ ์์ํฉ๋๋ค. ์ด๋ค ํต์ฌ์ ์ํด์๋ ๋๋ฌ๋์ง ์์ ์ ์ ๋ ธ์ด์ฆ๋ก ๋จ์ ์์ต๋๋ค.
Tip
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: DBSCAN์ ๋คํธ์ํฌ ํธ๋ํฝ์์ ์ด์ ํ์ง์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ์ฌ์ฉ์ ํ๋์ ํน์ฑ ๊ณต๊ฐ์์ ํ๋ ์ด์์ ๋ฐ์ง ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ ์ ์์ผ๋ฉฐ, ์๋ก์ด ๊ณต๊ฒฉ ํ๋์ DBSCAN์ด ๋ ธ์ด์ฆ(์ด์์น)๋ก ๋ ์ด๋ธ์ ๋ถ์ผ ์ฐ์ฌ๋ ์ ์ผ๋ก ๋ํ๋ฉ๋๋ค. ์ด๋ ํฌํธ ์ค์บ์ด๋ ์๋น์ค ๊ฑฐ๋ถ ํธ๋ํฝ์ ์ ์ ํฌ์ ์ง์ญ์ผ๋ก ๊ฐ์งํ ์ ์๋ ๋คํธ์ํฌ ํ๋ฆ ๊ธฐ๋ก์ ํด๋ฌ์คํฐ๋งํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค. ๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ฑ์ฝ๋ ๋ณ์ข ๊ทธ๋ฃนํ์ ๋๋ค: ๋๋ถ๋ถ์ ์ํ์ด ๊ฐ์กฑ๋ณ๋ก ํด๋ฌ์คํฐ๋ง๋์ง๋ง ๋ช ๊ฐ๋ ์ด๋์๋ ๋ง์ง ์๋ ๊ฒฝ์ฐ, ๊ทธ ๋ช ๊ฐ๋ ์ ๋ก๋ฐ์ด ์ ์ฑ์ฝ๋์ผ ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ๋ฅผ ํ๋๊ทธํ ์ ์๋ ๋ฅ๋ ฅ ๋๋ถ์ ๋ณด์ ํ์ ์ด๋ฌํ ์ด์์น๋ฅผ ์กฐ์ฌํ๋ ๋ฐ ์ง์คํ ์ ์์ต๋๋ค.
๊ฐ์ ๋ฐ ํ๊ณ
๊ฐ์ ๋ฐ ๊ฐ์ : DBSCAN์ ๊ตฌํ ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ ํ์ง ์์ต๋๋ค โ ์์์ ํํ์ ํด๋ฌ์คํฐ(์ฒด์ธํ ๋๋ ์ธ์ ํด๋ฌ์คํฐ ๋ฑ)๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ฐ๋์ ๋ฐ๋ผ ํด๋ฌ์คํฐ ์๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ๋ฉฐ, ์ด์์น๋ฅผ ๋ ธ์ด์ฆ๋ก ํจ๊ณผ์ ์ผ๋ก ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ ๋ถ๊ท์นํ ํํ์ ๋ ธ์ด์ฆ๋ฅผ ๊ฐ์ง ์ค์ ๋ฐ์ดํฐ์ ๊ฐ๋ ฅํฉ๋๋ค. ์ด์์น์ ๋ํด ๊ฐ๊ฑดํฉ๋๋ค(K-Means์ ๋ฌ๋ฆฌ ํด๋ฌ์คํฐ์ ๊ฐ์ ๋ก ํฌํจ์ํค์ง ์์). ํด๋ฌ์คํฐ๊ฐ ๋๋ต ๊ท ์ผํ ๋ฐ๋๋ฅผ ๊ฐ์ง ๋ ์ ์๋ํฉ๋๋ค.
ํ๊ณ: DBSCAN์ ์ฑ๋ฅ์ ์ ์ ํ ฮต ๋ฐ MinPts ๊ฐ์ ์ ํํ๋ ๋ฐ ์์กดํฉ๋๋ค. ๋ฐ๋๊ฐ ๋ค์ํ ๋ฐ์ดํฐ์ ๋ํด ์ด๋ ค์์ ๊ฒช์ ์ ์์ต๋๋ค โ ๋จ์ผ ฮต๋ ๋ฐ์ง ํด๋ฌ์คํฐ์ ํฌ์ ํด๋ฌ์คํฐ๋ฅผ ๋ชจ๋ ์์ฉํ ์ ์์ต๋๋ค. ฮต๊ฐ ๋๋ฌด ์์ผ๋ฉด ๋๋ถ๋ถ์ ์ ์ ๋ ธ์ด์ฆ๋ก ๋ ์ด๋ธ๋งํ๊ณ , ๋๋ฌด ํฌ๋ฉด ํด๋ฌ์คํฐ๊ฐ ์๋ชป ๋ณํฉ๋ ์ ์์ต๋๋ค. ๋ํ, DBSCAN์ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ์ ์์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค(๋จ์ํ๊ฒ $O(n^2)$, ๊ทธ๋ฌ๋ ๊ณต๊ฐ ์ธ๋ฑ์ฑ์ด ๋์์ด ๋ ์ ์์ต๋๋ค). ๊ณ ์ฐจ์ ํน์ฑ ๊ณต๊ฐ์์๋ โฮต ๋ด ๊ฑฐ๋ฆฌโ ๊ฐ๋ ์ด ๋ ์๋ฏธ ์๊ฒ ๋ ์ ์์ผ๋ฉฐ(์ฐจ์์ ์ ์ฃผ), DBSCAN์ ์ ์คํ ๋งค๊ฐ๋ณ์ ์กฐ์ ์ด ํ์ํ๊ฑฐ๋ ์ง๊ด์ ์ธ ํด๋ฌ์คํฐ๋ฅผ ์ฐพ์ง ๋ชปํ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ HDBSCAN๊ณผ ๊ฐ์ ํ์ฅ์ ์ผ๋ถ ๋ฌธ์ (์: ๋ฐ๋ ๋ณํ)๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์์ -- ๋ ธ์ด์ฆ๊ฐ ์๋ ํด๋ฌ์คํฐ๋ง
```python from sklearn.cluster import DBSCANGenerate synthetic data: 2 normal clusters and 5 outlier points
cluster1 = rng.normal(loc=[100, 1000], scale=[5, 100], size=(100, 2)) cluster2 = rng.normal(loc=[120, 2000], scale=[5, 100], size=(100, 2)) outliers = rng.uniform(low=[50, 50], high=[180, 3000], size=(5, 2)) # scattered anomalies data = np.vstack([cluster1, cluster2, outliers])
Run DBSCAN with chosen eps and MinPts
eps = 15.0 # radius for neighborhood min_pts = 5 # minimum neighbors to form a dense region db = DBSCAN(eps=eps, min_samples=min_pts).fit(data) labels = db.labels_ # cluster labels (-1 for noise)
Analyze clusters and noise
num_clusters = len(set(labels) - {-1}) num_noise = np.sum(labels == -1) print(fโDBSCAN found {num_clusters} clusters and {num_noise} noise pointsโ) print(โCluster labels for first 10 points:โ, labels[:10])
์ด ์ค๋ํซ์์๋ `eps`์ `min_samples`๋ฅผ ๋ฐ์ดํฐ ์ค์ผ์ผ์ ๋ง๊ฒ ์กฐ์ ํ์ต๋๋ค(ํน์ง ๋จ์๋ก 15.0, ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๊ธฐ ์ํด 5๊ฐ์ ํฌ์ธํธ ํ์). DBSCAN์ 2๊ฐ์ ํด๋ฌ์คํฐ(์ ์ ํธ๋ํฝ ํด๋ฌ์คํฐ)๋ฅผ ์ฐพ์์ผ ํ๋ฉฐ, 5๊ฐ์ ์ฃผ์
๋ ์ด์์น๋ฅผ ๋
ธ์ด์ฆ๋ก ํ๋๊ทธํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด ํด๋ฌ์คํฐ ์์ ๋
ธ์ด์ฆ ํฌ์ธํธ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ค์ ํ๊ฒฝ์์๋ ฮต(ฮต๋ฅผ ์ ํํ๊ธฐ ์ํด k-๊ฑฐ๋ฆฌ ๊ทธ๋ํ ํด๋ฆฌ์คํฑ ์ฌ์ฉ)์ MinPts(์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ์ฐจ์ + 1๋ก ์ค์ ๋จ)๋ฅผ ๋ฐ๋ณตํ์ฌ ์์ ์ ์ธ ํด๋ฌ์คํฐ๋ง ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋
ธ์ด์ฆ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ ์ด๋ธ๋งํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ ๋ถ์์ ์ํ ์ ์ฌ์ ๊ณต๊ฒฉ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
</details>
### ์ฃผ์ฑ๋ถ ๋ถ์ (PCA)
PCA๋ ๋ฐ์ดํฐ์ ์ต๋ ๋ถ์ฐ์ ํฌ์ฐฉํ๋ ์๋ก์ด ์ง๊ต ์ถ(์ฃผ์ฑ๋ถ) ์งํฉ์ ์ฐพ๋ **์ฐจ์ ์ถ์** ๊ธฐ๋ฒ์
๋๋ค. ๊ฐ๋จํ ๋งํด, PCA๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ์ขํ๊ณ๋ก ํ์ ํ๊ณ ํฌ์ํ์ฌ ์ฒซ ๋ฒ์งธ ์ฃผ์ฑ๋ถ(PC1)์ด ๊ฐ๋ฅํ ์ต๋ ๋ถ์ฐ์ ์ค๋ช
ํ๊ณ , ๋ ๋ฒ์งธ ์ฃผ์ฑ๋ถ(PC2)์ด PC1์ ์์ง์ธ ์ต๋ ๋ถ์ฐ์ ์ค๋ช
ํ๋๋ก ํฉ๋๋ค. ์ํ์ ์ผ๋ก PCA๋ ๋ฐ์ดํฐ์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด ๊ณ ์ ๋ฒกํฐ๋ ์ฃผ์ฑ๋ถ ๋ฐฉํฅ์ด๋ฉฐ, ํด๋น ๊ณ ์ ๊ฐ์ ๊ฐ ๊ณ ์ ๋ฒกํฐ๊ฐ ์ค๋ช
ํ๋ ๋ถ์ฐ์ ์์ ๋ํ๋
๋๋ค. PCA๋ ์ข
์ข
ํน์ง ์ถ์ถ, ์๊ฐํ ๋ฐ ๋
ธ์ด์ฆ ๊ฐ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๊ฒ์ ๋ฐ์ดํฐ์
์ฐจ์์ **์๋นํ ์ ํ ์์กด์ฑ ๋๋ ์๊ด๊ด๊ณ**๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค.
PCA๋ ๋ฐ์ดํฐ์ ์ฃผ์ฑ๋ถ์ ์๋ณํ์ฌ ์ต๋ ๋ถ์ฐ ๋ฐฉํฅ์ ์ฐพ์ต๋๋ค. PCA์ ํฌํจ๋ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. **ํ์คํ**: ํ๊ท ์ ๋นผ๊ณ ๋จ์ ๋ถ์ฐ์ผ๋ก ์ค์ผ์ผ๋งํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ ๋ง์ถฅ๋๋ค.
2. **๊ณต๋ถ์ฐ ํ๋ ฌ**: ํ์คํ๋ ๋ฐ์ดํฐ์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ์ฐํ์ฌ ํน์ง ๊ฐ์ ๊ด๊ณ๋ฅผ ์ดํดํฉ๋๋ค.
3. **๊ณ ์ ๊ฐ ๋ถํด**: ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๋ํด ๊ณ ์ ๊ฐ ๋ถํด๋ฅผ ์ํํ์ฌ ๊ณ ์ ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ป์ต๋๋ค.
4. **์ฃผ์ฑ๋ถ ์ ํ**: ๊ณ ์ ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ๊ฐ์ฅ ํฐ ๊ณ ์ ๊ฐ์ ํด๋นํ๋ ์์ K๊ฐ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ ํํฉ๋๋ค. ์ด ๊ณ ์ ๋ฒกํฐ๋ ์๋ก์ด ํน์ง ๊ณต๊ฐ์ ํ์ฑํฉ๋๋ค.
5. **๋ฐ์ดํฐ ๋ณํ**: ์ ํ๋ ์ฃผ์ฑ๋ถ์ ์ฌ์ฉํ์ฌ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ํน์ง ๊ณต๊ฐ์ ํฌ์ํฉ๋๋ค.
PCA๋ ๋ฐ์ดํฐ ์๊ฐํ, ๋
ธ์ด์ฆ ๊ฐ์ ๋ฐ ๋ค๋ฅธ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ก ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ์ดํฐ์ ์ฐจ์์ ์ค์ด๋ฉด์ ๋ณธ์ง์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
#### ๊ณ ์ ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ
๊ณ ์ ๊ฐ์ ํด๋น ๊ณ ์ ๋ฒกํฐ๊ฐ ํฌ์ฐฉํ๋ ๋ถ์ฐ์ ์์ ๋ํ๋ด๋ ์ค์นผ๋ผ์
๋๋ค. ๊ณ ์ ๋ฒกํฐ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ณํ๋ ๋ฐฉํฅ์ ๋ํ๋
๋๋ค.
A๊ฐ ์ ๋ฐฉ ํ๋ ฌ์ด๊ณ , v๊ฐ 0์ด ์๋ ๋ฒกํฐ๋ผ๊ณ ๊ฐ์ ํฉ์๋ค: `A * v = ฮป * v`
์ฌ๊ธฐ์:
- A๋ [ [1, 2], [2, 1]]๊ณผ ๊ฐ์ ์ ๋ฐฉ ํ๋ ฌ์
๋๋ค(์: ๊ณต๋ถ์ฐ ํ๋ ฌ)
- v๋ ๊ณ ์ ๋ฒกํฐ์
๋๋ค(์: [1, 1])
๊ทธ๋ผ, `A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]`๊ฐ ๋์ด ๊ณ ์ ๊ฐ ฮป๋ ๊ณ ์ ๋ฒกํฐ v์ ๊ณฑํด์ ธ ฮป = 3์ด ๋ฉ๋๋ค.
#### PCA์์์ ๊ณ ์ ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ
์๋ฅผ ๋ค์ด ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค. 100x100 ํฝ์
์ ์ผ๊ตด ๊ทธ๋ ์ด์ค์ผ์ผ ์ด๋ฏธ์ง๊ฐ ๋ง์ ๋ฐ์ดํฐ์
์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ฐ ํฝ์
์ ํน์ง์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ผ๋ฏ๋ก ์ด๋ฏธ์ง๋น 10,000๊ฐ์ ํน์ง(๋๋ ์ด๋ฏธ์ง๋น 10,000๊ฐ์ ๊ตฌ์ฑ ์์ ๋ฒกํฐ)์ด ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ์
์ ์ฐจ์์ PCA๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ด๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ
๋๋ค:
1. **ํ์คํ**: ๊ฐ ํน์ง(ํฝ์
)์ ํ๊ท ์ ๋ฐ์ดํฐ์
์์ ๋นผ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ ๋ง์ถฅ๋๋ค.
2. **๊ณต๋ถ์ฐ ํ๋ ฌ**: ํ์คํ๋ ๋ฐ์ดํฐ์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ์ฐํ์ฌ ํน์ง(ํฝ์
) ๊ฐ์ ๋ณ๋์ฑ์ ํฌ์ฐฉํฉ๋๋ค.
- ๋ ๋ณ์(์ด ๊ฒฝ์ฐ ํฝ์
) ๊ฐ์ ๊ณต๋ถ์ฐ์ ํจ๊ป ์ผ๋ง๋ ๋ณํ๋์ง๋ฅผ ๋ํ๋ด๋ฏ๋ก, ์ฌ๊ธฐ์์ ์์ด๋์ด๋ ์ด๋ค ํฝ์
์ด ์ ํ ๊ด๊ณ๋ก ํจ๊ป ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋์ง๋ฅผ ์ฐพ๋ ๊ฒ์
๋๋ค.
- ์๋ฅผ ๋ค์ด, ํฝ์
1๊ณผ ํฝ์
2๊ฐ ํจ๊ป ์ฆ๊ฐํ๋ ๊ฒฝํฅ์ด ์๋ค๋ฉด, ์ด๋ค ๊ฐ์ ๊ณต๋ถ์ฐ์ ์์๊ฐ ๋ ๊ฒ์
๋๋ค.
- ๊ณต๋ถ์ฐ ํ๋ ฌ์ 10,000x10,000 ํ๋ ฌ์ด ๋๋ฉฐ, ๊ฐ ํญ๋ชฉ์ ๋ ํฝ์
๊ฐ์ ๊ณต๋ถ์ฐ์ ๋ํ๋
๋๋ค.
3. **๊ณ ์ ๊ฐ ๋ฐฉ์ ์ ํด๊ฒฐ**: ํด๊ฒฐํด์ผ ํ ๊ณ ์ ๊ฐ ๋ฐฉ์ ์์ `C * v = ฮป * v`์ด๋ฉฐ, ์ฌ๊ธฐ์ C๋ ๊ณต๋ถ์ฐ ํ๋ ฌ, v๋ ๊ณ ์ ๋ฒกํฐ, ฮป๋ ๊ณ ์ ๊ฐ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค:
- **๊ณ ์ ๊ฐ ๋ถํด**: ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๋ํด ๊ณ ์ ๊ฐ ๋ถํด๋ฅผ ์ํํ์ฌ ๊ณ ์ ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ป์ต๋๋ค.
- **ํน์ด๊ฐ ๋ถํด (SVD)**: ๋๋ SVD๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ํ๋ ฌ์ ํน์ด๊ฐ๊ณผ ๋ฒกํฐ๋ก ๋ถํดํ์ฌ ์ฃผ์ฑ๋ถ์ ์ป์ ์ ์์ต๋๋ค.
4. **์ฃผ์ฑ๋ถ ์ ํ**: ๊ณ ์ ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ๊ฐ์ฅ ํฐ ๊ณ ์ ๊ฐ์ ํด๋นํ๋ ์์ K๊ฐ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ ํํฉ๋๋ค. ์ด ๊ณ ์ ๋ฒกํฐ๋ ๋ฐ์ดํฐ์ ์ต๋ ๋ถ์ฐ ๋ฐฉํฅ์ ๋ํ๋
๋๋ค.
> [!TIP]
> *์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก:* PCA์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ค ํ๋๋ ์ด์ ํ์ง๋ฅผ ์ํ ํน์ง ์ถ์์
๋๋ค. ์๋ฅผ ๋ค์ด, 40๊ฐ ์ด์์ ๋คํธ์ํฌ ๋ฉํธ๋ฆญ(์: NSL-KDD ํน์ง)์ ๊ฐ์ง ์นจ์
ํ์ง ์์คํ
์ PCA๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ์ค์ฌ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ฑฐ๋ ํด๋ฌ์คํฐ๋ง ์๊ณ ๋ฆฌ์ฆ์ ์
๋ ฅํ ์ ์์ต๋๋ค. ๋ถ์๊ฐ๋ ์ฒซ ๋ฒ์งธ ๋ ์ฃผ์ฑ๋ถ์ ๊ณต๊ฐ์์ ๋คํธ์ํฌ ํธ๋ํฝ์ ํ๋กํ
ํ์ฌ ๊ณต๊ฒฉ์ด ์ ์ ํธ๋ํฝ๊ณผ ๋ถ๋ฆฌ๋๋์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. PCA๋ ๋ํ ์๊ด๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ก๋ ๋ฐ์ดํธ์ ์์ ๋ ๋ฐ์ดํธ์ ๊ฐ์ ์ค๋ณต ํน์ง์ ์ ๊ฑฐํ์ฌ ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ๋ ๊ฐ๋ ฅํ๊ณ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
#### ๊ฐ์ ๋ฐ ํ๊ณ
PCA๋ **๋ถ์ฐ์ ์ฃผ์ถ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค** โ ์ด๋ ์ ํ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ๋ฐ์ดํฐ์ ์ ํ ์๊ด๊ด๊ณ๋ฅผ ํฌ์ฐฉํฉ๋๋ค. PCA๋ ํน์ง ๊ณต๋ถ์ฐ๋ง ์ฌ์ฉํ๋ฏ๋ก ๋น์ง๋ ํ์ต์
๋๋ค. PCA์ ์ฅ์ ์๋ ๋
ธ์ด์ฆ ๊ฐ์(์์ ๋ถ์ฐ ๊ตฌ์ฑ ์์๋ ์ข
์ข
๋
ธ์ด์ฆ์ ํด๋น)์ ํน์ง์ ๋น์๊ดํ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด๋ ์ค๊ฐ ์ ๋์ ๊ณ ์ฐจ์์ ๋ํด ๊ณ์ฐ์ ์ผ๋ก ํจ์จ์ ์ด๋ฉฐ ์ข
์ข
๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ก ์ ์ฉํฉ๋๋ค(์ฐจ์์ ์ ์ฃผ๋ฅผ ์ํํ๊ธฐ ์ํด). ํ๊ณ ์ค ํ๋๋ PCA๊ฐ ์ ํ ๊ด๊ณ์๋ง ์ ํ๋๋ค๋ ๊ฒ์
๋๋ค โ ๋ณต์กํ ๋น์ ํ ๊ตฌ์กฐ๋ ํฌ์ฐฉํ์ง ๋ชปํฉ๋๋ค(์คํ ์ธ์ฝ๋๋ t-SNE๋ ํฌ์ฐฉํ ์ ์์ต๋๋ค). ๋ํ PCA ๊ตฌ์ฑ ์์๋ ์๋ ํน์ง ์ธก๋ฉด์์ ํด์ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค(์๋ ํน์ง์ ์กฐํฉ์ด๊ธฐ ๋๋ฌธ์
๋๋ค). ์ฌ์ด๋ฒ ๋ณด์์์๋ ์ฃผ์ํด์ผ ํฉ๋๋ค: ๋ฎ์ ๋ถ์ฐ ํน์ง์์ ๋ฏธ์ธํ ๋ณํ๋ง ์ผ์ผํค๋ ๊ณต๊ฒฉ์ ์์ PC์์ ๋ํ๋์ง ์์ ์ ์์ต๋๋ค(์๋ํ๋ฉด PCA๋ ๋ฐ๋์ "ํฅ๋ฏธ๋ก์"์ด ์๋๋ผ ๋ถ์ฐ์ ์ฐ์ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค).
<details>
<summary>์์ -- ๋คํธ์ํฌ ๋ฐ์ดํฐ์ ์ฐจ์ ์ถ์
</summary>
์ฌ๋ฌ ํน์ง(์: ์ง์ ์๊ฐ, ๋ฐ์ดํธ, ์)์ผ๋ก ๊ตฌ์ฑ๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ก๊ทธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ํน์ง ๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง ํฉ์ฑ 4์ฐจ์ ๋ฐ์ดํฐ์
์ ์์ฑํ๊ณ PCA๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐํ ๋๋ ์ถ๊ฐ ๋ถ์์ ์ํด 2์ฐจ์์ผ๋ก ์ถ์ํ ๊ฒ์
๋๋ค.
```python
from sklearn.decomposition import PCA
# Create synthetic 4D data (3 clusters similar to before, but add correlated features)
# Base features: duration, bytes (as before)
base_data = np.vstack([normal1, normal2, normal3]) # 1500 points from earlier normal clusters
# Add two more features correlated with existing ones, e.g. packets = bytes/50 + noise, errors = duration/10 + noise
packets = base_data[:, 1] / 50 + rng.normal(scale=0.5, size=len(base_data))
errors = base_data[:, 0] / 10 + rng.normal(scale=0.5, size=len(base_data))
data_4d = np.column_stack([base_data[:, 0], base_data[:, 1], packets, errors])
# Apply PCA to reduce 4D data to 2D
pca = PCA(n_components=2)
data_2d = pca.fit_transform(data_4d)
print("Explained variance ratio of 2 components:", pca.explained_variance_ratio_)
print("Original shape:", data_4d.shape, "Reduced shape:", data_2d.shape)
# We can examine a few transformed points
print("First 5 data points in PCA space:\n", data_2d[:5])
์ฌ๊ธฐ์์๋ ์ด์ ์ ์ ์ ํธ๋ํฝ ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ ธ์ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ฐ์ดํธ ๋ฐ ์ง์ ์๊ฐ๊ณผ ์๊ด๊ด๊ณ๊ฐ ์๋ ๋ ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ(ํจํท ๋ฐ ์ค๋ฅ)์ ํ์ฅํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ PCA๋ฅผ ์ฌ์ฉํ์ฌ 4๊ฐ์ ๊ธฐ๋ฅ์ 2๊ฐ์ ์ฃผ์ฑ๋ถ์ผ๋ก ์์ถํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ค๋ช ๋ ๋ถ์ฐ ๋น์จ์ ์ถ๋ ฅํ๋ฉฐ, ์ด๋ ์๋ฅผ ๋ค์ด 2๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ 95% ์ด์์ ๋ถ์ฐ์ ํฌ์ฐฉํ๋ค๊ณ ๋ณด์ฌ์ค ์ ์์ต๋๋ค(์ฆ, ์ ๋ณด ์์ค์ด ์ ์์ ์๋ฏธ). ์ถ๋ ฅ์ ๋ฐ์ดํฐ ํํ๊ฐ (1500, 4)์์ (1500, 2)๋ก ์ค์ด๋๋ ๊ฒ๋ ๋ณด์ฌ์ค๋๋ค. PCA ๊ณต๊ฐ์ ์ฒ์ ๋ช ๊ฐ ํฌ์ธํธ๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. ์ค์ ๋ก๋ data_2d๋ฅผ ํ๋กํ ํ์ฌ ํด๋ฌ์คํฐ๊ฐ ๊ตฌ๋ณ ๊ฐ๋ฅํ์ง ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค. ์ด์์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ, PCA ๊ณต๊ฐ์์ ์ฃผ์ ํด๋ฌ์คํฐ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ์ ์ผ๋ก ๋ํ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ PCA๋ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ธ๊ฐ ํด์์ ์ํ ๊ด๋ฆฌ ๊ฐ๋ฅํ ํํ๋ก ์ ์ ํ๊ฑฐ๋ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
Gaussian Mixture Models (GMM)
๊ฐ์ฐ์์ ํผํฉ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋ ค์ง์ง ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ๊ฐ์ฐ์์(์ ์) ๋ถํฌ์ ํผํฉ์์ ์์ฑ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ์ด๋ ํ๋ฅ ์ ํด๋ฌ์คํฐ๋ง ๋ชจ๋ธ์ ๋๋ค: ๊ฐ ํฌ์ธํธ๋ฅผ K๊ฐ์ ๊ฐ์ฐ์์ ๊ตฌ์ฑ ์์ ์ค ํ๋์ ๋ถ๋๋ฝ๊ฒ ํ ๋นํ๋ ค๊ณ ํฉ๋๋ค. ๊ฐ ๊ฐ์ฐ์์ ๊ตฌ์ฑ ์์ k๋ ํ๊ท ๋ฒกํฐ(ฮผ_k), ๊ณต๋ถ์ฐ ํ๋ ฌ(ฮฃ_k), ๊ทธ๋ฆฌ๊ณ ํด๋น ํด๋ฌ์คํฐ์ ์ ๋ณ๋ฅ ์ ๋ํ๋ด๋ ํผํฉ ๊ฐ์ค์น(ฯ_k)๋ฅผ ๊ฐ์ง๋๋ค. K-ํ๊ท ๊ณผ ๋ฌ๋ฆฌ GMM์ ๊ฐ ํฌ์ธํธ์ ๊ฐ ํด๋ฌ์คํฐ์ ์ํ ํ๋ฅ ์ ์ ๊ณตํฉ๋๋ค.
GMM ์ ํฉ์ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋-์ต๋ํ(EM) ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ํ๋ฉ๋๋ค:
-
์ด๊ธฐํ: ํ๊ท , ๊ณต๋ถ์ฐ ๋ฐ ํผํฉ ๊ณ์์ ๋ํ ์ด๊ธฐ ์ถ์ ๊ฐ์ผ๋ก ์์ํฉ๋๋ค(๋๋ K-ํ๊ท ๊ฒฐ๊ณผ๋ฅผ ์์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค).
-
E-๋จ๊ณ(๊ธฐ๋): ํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ๊ณ ๋ คํ์ฌ ๊ฐ ํด๋ฌ์คํฐ๊ฐ ๊ฐ ํฌ์ธํธ์ ๋ํ ์ฑ ์์ ๊ณ์ฐํฉ๋๋ค: ๋ณธ์ง์ ์ผ๋ก
r_nk = P(z_k | x_n)์ฌ๊ธฐ์ z_k๋ ํฌ์ธํธ x_n์ ๋ํ ํด๋ฌ์คํฐ ์์์ ๋ํ๋ด๋ ์ ์ฌ ๋ณ์์ ๋๋ค. ์ด๋ ๋ฒ ์ด์ฆ ์ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ํฌ์ธํธ๊ฐ ๊ฐ ํด๋ฌ์คํฐ์ ์ํ ํํ ํ๋ฅ ์ ๊ณ์ฐํฉ๋๋ค. ์ฑ ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค:
r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \mathcal{N}(x_n | \mu_j, \Sigma_j)}
์ฌ๊ธฐ์:
-
( \pi_k )๋ ํด๋ฌ์คํฐ k์ ๋ํ ํผํฉ ๊ณ์(ํด๋ฌ์คํฐ k์ ์ฌ์ ํ๋ฅ )์ ๋๋ค,
-
( \mathcal{N}(x_n | \mu_k, \Sigma_k) )๋ ํ๊ท ( \mu_k ) ๋ฐ ๊ณต๋ถ์ฐ ( \Sigma_k )๊ฐ ์ฃผ์ด์ก์ ๋ ํฌ์ธํธ ( x_n )์ ๋ํ ๊ฐ์ฐ์์ ํ๋ฅ ๋ฐ๋ ํจ์์ ๋๋ค.
-
M-๋จ๊ณ(์ต๋ํ): E-๋จ๊ณ์์ ๊ณ์ฐ๋ ์ฑ ์์ ์ฌ์ฉํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค:
-
๊ฐ ํ๊ท ฮผ_k๋ฅผ ํฌ์ธํธ์ ๊ฐ์ค ํ๊ท ์ผ๋ก ์ ๋ฐ์ดํธํ๋ฉฐ, ๊ฐ์ค์น๋ ์ฑ ์์ ๋๋ค.
-
๊ฐ ๊ณต๋ถ์ฐ ฮฃ_k๋ฅผ ํด๋ฌ์คํฐ k์ ํ ๋น๋ ํฌ์ธํธ์ ๊ฐ์ค ๊ณต๋ถ์ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
-
ํผํฉ ๊ณ์ ฯ_k๋ฅผ ํด๋ฌ์คํฐ k์ ๋ํ ํ๊ท ์ฑ ์์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
-
E ๋ฐ M ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ์ฌ ์๋ ดํ ๋๊น์ง(๋งค๊ฐ๋ณ์๊ฐ ์์ ํ๋๊ฑฐ๋ ์ฐ๋ ๊ฐ์ ์ด ์๊ณ๊ฐ ์ดํ๋ก ๋จ์ด์ง ๋๊น์ง).
๊ฒฐ๊ณผ๋ ์ ์ฒด ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ์งํฉ์ ์ผ๋ก ๋ชจ๋ธ๋งํ๋ ๊ฐ์ฐ์์ ๋ถํฌ ์งํฉ์ ๋๋ค. ์ ํฉ๋ GMM์ ์ฌ์ฉํ์ฌ ๊ฐ ํฌ์ธํธ๋ฅผ ๊ฐ์ฅ ๋์ ํ๋ฅ ์ ๊ฐ์ง ๊ฐ์ฐ์์์ ํ ๋นํ์ฌ ํด๋ฌ์คํฐ๋งํ๊ฑฐ๋ ๋ถํ์ค์ฑ์ ์ํด ํ๋ฅ ์ ์ ์งํ ์ ์์ต๋๋ค. ์๋ก์ด ํฌ์ธํธ์ ์ฐ๋๋ฅผ ํ๊ฐํ์ฌ ๋ชจ๋ธ์ ์ ํฉํ์ง ํ์ธํ ์๋ ์์ต๋๋ค(์ด์ ํ์ง์ ์ ์ฉ).
Tip
์ฌ์ด๋ฒ ๋ณด์์ ์ฌ์ฉ ์ฌ๋ก: GMM์ ์ ์ ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ๋ชจ๋ธ๋งํ์ฌ ์ด์ ํ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค: ํ์ต๋ ํผํฉ ์๋์์ ๋งค์ฐ ๋ฎ์ ํ๋ฅ ์ ๊ฐ์ง ํฌ์ธํธ๋ ์ด์์ผ๋ก ํ์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํฉ๋ฒ์ ์ธ ๋คํธ์ํฌ ํธ๋ํฝ ๊ธฐ๋ฅ์ ๋ํด GMM์ ํ๋ จํ ์ ์์ต๋๋ค; ํ์ต๋ ํด๋ฌ์คํฐ์ ์ ์ฌํ์ง ์์ ๊ณต๊ฒฉ ์ฐ๊ฒฐ์ ๋ฎ์ ์ฐ๋๋ฅผ ๊ฐ์ง ๊ฒ์ ๋๋ค. GMM์ ํด๋ฌ์คํฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ชจ์์ ๊ฐ์ง ์ ์๋ ํ๋์ ํด๋ฌ์คํฐ๋งํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค โ ์๋ฅผ ๋ค์ด, ๊ฐ ํ๋กํ์ ๊ธฐ๋ฅ์ด ๊ฐ์ฐ์์๊ณผ ์ ์ฌํ์ง๋ง ๊ณ ์ ํ ๋ถ์ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ํ๋ ํ๋กํ์ ๋ฐ๋ผ ์ฌ์ฉ์๋ฅผ ๊ทธ๋ฃนํํ๋ ๊ฒ์ ๋๋ค. ๋ ๋ค๋ฅธ ์๋๋ฆฌ์ค๋ ํผ์ฑ ํ์ง์์ ํฉ๋ฒ์ ์ธ ์ด๋ฉ์ผ ๊ธฐ๋ฅ์ด ํ๋์ ๊ฐ์ฐ์์ ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๊ณ , ์๋ ค์ง ํผ์ฑ์ด ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๋ฉฐ, ์๋ก์ด ํผ์ฑ ์บ ํ์ธ์ด ๊ธฐ์กด ํผํฉ์ ๋นํด ๋ณ๋์ ๊ฐ์ฐ์์ ๋๋ ๋ฎ์ ํ๋ฅ ํฌ์ธํธ๋ก ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ์ ๋ฐ ํ๊ณ
GMM์ ๊ณต๋ถ์ฐ์ ํฌํจํ๋ K-ํ๊ท ์ ์ผ๋ฐํ๋ก, ํด๋ฌ์คํฐ๊ฐ ํ์ํ์ผ ์ ์์ต๋๋ค(๊ตฌํ์ ๊ตญํ๋์ง ์์). ๊ณต๋ถ์ฐ์ด ์์ ํ ๊ฒฝ์ฐ ์๋ก ๋ค๋ฅธ ํฌ๊ธฐ์ ๋ชจ์์ ํด๋ฌ์คํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํด๋ฌ์คํฐ ๊ฒฝ๊ณ๊ฐ ๋ชจํธํ ๋ ์ํํธ ํด๋ฌ์คํฐ๋ง์ ์ฅ์ ์ ๋๋ค โ ์๋ฅผ ๋ค์ด, ์ฌ์ด๋ฒ ๋ณด์์์ ์ด๋ฒคํธ๋ ์ฌ๋ฌ ๊ณต๊ฒฉ ์ ํ์ ํน์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค; GMM์ ํ๋ฅ ๋ก ๊ทธ ๋ถํ์ค์ฑ์ ๋ฐ์ํ ์ ์์ต๋๋ค. GMM์ ๋ํ ๋ฐ์ดํฐ์ ํ๋ฅ ๋ฐ๋ ์ถ์ ์ ์ ๊ณตํ์ฌ ์ด์๊ฐ(๋ชจ๋ ํผํฉ ๊ตฌ์ฑ ์์ ์๋์์ ๋ฎ์ ์ฐ๋๋ฅผ ๊ฐ์ง ํฌ์ธํธ)์ ํ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
๋จ์ ์ผ๋ก๋ GMM์ด ๊ตฌ์ฑ ์์ K์ ์๋ฅผ ์ง์ ํด์ผ ํ๋ค๋ ์ ์ด ์์ต๋๋ค(๊ทธ๋ฌ๋ BIC/AIC์ ๊ฐ์ ๊ธฐ์ค์ ์ฌ์ฉํ์ฌ ์ ํํ ์ ์์ต๋๋ค). EM์ ๋๋๋ก ๋๋ฆฌ๊ฒ ์๋ ดํ๊ฑฐ๋ ์ง์ญ ์ต์ ์ ์ ์๋ ดํ ์ ์์ผ๋ฏ๋ก ์ด๊ธฐํ๊ฐ ์ค์ํฉ๋๋ค(์ข ์ข EM์ ์ฌ๋ฌ ๋ฒ ์คํํฉ๋๋ค). ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ๊ฐ์ฐ์์์ ํผํฉ์ ๋ฐ๋ฅด์ง ์๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ด ๋ถ์ ํฉํ ์ ์์ต๋๋ค. ํ๋์ ๊ฐ์ฐ์์์ด ๋จ์ง ์ด์๊ฐ์ ๋ฎ๊ธฐ ์ํด ์ถ์๋๋ ์ํ๋ ์์ผ๋ฉฐ(์ ๊ทํ ๋๋ ์ต์ ๊ณต๋ถ์ฐ ๊ฒฝ๊ณ๋ก ์ํํ ์ ์์).
์์ -- ์ํํธ ํด๋ฌ์คํฐ๋ง ๋ฐ ์ด์ ์ ์
```python from sklearn.mixture import GaussianMixtureFit a GMM with 3 components to the normal traffic data
gmm = GaussianMixture(n_components=3, covariance_type=โfullโ, random_state=0) gmm.fit(base_data) # using the 1500 normal data points from PCA example
Print the learned Gaussian parameters
print(โGMM means:\nโ, gmm.means_) print(โGMM covariance matrices:\nโ, gmm.covariances_)
Take a sample attack-like point and evaluate it
sample_attack = np.array([[200, 800]]) # an outlier similar to earlier attack cluster probs = gmm.predict_proba(sample_attack) log_likelihood = gmm.score_samples(sample_attack) print(โCluster membership probabilities for sample attack:โ, probs) print(โLog-likelihood of sample attack under GMM:โ, log_likelihood)
์ด ์ฝ๋์์๋ ์ ์ ํธ๋ํฝ์์ 3๊ฐ์ ๊ฐ์ฐ์์์ผ๋ก GMM์ ํ๋ จํฉ๋๋ค(์ ์ ํธ๋ํฝ์ 3๊ฐ ํ๋กํ์ ์๊ณ ์๋ค๊ณ ๊ฐ์ ). ์ธ์๋ ํ๊ท ๊ณผ ๊ณต๋ถ์ฐ์ ์ด๋ฌํ ํด๋ฌ์คํฐ๋ฅผ ์ค๋ช
ํฉ๋๋ค(์๋ฅผ ๋ค์ด, ํ๋์ ํ๊ท ์ [50,500] ๊ทผ์ฒ์ผ ์ ์์ผ๋ฉฐ ์ด๋ ํ๋์ ํด๋ฌ์คํฐ ์ค์ฌ์ ํด๋นํฉ๋๋ค). ๊ทธ๋ฐ ๋ค์ ์์ฌ์ค๋ฌ์ด ์ฐ๊ฒฐ [duration=200, bytes=800]์ ํ
์คํธํฉ๋๋ค. predict_proba๋ ์ด ์ ์ด 3๊ฐ์ ํด๋ฌ์คํฐ ๊ฐ๊ฐ์ ์ํ ํ๋ฅ ์ ์ ๊ณตํฉ๋๋ค. [200,800]์ด ์ ์ ํด๋ฌ์คํฐ์์ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ผ๋ฏ๋ก ์ด๋ฌํ ํ๋ฅ ์ ๋งค์ฐ ๋ฎ๊ฑฐ๋ ํฌ๊ฒ ์๊ณก๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ์ ์ฒด score_samples(๋ก๊ทธ ์ฐ๋)๊ฐ ์ธ์๋๋ฉฐ, ๋งค์ฐ ๋ฎ์ ๊ฐ์ ํด๋น ์ ์ด ๋ชจ๋ธ์ ์ ๋ง์ง ์์์ ๋ํ๋ด์ด ์ด๋ฅผ ์ด์์น๋ก ํ๋๊ทธํฉ๋๋ค. ์ค์ ๋ก๋ ๋ก๊ทธ ์ฐ๋(๋๋ ์ต๋ ํ๋ฅ )์ ์๊ณ๊ฐ์ ์ค์ ํ์ฌ ์ ์ด ์
์์ ์ด๋ผ๊ณ ๊ฐ์ฃผ๋ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ GMM์ ์ด์ ํ์ง๋ฅผ ์ํํ๋ ์์น์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ ๋ถํ์ค์ฑ์ ์ธ์ ํ๋ ๋ถ๋๋ฌ์ด ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค.
### Isolation Forest
**Isolation Forest**๋ ์ ์ ๋ฌด์์๋ก ๊ฒฉ๋ฆฌํ๋ ์์ด๋์ด์ ๊ธฐ๋ฐํ ์์๋ธ ์ด์ ํ์ง ์๊ณ ๋ฆฌ์ฆ์
๋๋ค. ์๋ฆฌ๋ ์ด์์น๋ ์ ๊ณ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ ์ ๋ณด๋ค ๊ฒฉ๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฝ๋ค๋ ๊ฒ์
๋๋ค. Isolation Forest๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌด์์๋ก ๋ถํ ํ๋ ๋ง์ ์ด์ง ๊ฒฉ๋ฆฌ ํธ๋ฆฌ(๋ฌด์์ ๊ฒฐ์ ํธ๋ฆฌ)๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ํธ๋ฆฌ์ ๊ฐ ๋
ธ๋์์ ๋ฌด์์ ํน์ฑ์ด ์ ํ๋๊ณ ํด๋น ํน์ฑ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ ์ฌ์ด์์ ๋ฌด์์ ๋ถํ ๊ฐ์ด ์ ํ๋ฉ๋๋ค. ์ด ๋ถํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๊ฐ์ ๊ฐ์ง๋ก ๋๋๋๋ค. ๊ฐ ์ ์ด ์์ ์ ๋ฆฌํ์ ๊ฒฉ๋ฆฌ๋๊ฑฐ๋ ์ต๋ ํธ๋ฆฌ ๋์ด์ ๋๋ฌํ ๋๊น์ง ํธ๋ฆฌ๊ฐ ์ฑ์ฅํฉ๋๋ค.
์ด์ ํ์ง๋ ์ด๋ฌํ ๋ฌด์์ ํธ๋ฆฌ์์ ๊ฐ ์ ์ ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ๊ด์ฐฐํ์ฌ ์ํ๋ฉ๋๋ค. ์ฆ, ์ ์ ๊ฒฉ๋ฆฌํ๋ ๋ฐ ํ์ํ ๋ถํ ์์
๋๋ค. ์ง๊ด์ ์ผ๋ก, ์ด์์น(์ด์๊ฐ)๋ ๋ฌด์์ ๋ถํ ์ด ํฌ์ ์ง์ญ์ ์๋ ์ด์์น๋ฅผ ๋ถ๋ฆฌํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋๊ธฐ ๋๋ฌธ์ ๋ ๋นจ๋ฆฌ ๊ฒฉ๋ฆฌ๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. Isolation Forest๋ ๋ชจ๋ ํธ๋ฆฌ์์ ํ๊ท ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด์ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค: ํ๊ท ๊ฒฝ๋ก๊ฐ ์งง์์๋ก โ ๋ ์ด์์ ์
๋๋ค. ์ ์๋ ์ผ๋ฐ์ ์ผ๋ก [0,1]๋ก ์ ๊ทํ๋๋ฉฐ, 1์ ๋งค์ฐ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ด์์น๋ฅผ ์๋ฏธํฉ๋๋ค.
> [!TIP]
> *์ฌ์ด๋ฒ ๋ณด์์ ์ฌ์ฉ ์ฌ๋ก:* Isolation Forest๋ ์นจ์
ํ์ง ๋ฐ ์ฌ๊ธฐ ํ์ง์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ํ๋์ด ๋๋ถ๋ถ์ธ ๋คํธ์ํฌ ํธ๋ํฝ ๋ก๊ทธ์์ Isolation Forest๋ฅผ ํ๋ จํ๋ฉด, ์ฒ์ ์ด์ ํธ๋ํฝ(์: ๋ค์ด๋ณธ ์ ์๋ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ IP ๋๋ ๋น์ ์์ ์ธ ํจํท ํฌ๊ธฐ ํจํด)์ ๋ํด ์งง์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ฌ ๊ฒ์ฌ๋ฅผ ์ํด ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค. ๋ ์ด๋ธ์ด ์ง์ ๋ ๊ณต๊ฒฉ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ ค์ง์ง ์์ ๊ณต๊ฒฉ ์ ํ์ ํ์งํ๋ ๋ฐ ์ ํฉํฉ๋๋ค. ๋ํ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ๋ฐ์ดํฐ์ ๋ฐฐํฌํ์ฌ ๊ณ์ ํ์ทจ๋ฅผ ํ์งํ ์ ์์ต๋๋ค(์ด์์ ์ธ ๋ก๊ทธ์ธ ์๊ฐ์ด๋ ์์น๊ฐ ๋น ๋ฅด๊ฒ ๊ฒฉ๋ฆฌ๋ฉ๋๋ค). ํ ์ฌ์ฉ ์ฌ๋ก์์ Isolation Forest๋ ์์คํ
๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ฉํธ๋ฆญ ์กฐํฉ(CPU, ๋คํธ์ํฌ, ํ์ผ ๋ณ๊ฒฝ)์ด ์ญ์ฌ์ ํจํด๊ณผ ๋งค์ฐ ๋ค๋ฅด๊ฒ ๋ณด์ผ ๋ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ์ฌ ๊ธฐ์
์ ๋ณดํธํ ์ ์์ต๋๋ค.
#### Assumptions and Limitations
**์ฅ์ **: Isolation Forest๋ ๋ถํฌ ๊ฐ์ ์ ํ์๋ก ํ์ง ์์ผ๋ฉฐ, ๊ฒฉ๋ฆฌ๋ฅผ ์ง์ ๋ชฉํ๋ก ํฉ๋๋ค. ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์์ ํจ์จ์ ์ด๋ฉฐ(์ฒ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ํ ๋ณต์ก๋ $O(n\log n)$) ๊ฐ ํธ๋ฆฌ๋ ์ค์ง ์ผ๋ถ ํน์ฑ๊ณผ ๋ถํ ๋ก ์ ์ ๊ฒฉ๋ฆฌํฉ๋๋ค. ์ซ์ ํน์ฑ์ ์ ์ฒ๋ฆฌํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฉฐ, $O(n^2)$์ผ ์ ์๋ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค. ๋ํ ์๋์ผ๋ก ์ด์ ์ ์๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๊ฒฝ๊ณ ๋ฅผ ์ํ ์๊ณ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค(๋๋ ์์ ์ด์์น ๋น์จ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ปท์คํ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ค์ผ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค).
**์ ํ ์ฌํญ**: ๋ฌด์์ ํน์ฑ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ ์คํ ๊ฐ์ ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค(์ถฉ๋ถํ ์์ ํธ๋ฆฌ๊ฐ ์์ ๊ฒฝ์ฐ ์ด๋ ๋ฏธ๋ฏธํฉ๋๋ค). ๋ฐ์ดํฐ์ ๋ง์ ๊ด๋ จ ์๋ ํน์ฑ์ด ์๊ฑฐ๋ ์ด์์น๊ฐ ์ด๋ค ํน์ฑ์์๋ ๊ฐํ๊ฒ ๊ตฌ๋ณ๋์ง ์์ผ๋ฉด ๊ฒฉ๋ฆฌ๊ฐ ํจ๊ณผ์ ์ด์ง ์์ ์ ์์ต๋๋ค(๋ฌด์์ ๋ถํ ์ด ์ฐ์ฐํ ์ ์ ์ ์ ๊ฒฉ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ ํธ๋ฆฌ๋ฅผ ํ๊ท ํํ๋ฉด ์ด๋ฅผ ์ํํฉ๋๋ค). ๋ํ, Isolation Forest๋ ์ผ๋ฐ์ ์ผ๋ก ์ด์์น๊ฐ ์์๋ผ๋ ๊ฒ์ ๊ฐ์ ํฉ๋๋ค(์ด๋ ์ฌ์ด๋ฒ ๋ณด์ ์๋๋ฆฌ์ค์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ค์
๋๋ค).
<details>
<summary>์์ -- ๋คํธ์ํฌ ๋ก๊ทธ์์ ์ด์์น ํ์ง
</summary>
์ด์ ํ
์คํธ ๋ฐ์ดํฐ์
(์ ์ ๋ฐ ์ผ๋ถ ๊ณต๊ฒฉ ์ ์ ํฌํจ)์ ์ฌ์ฉํ์ฌ Isolation Forest๋ฅผ ์คํํ์ฌ ๊ณต๊ฒฉ์ ๋ถ๋ฆฌํ ์ ์๋์ง ํ์ธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ์ ์ฝ 15%๊ฐ ์ด์์ ์ผ ๊ฒ์ผ๋ก ์์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
```python
from sklearn.ensemble import IsolationForest
# Combine normal and attack test data from autoencoder example
X_test_if = test_data # (120 x 2 array with 100 normal and 20 attack points)
# Train Isolation Forest (unsupervised) on the test set itself for demo (in practice train on known normal)
iso_forest = IsolationForest(n_estimators=100, contamination=0.15, random_state=0)
iso_forest.fit(X_test_if)
# Predict anomalies (-1 for anomaly, 1 for normal)
preds = iso_forest.predict(X_test_if)
anomaly_scores = iso_forest.decision_function(X_test_if) # the higher, the more normal
print("Isolation Forest predicted labels (first 20):", preds[:20])
print("Number of anomalies detected:", np.sum(preds == -1))
print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5])
์ด ์ฝ๋์์๋ 100๊ฐ์ ํธ๋ฆฌ๋ก IsolationForest๋ฅผ ์ธ์คํด์คํํ๊ณ contamination=0.15๋ก ์ค์ ํฉ๋๋ค(์ฆ, ์ฝ 15%์ ์ด์์น๋ฅผ ์์ํ๋ฉฐ, ๋ชจ๋ธ์ ~15%์ ํฌ์ธํธ๊ฐ ํ๋๊ทธ๊ฐ ์ง์ ๋๋๋ก ์ ์ ์๊ณ๊ฐ์ ์ค์ ํฉ๋๋ค). ์ฐ๋ฆฌ๋ ์ ์ ํฌ์ธํธ์ ๊ณต๊ฒฉ ํฌ์ธํธ๊ฐ ํผํฉ๋ X_test_if์ ๋ง์ถฅ๋๋ค(์ฐธ๊ณ : ์ผ๋ฐ์ ์ผ๋ก๋ ํ๋ จ ๋ฐ์ดํฐ์ ๋ง์ถ ํ ์๋ก์ด ๋ฐ์ดํฐ์ ๋ํด ์์ธกํ์ง๋ง, ์ฌ๊ธฐ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ๊ด์ฐฐํ๊ธฐ ์ํด ๊ฐ์ ์ธํธ์ ๋ง์ถ๊ณ ์์ธกํฉ๋๋ค).
์ถ๋ ฅ์ ์ฒซ 20 ํฌ์ธํธ์ ๋ํ ์์ธก ๋ ์ด๋ธ์ ๋ณด์ฌ์ค๋๋ค(-1์ ์ด์์น๋ฅผ ๋ํ๋ ๋๋ค). ์ฐ๋ฆฌ๋ ์ด ๋ช ๊ฐ์ ์ด์์น๊ฐ ๊ฐ์ง๋์๋์ง์ ๋ช ๊ฐ์ง ์์ ์ด์์น ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ 120 ํฌ์ธํธ ์ค ์ฝ 18๊ฐ๊ฐ -1๋ก ๋ ์ด๋ธ์ด ์ง์ ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค(์ค์ผ๋๊ฐ 15%์๊ธฐ ๋๋ฌธ์ ๋๋ค). ์ฐ๋ฆฌ์ 20๊ฐ ๊ณต๊ฒฉ ์ํ์ด ์ค์ ๋ก ๊ฐ์ฅ ์ธ๊ณฝ์ ์๋ค๋ฉด, ๊ทธ๋ค ๋๋ถ๋ถ์ -1 ์์ธก์ ๋ํ๋์ผ ํฉ๋๋ค. ์ด์์น ์ ์(Isolation Forest์ ๊ฒฐ์ ํจ์)๋ ์ ์ ํฌ์ธํธ์ ๋ํด ๋ ๋๊ณ ์ด์์น์ ๋ํด ๋ ๋ฎ์ต๋๋ค(๋ ๋ถ์ ์ ) โ ์ฐ๋ฆฌ๋ ๋ถ๋ฆฌ๋ฅผ ๋ณด๊ธฐ ์ํด ๋ช ๊ฐ์ง ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค. ์ค์ ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์๋ณ๋ก ์ ๋ ฌํ์ฌ ์์ ์ด์์น๋ฅผ ๋ณด๊ณ ์กฐ์ฌํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ Isolation Forest๋ ๋๊ท๋ชจ ๋นํ์ ๋ณด์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ณํ๊ณ ์ธ๊ฐ ๋ถ์์ด๋ ์ถ๊ฐ ์๋ ๊ฒํ ๋ฅผ ์ํด ๊ฐ์ฅ ๋ถ๊ท์นํ ์ธ์คํด์ค๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
t-SNE (t-๋ถํฌ ํ๋ฅ ์ ์ด์ ์๋ฒ ๋ฉ)
t-SNE๋ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ 2์ฐจ์ ๋๋ 3์ฐจ์์ผ๋ก ์๊ฐํํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ๋น์ ํ ์ฐจ์ ์ถ์ ๊ธฐ๋ฒ์ ๋๋ค. ๋ฐ์ดํฐ ํฌ์ธํธ ๊ฐ์ ์ ์ฌ์ฑ์ ๊ฒฐํฉ ํ๋ฅ ๋ถํฌ๋ก ๋ณํํ๊ณ ์ ์ฐจ์ ํฌ์์์ ์ง์ญ ์ด์์ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ๋ ค๊ณ ํฉ๋๋ค. ๊ฐ๋จํ ๋งํด, t-SNE๋ (์๋ฅผ ๋ค์ด) 2D์์ ์ ์ฌํ ํฌ์ธํธ(์๋ ๊ณต๊ฐ์์)๊ฐ ์๋ก ๊ฐ๊น์ด ์์นํ๊ณ ๋น์ ์ฌํ ํฌ์ธํธ๊ฐ ๋ฉ๋ฆฌ ๋จ์ด์ง๋๋ก ๋ฐฐ์นํฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ์๋ณ ์นํ๋ ๊ณ์ฐ: ๊ฐ ํฌ์ธํธ ์์ ๋ํด t-SNE๋ ๊ทธ ์์ ์ด์์ผ๋ก ์ ํํ ํ๋ฅ ์ ๊ณ์ฐํฉ๋๋ค(์ด๋ ๊ฐ ํฌ์ธํธ์ ๊ฐ์ฐ์์ ๋ถํฌ๋ฅผ ์ค์ฌ์ผ๋ก ํ๊ณ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ์ฌ ์ํ๋ฉ๋๋ค โ ํผ๋๋ ๋งค๊ฐ๋ณ์๋ ๊ณ ๋ ค๋๋ ์ด์์ ํจ๊ณผ์ ์ธ ์์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค).
- ์ ์ฐจ์(์: 2D) ๊ณต๊ฐ์์ ์๋ณ ์นํ๋ ๊ณ์ฐ: ์ฒ์์ ํฌ์ธํธ๋ 2D์์ ๋ฌด์์๋ก ๋ฐฐ์น๋ฉ๋๋ค. t-SNE๋ ์ด ๋งต์์ ๊ฑฐ๋ฆฌ์ ์ ์ฌํ ํ๋ฅ ์ ์ ์ํฉ๋๋ค(๊ฐ์ฐ์์๋ณด๋ค ๋ ๋๊บผ์ด ๊ผฌ๋ฆฌ๋ฅผ ๊ฐ์ง ์คํ๋ํธ t-๋ถํฌ ์ปค๋์ ์ฌ์ฉํ์ฌ ๋จผ ํฌ์ธํธ์ ๋ ๋ง์ ์์ ๋ฅผ ํ์ฉํฉ๋๋ค).
- ๊ฒฝ๋ ํ๊ฐ๋ฒ: t-SNE๋ ๊ณ ์ฐจ์ ์นํ๋ ๋ถํฌ์ ์ ์ฐจ์ ๋ถํฌ ๊ฐ์ ์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ(KL) ๋ฐ์ฐ์ ์ต์ํํ๊ธฐ ์ํด 2D์์ ํฌ์ธํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ 2D ๋ฐฐ์ด์ด ๊ฐ๋ฅํ ํ ๊ณ ์ฐจ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํ๋๋ก ํฉ๋๋ค โ ์๋ ๊ณต๊ฐ์์ ๊ฐ๊น์ ๋ ํฌ์ธํธ๋ ์๋ก ๋์ด๋น๊ธฐ๊ณ , ๋ฉ๋ฆฌ ๋จ์ด์ง ํฌ์ธํธ๋ ๋ฐ์ด๋ด์ด ๊ท ํ์ ์ฐพ์ ๋๊น์ง ์งํ๋ฉ๋๋ค.
๊ฒฐ๊ณผ๋ ๋ฐ์ดํฐ์ ํด๋ฌ์คํฐ๊ฐ ๋ช ํํด์ง๋ ์๊ฐ์ ์ผ๋ก ์๋ฏธ ์๋ ์ฐ์ ๋๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
Tip
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: t-SNE๋ ์ข ์ข ์ธ๊ฐ ๋ถ์์ ์ํ ๊ณ ์ฐจ์ ๋ณด์ ๋ฐ์ดํฐ ์๊ฐํ์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณด์ ์ด์ ์ผํฐ์์ ๋ถ์๊ฐ๋ ์์ญ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง ์ด๋ฒคํธ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ ธ์(tcp ํฌํธ ๋ฒํธ, ๋น๋, ๋ฐ์ดํธ ์ ๋ฑ) t-SNE๋ฅผ ์ฌ์ฉํ์ฌ 2D ํ๋กฏ์ ์์ฑํ ์ ์์ต๋๋ค. ๊ณต๊ฒฉ์ ์ด ํ๋กฏ์์ ์ ์ ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ๋๊ฑฐ๋ ์์ฒด ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ์ฌ ์๋ณํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ๋งฌ์จ์ด ๋ฐ์ดํฐ ์ธํธ์ ์ ์ฉ๋์ด ๋งฌ์จ์ด ๊ฐ์กฑ์ ๊ทธ๋ฃนํ๋ฅผ ๋ณด๊ฑฐ๋ ์๋ก ๋ค๋ฅธ ๊ณต๊ฒฉ ์ ํ์ด ๋๋ ทํ๊ฒ ํด๋ฌ์คํฐ๋ง๋๋ ๋คํธ์ํฌ ์นจ์ ๋ฐ์ดํฐ์ ์ ์ฉ๋์ด ์ถ๊ฐ ์กฐ์ฌ๋ฅผ ์๋ดํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก t-SNE๋ ์ฌ์ด๋ฒ ๋ฐ์ดํฐ์์ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ์ ๋ฐ ํ๊ณ
t-SNE๋ ํจํด์ ์๊ฐ์ ๋ฐ๊ฒฌ์ ํ๋ฅญํฉ๋๋ค. ์ด๋ ๋ค๋ฅธ ์ ํ ๋ฐฉ๋ฒ(PCA์ ๊ฐ์)์ผ๋ก๋ ๋๋ฌ๋์ง ์์ ์ ์๋ ํด๋ฌ์คํฐ, ํ์ ํด๋ฌ์คํฐ ๋ฐ ์ด์์น๋ฅผ ๋๋ฌ๋ผ ์ ์์ต๋๋ค. ์ด๋ ๋งฌ์จ์ด ํ๋ ํ๋กํ์ผ์ด๋ ๋คํธ์ํฌ ํธ๋ํฝ ํจํด๊ณผ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ธฐ ์ํด ์ฌ์ด๋ฒ ๋ณด์ ์ฐ๊ตฌ์ ์ฌ์ฉ๋์์ต๋๋ค. ์ง์ญ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฌ์ด ๊ทธ๋ฃนํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐ ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ t-SNE๋ ๊ณ์ฐ์ ์ผ๋ก ๋ ๋ฌด๊ฒ์ต๋๋ค(์ฝ $O(n^2)$) ๋ฐ๋ผ์ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ํ๋ง์ด ํ์ํ ์ ์์ต๋๋ค. ๋ํ ์ถ๋ ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ํ์ดํผํ๋ผ๋ฏธํฐ(ํผ๋๋, ํ์ต๋ฅ , ๋ฐ๋ณต ํ์)๊ฐ ์์ต๋๋ค โ ์๋ฅผ ๋ค์ด, ์๋ก ๋ค๋ฅธ ํผ๋๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ค์ผ์ผ์์ ํด๋ฌ์คํฐ๋ฅผ ๋๋ฌ๋ผ ์ ์์ต๋๋ค. t-SNE ํ๋กฏ์ ๋๋๋ก ์๋ชป ํด์๋ ์ ์์ต๋๋ค โ ๋งต์ ๊ฑฐ๋ฆฌ๋ค์ ์ ์ญ์ ์ผ๋ก ์ง์ ์ ์ผ๋ก ์๋ฏธ๊ฐ ์์ผ๋ฉฐ(์ง์ญ ์ด์์ ์ด์ ์ ๋ง์ถ๊ธฐ ๋๋ฌธ์, ๋๋๋ก ํด๋ฌ์คํฐ๊ฐ ์ธ์์ ์ผ๋ก ์ ๋ถ๋ฆฌ๋์ด ๋ณด์ผ ์ ์์ต๋๋ค). ๋ํ t-SNE๋ ์ฃผ๋ก ์๊ฐํ๋ฅผ ์ํ ๊ฒ์ด๋ฉฐ, ์๋ก์ด ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ง์ ์ ์ผ๋ก ํฌ์ํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ, ์์ธก ๋ชจ๋ธ๋ง์ ์ํ ์ ์ฒ๋ฆฌ๋ก ์ฌ์ฉ๋๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค(UMAP์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ ๋น ๋ฅธ ์๋๋ก ํด๊ฒฐํ๋ ๋์์ ๋๋ค).
์์ -- ๋คํธ์ํฌ ์ฐ๊ฒฐ ์๊ฐํ
์ฐ๋ฆฌ๋ t-SNE๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ํน์ฑ ๋ฐ์ดํฐ ์ธํธ๋ฅผ 2D๋ก ์ถ์ํ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด์ ์ 4D ๋ฐ์ดํฐ(์ ์ ํธ๋ํฝ์ 3๊ฐ์ ์์ฐ ํด๋ฌ์คํฐ๊ฐ ์์์)์ ๋ช ๊ฐ์ ์ด์์น ํฌ์ธํธ๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ t-SNE๋ฅผ ์คํํ๊ณ (๊ฐ๋ ์ ์ผ๋ก) ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํฉ๋๋ค.
# 1 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Create synthetic 4-D dataset
# โข Three clusters of โnormalโ traffic (duration, bytes)
# โข Two correlated features: packets & errors
# โข Five outlier points to simulate suspicious traffic
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
rng = np.random.RandomState(42)
# Base (duration, bytes) clusters
normal1 = rng.normal(loc=[50, 500], scale=[10, 100], size=(500, 2))
normal2 = rng.normal(loc=[60, 1500], scale=[8, 200], size=(500, 2))
normal3 = rng.normal(loc=[70, 3000], scale=[5, 300], size=(500, 2))
base_data = np.vstack([normal1, normal2, normal3]) # (1500, 2)
# Correlated features
packets = base_data[:, 1] / 50 + rng.normal(scale=0.5, size=len(base_data))
errors = base_data[:, 0] / 10 + rng.normal(scale=0.5, size=len(base_data))
data_4d = np.column_stack([base_data, packets, errors]) # (1500, 4)
# Outlier / attack points
outliers_4d = np.column_stack([
rng.normal(250, 1, size=5), # extreme duration
rng.normal(1000, 1, size=5), # moderate bytes
rng.normal(5, 1, size=5), # very low packets
rng.normal(25, 1, size=5) # high errors
])
data_viz = np.vstack([data_4d, outliers_4d]) # (1505, 4)
# 2 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Standardize features (recommended for t-SNE)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data_viz)
# 3 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Run t-SNE to project 4-D โ 2-D
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
tsne = TSNE(
n_components=2,
perplexity=30,
learning_rate='auto',
init='pca',
random_state=0
)
data_2d = tsne.fit_transform(data_scaled)
print("t-SNE output shape:", data_2d.shape) # (1505, 2)
# 4 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Visualize: normal traffic vs. outliers
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
plt.figure(figsize=(8, 6))
plt.scatter(
data_2d[:-5, 0], data_2d[:-5, 1],
label="Normal traffic",
alpha=0.6,
s=10
)
plt.scatter(
data_2d[-5:, 0], data_2d[-5:, 1],
label="Outliers / attacks",
alpha=0.9,
s=40,
marker="X",
edgecolor='k'
)
plt.title("t-SNE Projection of Synthetic Network Traffic")
plt.xlabel("t-SNE component 1")
plt.ylabel("t-SNE component 2")
plt.legend()
plt.tight_layout()
plt.show()
์ฌ๊ธฐ์์๋ ์ด์ ์ 4D ์ ์ ๋ฐ์ดํฐ์ ๊ณผ ๊ทน๋จ์ ์ธ ์ด์์น ๋ช ๊ฐ๋ฅผ ๊ฒฐํฉํ์ต๋๋ค(์ด์์น๋ ํ๋์ ํน์ฑ(โdurationโ)์ด ๋งค์ฐ ๋๊ฒ ์ค์ ๋์ด ์์ด ์ด์ํ ํจํด์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค). ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ํผ๋๋ 30์ผ๋ก t-SNE๋ฅผ ์คํํฉ๋๋ค. ์ถ๋ ฅ ๋ฐ์ดํฐ data_2d์ ํํ๋ (1505, 2)์ ๋๋ค. ์ด ํ ์คํธ์์๋ ์ค์ ๋ก ํ๋กฏ์ ๊ทธ๋ฆฌ์ง ์๊ฒ ์ง๋ง, ๋ง์ฝ ๊ทธ๋ฆฐ๋ค๋ฉด 3๊ฐ์ ์ ์ ํด๋ฌ์คํฐ์ ํด๋นํ๋ ์ธ ๊ฐ์ ๋ฐ์ง ํด๋ฌ์คํฐ์ ๊ทธ ํด๋ฌ์คํฐ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ณ ๋ฆฝ๋ ์ ์ผ๋ก ๋ํ๋๋ 5๊ฐ์ ์ด์์น๋ฅผ ๋ณผ ์ ์์ ๊ฒ์ ๋๋ค. ์ธํฐ๋ํฐ๋ธ ์ํฌํ๋ก์ฐ์์๋ ๋ ์ด๋ธ(์ ์ ๋๋ ์ด๋ค ํด๋ฌ์คํฐ, ๋ ์ด์์น)์ ๋ฐ๋ผ ์ ์ ์์์ ์ง์ ํ์ฌ ์ด ๊ตฌ์กฐ๋ฅผ ๊ฒ์ฆํ ์ ์์ต๋๋ค. ๋ ์ด๋ธ์ด ์๋๋ผ๋ ๋ถ์๊ฐ๋ 2D ํ๋กฏ์์ ๋น ๊ณต๊ฐ์ ์๋ 5๊ฐ์ ์ ์ ๋ฐ๊ฒฌํ๊ณ ์ด๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ์ด๋ t-SNE๊ฐ ์ฌ์ด๋ฒ ๋ณด์ ๋ฐ์ดํฐ์์ ์๊ฐ์ ์ด์ ํ์ง ๋ฐ ํด๋ฌ์คํฐ ๊ฒ์ฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ ์ ์์์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์์ ์๋ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์ํฉ๋๋ค.
HDBSCAN (๋ ธ์ด์ฆ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ธต ๋ฐ๋ ๊ธฐ๋ฐ ๊ณต๊ฐ ํด๋ฌ์คํฐ๋ง)
HDBSCAN์ ๋จ์ผ ์ ์ญ eps ๊ฐ์ ์ ํํ ํ์๋ฅผ ์์ ๊ณ ๋ฐ๋๊ฐ ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ฅผ ๋ณต๊ตฌํ ์ ์๋๋ก ๋ฐ๋ ์ฐ๊ฒฐ ๊ตฌ์ฑ ์์์ ๊ณ์ธต์ ๊ตฌ์ถํ ๋ค์ ์ด๋ฅผ ์์ถํ๋ DBSCAN์ ํ์ฅ์
๋๋ค. ์ผ๋ฐ์ ์ธ DBSCAN๊ณผ ๋น๊ตํ ๋ ๋ณดํต
- ์ผ๋ถ ํด๋ฌ์คํฐ๊ฐ ๋ฐ์งํ๊ณ ๋ค๋ฅธ ํด๋ฌ์คํฐ๊ฐ ํฌ๋ฐํ ๋ ๋ ์ง๊ด์ ์ธ ํด๋ฌ์คํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
- ํ๋์ ์ค์ ํ์ดํผํ๋ผ๋ฏธํฐ(
min_cluster_size)์ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ๋ง ๊ฐ์ง๋๋ค. - ๋ชจ๋ ์ ์ ํด๋ฌ์คํฐ ๋ฉค๋ฒ์ญ ํ๋ฅ ๊ณผ ์ด์์น ์ ์(
outlier_scores_)๋ฅผ ๋ถ์ฌํ์ฌ ์ํ ํ์ง ๋์๋ณด๋์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
Tip
์ฌ์ด๋ฒ ๋ณด์์ ์ฌ์ฉ ์ฌ๋ก: HDBSCAN์ ํ๋์ ์ํ ํ์ง ํ์ดํ๋ผ์ธ์์ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์์ผ๋ฉฐ, ์์ ์ฉ XDR ์ค์ํธ์ ํจ๊ป ์ ๊ณต๋๋ ๋ ธํธ๋ถ ๊ธฐ๋ฐ ํ์ง ํ๋ ์ด๋ถ ๋ด์์ ์์ฃผ ๋ณผ ์ ์์ต๋๋ค. ํ๋์ ์ค์ฉ์ ์ธ ๋ ์ํผ๋ IR ๋์ HTTP ๋น์ฝ ํธ๋ํฝ์ ํด๋ฌ์คํฐ๋งํ๋ ๊ฒ์ ๋๋ค: ์ฌ์ฉ์ ์์ด์ ํธ, ๊ฐ๊ฒฉ ๋ฐ URI ๊ธธ์ด๋ ์ข ์ข ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ง๋ ํฉ๋ฒ์ ์ธ ์ํํธ์จ์ด ์ ๋ฐ์ดํธ ๊ทธ๋ฃน์ ํ์ฑํ๋ ๋ฐ๋ฉด, C2 ๋น์ฝ์ ์์ ์ ๋ฐ๋ ํด๋ฌ์คํฐ ๋๋ ์์ํ ๋ ธ์ด์ฆ๋ก ๋จ์ ์์ต๋๋ค.
์์ โ ๋น์ฝ C2 ์ฑ๋ ์ฐพ๊ธฐ
```python import pandas as pd from hdbscan import HDBSCAN from sklearn.preprocessing import StandardScalerdf has features extracted from proxy logs
features = [ โavg_intervalโ, # seconds between requests โuri_length_meanโ, # average URI length โuser_agent_entropyโ # Shannon entropy of UA string ] X = StandardScaler().fit_transform(df[features])
hdb = HDBSCAN(min_cluster_size=15, # at least 15 similar beacons to be a group metric=โeuclideanโ, prediction_data=True) labels = hdb.fit_predict(X)
df[โclusterโ] = labels
Anything with label == -1 is noise โ inspect as potential C2
suspects = df[df[โclusterโ] == -1] print(โSuspect beacon count:โ, len(suspects))
</details>
---
### ๊ฐ๊ฑด์ฑ ๋ฐ ๋ณด์ ๊ณ ๋ ค์ฌํญ โ ์ค์ผ ๋ฐ ์ ๋์ ๊ณต๊ฒฉ (2023-2025)
์ต๊ทผ ์ฐ๊ตฌ์ ๋ฐ๋ฅด๋ฉด **๋น์ง๋ ํ์ต์๋ *์ ๊ทน์ ์ธ ๊ณต๊ฒฉ์*์ ๋ฉด์ญ์ด *์๋๋ค***:
* **์ด์ ํ์ง๊ธฐ๋ฅผ ์ํ ๋ฐ์ดํฐ ์ค์ผ.** Chen *et al.* (IEEE S&P 2024)์ 3%์ ์กฐ์๋ ํธ๋ํฝ๋ง ์ถ๊ฐํด๋ Isolation Forest์ ECOD์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ์ด๋์์ผ ์ค์ ๊ณต๊ฒฉ์ด ์ ์์ผ๋ก ๋ณด์ด๊ฒ ํ ์ ์์์ ์
์ฆํ์ต๋๋ค. ์ ์๋ค์ ์ค์ผ ํฌ์ธํธ๋ฅผ ์๋์ผ๋ก ํฉ์ฑํ๋ ์คํ ์์ค PoC(`udo-poison`)๋ฅผ ๊ณต๊ฐํ์ต๋๋ค.
* **ํด๋ฌ์คํฐ๋ง ๋ชจ๋ธ์ ๋ฐฑ๋์ด.** *BadCME* ๊ธฐ๋ฒ (BlackHat EU 2023)์ ์์ ํธ๋ฆฌ๊ฑฐ ํจํด์ ์ฌ์ด๋์ต๋๋ค; ๊ทธ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ํ๋ ๋๋ง๋ค K-Means ๊ธฐ๋ฐ ํ์ง๊ธฐ๊ฐ ์กฐ์ฉํ ์ด๋ฒคํธ๋ฅผ โ์์ฑโ ํด๋ฌ์คํฐ ์์ ๋ฐฐ์นํฉ๋๋ค.
* **DBSCAN/HDBSCAN ํํผ.** 2025๋
KU Leuven์ ํ์ ์ฌ์ ์ธ์๋ฌผ์ ๊ณต๊ฒฉ์๊ฐ ๋ฐ๋ ๊ฐ๊ฒฉ์ ์๋์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๋น์ฝ ํจํด์ ์กฐ์ํ ์ ์์์ ๋ณด์ฌ์ฃผ์ด *๋
ธ์ด์ฆ* ๋ ์ด๋ธ ์์ ํจ๊ณผ์ ์ผ๋ก ์จ์ ์ ์์์ ๋ํ๋
๋๋ค.
์ฃผ๋ชฉ๋ฐ๊ณ ์๋ ์ํ์ฑ
:
1. **๋ชจ๋ธ ์ ํ / TRIM.** ๋ชจ๋ ์ฌํ๋ จ ์ํฌํฌ ์ ์ 1โ2%์ ์์ค์ด ๊ฐ์ฅ ๋์ ํฌ์ธํธ๋ฅผ ๋ฒ๋ ค(ํธ๋ฆฌ๋ฐ๋ ์ต๋ ์ฐ๋) ์ค์ผ์ ๊ทน์ ์ผ๋ก ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
2. **ํฉ์ ์์๋ธ.** ์ฌ๋ฌ ์ด์ง์ ์ธ ํ์ง๊ธฐ(์: Isolation Forest + GMM + ECOD)๋ฅผ ๊ฒฐํฉํ๊ณ *์ด๋ค* ๋ชจ๋ธ์ด ํฌ์ธํธ๋ฅผ ํ๋๊ทธํ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ฐ๊ตฌ์ ๋ฐ๋ฅด๋ฉด ์ด๋ ๊ณต๊ฒฉ์์ ๋น์ฉ์ 10๋ฐฐ ์ด์ ์ฆ๊ฐ์ํต๋๋ค.
3. **ํด๋ฌ์คํฐ๋ง์ ์ํ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ๋ฐฉ์ด.** `k`๊ฐ์ ์๋ก ๋ค๋ฅธ ๋๋ค ์๋๋ก ํด๋ฌ์คํฐ๋ฅผ ์ฌ๊ณ์ฐํ๊ณ ์ง์์ ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด๋ํ๋ ํฌ์ธํธ๋ฅผ ๋ฌด์ํฉ๋๋ค.
---
### ํ๋ ์คํ ์์ค ๋๊ตฌ (2024-2025)
* **PyOD 2.x** (2024๋
5์ ์ถ์)๋ *ECOD*, *COPOD* ๋ฐ GPU ๊ฐ์ *AutoFormer* ํ์ง๊ธฐ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด์ **ํ ์ค์ ์ฝ๋**๋ก ๋ฐ์ดํฐ์
์์ 30๊ฐ ์ด์์ ์๊ณ ๋ฆฌ์ฆ์ ๋น๊ตํ ์ ์๋ `benchmark` ํ์ ๋ช
๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค:
```bash
pyod benchmark --input logs.csv --label attack --n_jobs 8
- Anomalib v1.5 (2025๋ 2์)์ ๋น์ ์ค์ฌ์ด์ง๋ง ์คํฌ๋ฆฐ์ท ๊ธฐ๋ฐ ํผ์ฑ ํ์ด์ง ํ์ง๋ฅผ ์ํ ์ผ๋ฐ์ ์ธ PatchCore ๊ตฌํ๋ ํฌํจํ๊ณ ์์ต๋๋ค.
- scikit-learn 1.5 (2024๋
11์)์ ๋๋์ด ์๋ก์ด
cluster.HDBSCAN๋ํผ๋ฅผ ํตํด HDBSCAN์ ๋ํscore_samples๋ฅผ ๋ ธ์ถํ๋ฏ๋ก Python 3.12์์ ์ธ๋ถ ๊ธฐ์ฌ ํจํค์ง๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋น ๋ฅธ PyOD ์์ โ ECOD + Isolation Forest ์์๋ธ
```python from pyod.models import ECOD, IForest from pyod.utils.data import generate_data, evaluate_print from pyod.utils.example import visualizeX_train, y_train, X_test, y_test = generate_data( n_train=5000, n_test=1000, n_features=16, contamination=0.02, random_state=42)
models = [ECOD(), IForest()]
majority vote โ flag if any model thinks it is anomalous
anomaly_scores = sum(m.fit(X_train).decision_function(X_test) for m in models) / len(models)
evaluate_print(โEnsembleโ, y_test, anomaly_scores)
</details>
## References
- [HDBSCAN โ Hierarchical density-based clustering](https://github.com/scikit-learn-contrib/hdbscan)
- Chen, X. *et al.* โ๋น์ง๋ ์ด์ ํ์ง์ ๋ฐ์ดํฐ ์ค์ผ์ ๋ํ ์ทจ์ฝ์ฑ.โ *IEEE ๋ณด์ ๋ฐ ํ๋ผ์ด๋ฒ์ ์ฌํฌ์ง์*, 2024.
> [!TIP]
> AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>HackTricks ์ง์ํ๊ธฐ</summary>
>
> - [**๊ตฌ๋
๊ณํ**](https://github.com/sponsors/carlospolop) ํ์ธํ๊ธฐ!
> - **๐ฌ [**๋์ค์ฝ๋ ๊ทธ๋ฃน**](https://discord.gg/hRep4RUj7f) ๋๋ [**ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน**](https://t.me/peass)์ ์ฐธ์ฌํ๊ฑฐ๋ **ํธ์ํฐ** ๐ฆ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**๋ฅผ ํ๋ก์ฐํ์ธ์.**
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks) ๋ฐ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.**
>
> </details>


