일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- k 디지털 후기
- 리뷰
- 영화추천시스템
- 추천프로젝트
- 멋쟁이사자처럼
- 멋사 전액국비지원교육
- 유니오르
- k 디지털
- 영화AI추천
- 인생책
- 멋사 AI
- 멋사 국비지원과정
- 이렇게 그녀를 잃었다
- 멋쟁이사자처럼 k-digital
- 비전공자 코딩교육
- AI 코딩
- 가브리엘마르케스
- 비전공자 코딩
- 멋사 k 디지털
- 인생책짧은글
- 인터뷰
- 문학동네
- 홍명희 임꺽정
- til
- 멋쟁이사자처럼 전액국비지원
- 멋사 AI 교육
- 멋쟁이사자처럼 k 디지털
- 민음사
- AI 국비지원
- 비전공자 멋쟁이사자처럼
- Today
- Total
글쟁이, 코딩한다
0107 / k_digital 22일차 / ML이론기초(비지도학습) 본문
0.
0
K-Means
Clustering(군집) 방식 #x데이터를 묶어줄뿐 #y데이터(정답 데이터)는 없다
과정
- K개(hyper-parameter 값 : 클러스터의 갯수 ; 사용자 임의)의 클러스터 중심값을 랜덤하게 고른다
- 각 data를 현재 위치에서 가까운 중심값 클러스터에 할당한다.
- (평면상에서) 클러스터 내 data들의 (x축과 거리, y축과 거리) 평균값을 구해 중심점을 그곳으로 이동시킨다.
- 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(차원 축소)
과정
- 모든 차원에 x데이터를 펼쳐둔다
- data의 끝과 끝이 가장 먼 축(분산이 가장 큰 축)을 찾는다-> 축이 될 열 하나 찾기
- 기본 축과 직교하는 축들 가운데 data의 끝과 끝이 가장 먼 선을 찾는다 -> 축이 될 또 다른 열 찾기
- 두 열을 기반으로 새로운 좌표 공간을 만들고, 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 적용 방법 확인
꺼내서 쓰기 편한 데이터창고 만들기
'나는 코딩도 한다 > TIL' 카테고리의 다른 글
0111/ k_digital 24일차 / 세미프로젝트2(마무리) (0) | 2021.01.11 |
---|---|
0108 / k_digital 23일차 / 세미프로젝트2 (2) | 2021.01.08 |
0106 / k_digital 21일차 / ML이론기초(지도학습) (2) | 2021.01.07 |
0105 / K_digital 20일차 / ML이론기초(지도학습) (0) | 2021.01.05 |
0104/ K_digital 19일차 / SQL, AI 입문 (0) | 2021.01.04 |