머신러닝의 비지도(unsupervised)학습
1. 평할/분할 기반의 군집 (Partition-based Clustering)
- 비슷한 특징을 갖는 데이터끼리 묶는것이다
- 주어진 데이터에 대해 미리 정의된 수의 군집을 형성하며, 데이터를 해당 군집에 할당하는 방식으로 동작한다
ex ) K-Means Clustering
2. 계층적 군집 (Hierarchical Clustering)
- 데이터를 순차적 또는 계층적으로 그룹화하는 알고리즘
- 데이터 포인트 간의 거리 또는 유사도를 기반으로 계층 구조를 형성하여 군집을 형성
- 계층적인 구조를 가지고 있어 군집화 결과를 다양한 수준에서 살펴볼 수 있으며, 시각적으로 표현하기 쉽다
- 사전에 군집의 개수를 지정할 필요가 없어 편리
- 큰 데이터셋에 대해서는 계산 비용이 증가할 수 있고, 특정 수준에서의 군집화 결과를 해석하는 것이 어려울 수 있다
ex ) 병합 군집화 (Agglomerative Clustering) , 분할 군집화 (Divisive Clustering)
K-Means
- AI(인공지능)이 입력세트에서 패턴과 상관관계를 찾아내는 머신러닝 알고리즘이다.
- 비지도학습 중 가장 많이 쓰이는 방식이다.
- 평균을 찾아가며 y를 스스로 찾는 방식이다.
- 군집은 사람이 할당해야 한다.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Annual Income (k$) 에 비해서 Spending Score (1-100) 이 높은 그룹으로 묶기
df
CustomerID | Genre | Age | Annual Income (k$) | Spending Score (1-100) | |
0 | 1 | Male | 19 | 15 | 39 |
1 | 2 | Male | 21 | 15 | 81 |
2 | 3 | Female | 20 | 16 | 6 |
3 | 4 | Female | 23 | 16 | 77 |
4 | 5 | Female | 31 | 17 | 40 |
... | ... | ... | ... | ... | ... |
195 | 196 | Female | 35 | 120 | 79 |
196 | 197 | Female | 45 | 126 | 28 |
197 | 198 | Male | 32 | 126 | 74 |
198 | 199 | Male | 32 | 137 | 18 |
199 | 200 | Male | 30 | 137 | 83 |
nan값 정리하기
df.isna().sum()
CustomerID 0
Genre 0
Age 0
Annual Income (k$) 0
Spending Score (1-100) 0
dtype: int64
X값 정하기
Genre | Age | Annual Income (k$) | Spending Score (1-100) | |
0 | Male | 19 | 15 | 39 |
1 | Male | 21 | 15 | 81 |
2 | Female | 20 | 16 | 6 |
3 | Female | 23 | 16 | 77 |
4 | Female | 31 | 17 | 40 |
... | ... | ... | ... | ... |
195 | Female | 35 | 120 | 79 |
196 | Female | 45 | 126 | 28 |
197 | Male | 32 | 126 | 74 |
198 | Male | 32 | 137 | 18 |
199 | Male | 30 | 137 | 83 |
문자열 숫자로 바꾸기
X['Genre'].unique()
array(['Male', 'Female'], dtype=object)
'Male'과 'Female' 2개이므로 0과 1로만 바꾸면 되기때문에, 원핫인코딩(3개 이상)이 아닌 라벨 인코딩으로 하면 된다
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
X['Genre'] = encoder.fit_transform(X['Genre'])
X
Genre | Age | Annual Income (k$) | Spending Score (1-100) | |
0 | 1 | 19 | 15 | 39 |
1 | 1 | 21 | 15 | 81 |
2 | 0 | 20 | 16 | 6 |
3 | 0 | 23 | 16 | 77 |
4 | 0 | 31 | 17 | 40 |
... | ... | ... | ... | ... |
195 | 0 | 35 | 120 | 79 |
196 | 0 | 45 | 126 | 28 |
197 | 1 | 32 | 126 | 74 |
198 | 1 | 32 | 137 | 18 |
199 | 1 | 30 | 137 | 83 |
sorted(X['Genre'].unique())
['Female', 'Male']
'Female'이 0, 'Male'이 1이라는 것을 알 수 있다.
K-means는 피쳐스케일링 단계를 거치지 않는다
WCSS
from sklearn.cluster import KMeans
KMeans(n_clusters = ???, random_state=10)
n_clusters = ? 몇개 그룹으로 할건지 모르기 때문에 ??? 부분을 찾아야 한다 이 ???를 WCSS라고 한다
wcss를 구하는 방법은 다음과 같다
wcss = []
for i in range (1, 10+1) :
kmeans = KMeans(n_clusters = i,random_state=10)
kmeans.fit(X)
wcss.append( kmeans.inertia_ )
i를 1부터 10까지 반복하여 넣어보면서, 어떤 군집갯수가 좋은지 그래프로 보려고 한다.
random_state는 random의 seed와 같은 개념으로 본인이 원하는 숫자 또는 회사에서 정한 숫자를 넣어주면 된다.
(이것이 드러나면 해킹 보안에 취약해진다)
inertia ?
# 여러 개의 순회 가능한(iterable) 객체를 인자로 받고 각 객체가 담고 있는 원소를 차례로 접근할 수 있다
# 마치 옷의 지퍼를 올리는 것처럼 양측에 있는 데이터를 하나씩 차례로 짝을 지어준다
plt.plot(wcss)
plt.show()
# 밑의 그래프처럼 k값에 대한 관성을 시각화한 것을 elbow method(팔꿈치) 방식이라고 한다.
여기서 군집이 적게 있을수록 오차가 크고, 군집이 여러개 있을수록 오차가 적다는 것을 알 수 있다.
그러므로 사람이 보기에 오차가 적으면서, 군집이 너무 크지 않은 효율적인 군집 갯수를 정해야 한다
그래프로 보았을 때, 5개의 군집이 적당한 것 같다고 생각하였다.
예측하기
KMeans(n_clusters = 5, random_state=10)
y_pred = kmeans.fit_predict(X)
y_pred
df['Group'] = y_pred
df
CustomerID | Genre | Age | Annual Income (k$) | Spending Score (1-100) | Group | |
0 | 1 | Male | 19 | 15 | 39 | 3 |
1 | 2 | Male | 21 | 15 | 81 | 1 |
2 | 3 | Female | 20 | 16 | 6 | 3 |
3 | 4 | Female | 23 | 16 | 77 | 1 |
4 | 5 | Female | 31 | 17 | 40 | 3 |
... | ... | ... | ... | ... | ... | |
195 | 196 | Female | 35 | 120 | 79 | 2 |
196 | 197 | Female | 45 | 126 | 28 | 0 |
197 | 198 | Male | 32 | 126 | 74 | 2 |
198 | 199 | Male | 32 | 137 | 18 | 0 |
199 | 200 | Male | 30 | 137 | 83 | 2 |
# 연간 income(수입)에 비해 소비 점수가 높은 그룹 4를 가져와봤다
CustomerID | Genre | Age | Annual Income (k$) | Spending Score (1-100) | Group | |
46 | 47 | Female | 50 | 40 | 55 | 4 |
47 | 48 | Female | 27 | 40 | 47 | 4 |
48 | 49 | Female | 29 | 40 | 42 | 4 |
49 | 50 | Female | 31 | 40 | 42 | 4 |
50 | 51 | Female | 49 | 42 | 52 | 4 |
... | ... | ... | ... | ... | ... | ... |
120 | 121 | Male | 27 | 67 | 56 | 4 |
121 | 122 | Female | 38 | 67 | 40 | 4 |
122 | 123 | Female | 40 | 69 | 58 | 4 |
126 | 127 | Male | 43 | 71 | 35 | 4 |
142 | 143 | Female | 28 | 76 | 40 | 4 |
'ML (MachineLearning)' 카테고리의 다른 글
머신러닝 알고리즘 개념 요약 (0) | 2024.04.16 |
---|---|
하이라키 클러스터링(Hierarchical Clustering) : 계층적 군집 (0) | 2024.04.16 |
DTree(Decision Tree) 알고리즘으로 새로운 데이터 카테고리 분류하기 (0) | 2024.04.15 |
SVM(Support Vector Machine) 알고리즘으로 새로운 데이터 카테고리 분류하기 (0) | 2024.04.15 |
KNN(K nearest neighbor) 알고리즘으로 새로운 데이터 카테고리 분류하기 (0) | 2024.04.15 |