글쟁이, 코딩한다

0107 / k_digital 22일차 / ML이론기초(비지도학습) 본문

나는 코딩도 한다/TIL

0107 / k_digital 22일차 / ML이론기초(비지도학습)

Algori 2021. 1. 7. 15:13

0.

 0

 

K-Means

Clustering(군집) 방식 #x데이터를 묶어줄뿐 #y데이터(정답 데이터)는 없다

과정

  1. K개(hyper-parameter 값 : 클러스터의 갯수 ; 사용자 임의)의 클러스터 중심값을 랜덤하게 고른다
  2. 각 data를 현재 위치에서 가까운 중심값 클러스터에 할당한다.  
  3. (평면상에서) 클러스터 내 data들의 (x축과 거리, y축과 거리) 평균값을 구해 중심점을 그곳으로 이동시킨다.
  4. data들의 클러스터 할당이 바뀌지 않을 때까지 2번, 3번을 반복한다.   

결과 

  결정경계를 구축한다 => 마치 지도학습처럼 신규 데이터에 대한 예측값도 제공한다.

문제1
  정말 중심값을 임의의 위치에 줘도 되는가
=해결방안=> hyper-parameter로 조정. (init= 'k-means++'

 #간단히, 첫 중심값 지정 후 다음 중심값은 멀리 떨어진 곳에 배치한다는 것 #반대는 init='random'

문제2
 x데이터, 클러스터(K의 갯수)가 무지 크게 늘어나면 어떻게 감당할 것인가. 계산에 드는 시간은?
=해결방안=>간단하게 생각하자! 
 1-x데이터 줄이기 : 열 중요도 확인(필요없는 거 떨궈내기) 혹은 차원 축소 
 2-K 줄이기 : 클러스터 최소화
 3-컴퓨터 성능 자체를 올리기(GPU Accelerated)

 

@최적의 클러스터 갯수 찾기 
1) elbow 
  1-클러스터 수를 조정해가며 inertia값을 구한다(코드 : model.inertia_) 
  #inertia : 각 데이터와 해당 클러스터 중심값의 거리들을 제곱해 더한 값 :

    클러스터가 늘어날수록 값은 줄어든다 => 어느 순간 값이 크게 줄지 않는 클러스터 갯수가 있다. 
  2-inertia 결과값 그래프에서 꺾이는 부분(elbow, 팔꿈치처럼 보이는 부분)을 찾아 쓴다. 
#약점-엄밀하지 않다 

2) 실루엣(silhouette) 계수 
  실루엣 계수를 구한다.  


 #데이터 응집도(같은 클러스터 데이터들과 거리 평균, 작을수록 좋다), 클러스터 분리도(가까운 다른 클러스터의 데이터들과 거리 평균, 클수록 좋다)에 영향을 받는다.
 #실루엣 계수의 maximum 값(제일 좋은 값)은 1 => 1에 가까울수록 좋다.

<코드 실습>

from sklearn import cluster

@모델 만들기&학습
kmeans = cluster.KMeans(n_clusters=2, random_state=0).fit(X)
#n_clusters= 는 K값. parameter 이름은 생략 가능(위치 변경 시에는 적어줄 것) 
#n_init = 중심값 이동(과정 2번) 횟수
#init= default는 'k-means++'

@결과 확인
kmeans.labels_ #라벨=정답. 행열에 대해서는 index 번호를 뱉는다.
kmeans.cluster_centers_ #학습이 끝난 후 클러스터 중심값의 위치
--predict 함수도 쓸 수 있다.

@실루엣 계수 구하기
from sklearn.metrics import silhouette_score
silhouette_score(X, model.predict( ))
#실루엣 계수 평균 구하기 #K-Means뿐만 아니라 다양한 클러스터 기법 평가에 쓰인다.

 

 

 

PCA

 Principal Component Analysis, 주성분 분석 #Dimensionality Redution(차원 축소)

과정

  1. 모든 차원에 x데이터를 펼쳐둔다 
  2. data의 끝과 끝이 가장 먼 축(분산이 가장 큰 축)을 찾는다-> 축이 될 열 하나 찾기
  3. 기본 축과 직교하는 축들 가운데 data의 끝과 끝이 가장 먼 선을 찾는다 -> 축이 될 또 다른 열 찾기    
  4. 두 열을 기반으로 새로운 좌표 공간을 만들고, data들을 끌어놓는다 

핵심 역할

 모델의 학습 속도 높여주기 
 #정확도 향상에는 도움이 되지 않는 편이다. 물론 가끔 도움이 되기도 하지만.

  속도가 넘 느리지 않으면 안 쓰는 편이 좋다=> 새로 만든 축에 의미를 부여하기가 너무 어렵다. 
 <-> 차원을 올려서 쓰는 KSVM과 대립하는 개념이라고 볼수도.

 # 정규화와 같은 일종의 전처리 도구라고 볼 수 있다.

 

<코드 실습>

@모델 만들기
from sklearn import decomposition #분해
model = decomposition.PCA(n_components=1)
#n_components= 새로 만들 축의 숫자

@차원 이동 덮어쓰기
model.fit(x)
x1 = model.transform(x)

@몇 개의 PC(축)이면 충분할까?
np.argmax(np.cumsum(model.explained_variance_ratio_) >= 0.95 ) + 1

##원본 데이터 분산 비율을 계산(95% 이상 설명하면 괜찮다고 본다)
#model.explained_variance_ratio_ : 원본 데이터 분산 비율
#np.cumsum( ) 누적합(누적량 더하기) Cumulative sum
#np.argmax( ) 값이 가장 큰 요소의 index 번호(동값이 있을 때는 앞에 있는 것)

#간편함수식
model = decomposition.PCA(n_components=0.95)
#알아서 분산율 95%가 넘는 pc를 생성한다.

 

오늘의 TML

 

1. 모델 save & load

#저장
from sklearn.externals import joblib
joblib.dump(model, 'model_iris_svm_v1.pkl', compress=True)
#dump 저장 (학습이 끝난 모델의 객체, 파일 이름(pickle, 딥러닝은 h5))

#불러오기
joblib.load('model_iris_svm_v1.pkl')

2. 모델 staking(vecstack)

 

서로 다른 모델을 만들어 예측 값을 모은다. (쌓는다라는 'stack'의 의미를 생각하자) 
여기서 이 모델들이 구한 예측 값을 또다른 데이터셋으로 저장 => 이것을 새로운 traning data로 활용 => 다시 예측값 


StackingTransformer를 쓰면 편리하다. (추가 이해 필요)

 

오늘의 일단 적어두기

 

ML 지도 내 아직 덜 배운 모델들을 확인해보자(나이브 베이즈, GMM ...)
imputing / 빠르게 결측치 채우기

Gaussian Mixture Model 

 

오늘의 (다음) 공부할 것

 

kaggle, 데이콘의 데이터 분석(전처리와 인사이트 획득, 시각화) 방식 -> ML 적용 방법 확인 

꺼내서 쓰기 편한 데이터창고 만들기

 

Comments