본문 바로가기
머신러닝/혼공머신

[혼공머신] chapter 6. 군집 알고리즘

by 다이노소어 2023. 1. 31.
혼자 공부하는 머신러닝 + 딥러닝의 Chapter 6을 공부하면서 정리한 내용을 기반으로 작성하였다.

 

 

06-1. 군집 알고리즘


타깃데이터 즉, 미리 정한 정답은 없지만, 종류대로 모으고 분류할 수 있을까?

예를 들어, 고객들의 데이터를 그때 그때 받아서 같은 종류끼리 모아두는 것을 생각한다.

 →  비지도 학습

 

>> 이해해보자 (타깃데이터 즉 종류를 아는 상황을 가정)

  • 사과, 바나나, 파인애플 사진을 분류해보고 싶다.
  • 평균과의 오차값이 최대한 적은 샘플들을 모으면 된다.
  1. |픽셀값 - 해당 위치의 평균 픽셀값|의 합을 픽셀 개수로 나눠 평균을 구한다.
  2. 샘플 300개 있으므로, (1)의 값(각 샘플에 대한 평균값)이 300개 존재이다
  3. 여기서 오름차순으로 최초 100개 즉 작은 값 100개를 고른다
  4. 이 100개 같은 종류일 것이다!

 

 

 

06-2. k-평균 (k-means) 군집 알고리즘


→ 평균을 자동으로 찾아준다. 이 때의 평균값을 cluster center 또는 centroid라고 부른다.

 

k-평균 (k-means) 군집 알고리즘

1. 작동방식

  • 랜덤으로 cluster center 정하고, 여기에 가까운 샘플을 하나의 cluster로 묶는다.
  • cluster가 이전과 변동 없을 때까지 반복한다.
    • cluster center 중심을 계산한다.
    • 다시 여기에 가까운 샘플을 cluster로 묶는다.

2. 코드

from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=42) # cluster 개수 미리 정해야 함
km.fit(fruits_2d) #타깃데이터 없으니 이대로 훈련
print(km.labels_) # 각 샘플이 어느 cluster로 들어갔는지
print(km.cluster_centers) #cluster centers

 

3. 속성

  • km.labels : 각 샘플이 어느 cluster로 들어갔는지
  • km.cluster_centers
  • km.n_iter_ : 반복횟수

 

4. 메소드

  • transform()
  • predict() : 새로운 샘플에 대해 가장 가까운 cluster를 예측한다

 

최적의 k찾기

: cluster에 최대한 밀집될 수 있는 최적의 k를 찾아보자.

  • elbow 방법 (최적의 k찾는 방법 중 하나)
  • inertia(이너셔) 
    • 이니셔란, cluster에 속한 샘플과 cluster center 과의 거리의 제곱 합
    • cluster의 샘플이 얼마나 밀집되어 있는지 알 수 있다.
    • 이너셔가 작을수록 더 밀집되어 있다는 것

 

 

 

 

06-3. PCA(주성분 분석) 모델


특성이 많으면, 선형 모델의 성능이 높아지고, 훈련 데이터에 과대적합될 수 있다.
차원 축소란 무엇일까?  → 데이터를 가장 잘 나타내는 일부 특성을 선택한다.
    - 차원 축소를 통해, 데이터 크기를 줄일 수 있다.
    - 차원 축소를 통해, 도학습 모델의 성능을 향상시킬 수있다.

 

PCA(주성분 분석) 모델

    → PCA는 데이터에 있는 분산(데이터가 널리 퍼져있는 정도)이 큰 방향을 찾는 것이다.

 

 

1. 코드

from sklearn.decomposition import PCA
pca = PCA(n_components = 50)
pca.fit(fruits) # fruits : 100*100 2차원 배열의 샘플 여러개

 

2. PCA 클래스의 속성

  • n_components : 하이퍼 파라미터
    • 객체를 만들 때,주성분 개수 지정할 수 있다.
    • explained variance(설명된 분산)의 비율로 지정할 수 있다. 예를 들어, 0.5로 지정하면 explained variance의 50%에 달하는 주성분을 찾는다.
  • n_components_ : PCA 클래스가 찾은 주성분 개수
  • components_ : PCA 클래스가 찾은 주성분
    • components_.shape로 확인 했을 때, (주성분 개수, 데이터의 특성 개수)를 반환한다.
    • 즉, 첫 번째 차원은 주성분 개수, 두 번째 차원은 데이터의 특성 개수를 말한다.
  • explained_variance_ratio_
    • 각 주성분의 explained variance(설명된 분산) 비율
    • explained variance(설명된 분산) : 주성분이 원본 데이터의 분산을 얼마나 잘 나타내는지 기록한 값

 

 

3. 메소드

  • transform() : 데이터 차원 줄이기 (주성분 → 특성)
  • inverse_transform()
    • 원상 복구 (원본 데이터 재구성)
    • 예를 들어, 50차원으로 축소했던 데이터를 전달받으면 원래 특성 개수인 10000개로 복원한다.

 

4. 다른 알고리즘과 함께 사용하기

  • LogisticRegression (로지스틱 회귀 모델)를 가지고 미리 타깃데이터를 안 상태에서 분류하는데 쓸 수 있다.
    • 차원 축소된 데이터와 타깃데이터를 가지고 교차검증을 한다.
  • K-평균 알고리즘
    • K-평균 알고리즘에 차원 축소된 데이터를 훈련시킨다(fit()함수 이용)
    • K-평균 알고리즘과 차원 축소된 데이터를 이용해 cluster를 찾을 수 있다.

 

 


**참고

  1. 코랩에서 !로 시작하면 리눅스 shell 명령
  2. 100*100 픽셀 그림을 가로 10개, 세로 10개 그리기
# 서브그래프 만들기
# ratio 매개변수에 비례하여 커진다. ratio의 기본값은 1이다.
fig, axs = plt.subplots(rows, cols, figsize= (cols, rows), squeeze = FALSE) 
for i in range(10):
	for j in range(10):
		axs[i,j].imshow(fruits[apple_index[i*10 + j]], cmap = ‘gray_r’) #열 고려
		axs[i, j].axis(‘off’) #좌표축 그리지 않음
plt.show()