기본 콘텐츠로 건너뛰기

AI) 머신러닝과 딥러닝 특론 6주차 (오경선교수님) - Kmeans 실습 + 최적의 클러스터수와 inertia +라벨저장하기!!!!!

[ Kmeans 실습 ]

1. 일반화 , 과대 적합, 과소 적합

2. 실제 데이터를 다룰 때는  분류와 군집을 따로 하는 게 아니라!

    1) 군집하고 나서 그걸로 라벨 붙이고  ex) K - means

    2) 지도학습을 한다.


3. class sklearn.KMeans(n_cluster=8,*,init='k-means++',n_init=10,max_iter=300,tol=0.0001,

precompute_distances='auto',verbos=0,random_state=None,copy_x=True,n_jobs='1',

algorithm='auto')


각각의 파라미터를 봅시다.

n_init = 초기중앙점 관련 는 'k-means++'를 몇 번 할지

max_iter = 학습횟수관련 (데이터 양이나 분포 상황에 따라 다르겠지, 물론 그 전에 끝날 수도) tol = max_iter의 반복횟수를 계속하면 너무 많은 시간 소요되니까 

       응집도(intertia)를 계싼해보니 지정해준 만큼 줄어드리 않고 있으면 역시 조기 종료

precompute_distances=

디폴트값은 오토, 거리를 미리 계산해둔다. (빠르되 메모리 씀, 보통 오토로 둠)

또 샘플 * 클러스터가 1200만 넘으면 또 미리 계산 안함 

true는 무조건 미리해고 False는 하지 마

verbose

디폴트 값이 0이고 0이면 아무것도 출력 X

1이면 알고리즘 수행 중 진행 문구 출력O 

random_state=None,copy_x=True

무작위로 섞어서 데이터 셋을 나누는데 None 대신 

숫자쓰면 숫자 갯수만큼 동일하게 분할한다.

copy_x=True

True가 기본값, 원본 데이터 안 건드린다.

False면 덮어쓰기 원본 데이터 수정된다.

n_jobs='1'

병렬로 수행할 작업수

None이 디폴트인데 모든 프로세서 쓰라는 것! 빨리해!

algorithm='auto'

보통 디폴트인 오토로 두거나 elkan 쓰는데 희소 데이터에 full씀


4. 코랩실습하면서 attribute (속성) 알아보기

https://colab.research.google.com/drive/1vuFAkG08NzaVz3KuXHEQY09lThYHVvkQ?usp=sharing


[ 최적의 K!!! 클러스터 개수를 찾아서 팔꿈치, inertia가 급격히 낮아지는 지점 

  가장 효율적인 군집화!!!!!!!!!!!!!!!!!!!]

1. 낮다고 장땡이가 아니라 팔꿈치

#팔꿈치
inertia=[]
for i in range(1,7) :
   km=KMeans(n_clusters=i)
   km.fit(x)
   inertia.append(km.inertia_)

import matplotlib.pyplot as plt
plt.plot(range(1,7),inertia,marker='o')
plt.xlabel("cluster")
plt.ylabel("inertia")
plt.show()

[라벨 저장하기]

target=kmeans.labels_
target

[실습에 나오는 predict_ 로 예측도 되고 라벨 저장하면 지도 학습도 된다.] 
https://colab.research.google.com/drive/1vuFAkG08NzaVz3KuXHEQY09lThYHVvkQ#scrollTo=m43aKtbZI95t



[2. 팔꿈치 실습 2 K-Means2]
https://colab.research.google.com/drive/13Kok_YuyNRLDxbHSrm4TN4KtCkCZr_Oc?usp=sharing


[라벨 저장하기! 두 1차원 데이터를 어떻게 2차원으로 만들어서 합칠까]
 1. 일단 그냥 1차원 리스트인 경우  
     넘파이 배열도 아니니까 넘파이로 바꿔서(?) axis로 지정된 차원을 추가한다.
     예) a=[리스트]                        #실제로 이때 a.shape해보면 (2720,)
         import numpy as np
         a=np.expand_dims(a,axis=1)  #이게 axis로 지정된 차원을 추가하기
         a.shape                             #이제 a.shape해보면 (27270,1) 2차원이 된다.
         
 2. 그다음 옆에 새로운 열 합칠 때 hstack    #행의 수가 같아야 함!
    행을 합칠 때는 vstack
 
    e=np.hstack((cost,a))
    e.shape
    >>>>>(27270, 3)
    행은 그대로이고 열이 2에서 3으로 늘어난게 보인다.
 
3. 이차원으로 만드는 방법 (2)
   처음에 b.shape 했더니 (3,) 로 나오고  [기존데이터]  즉, 1차원이면
   그러면 b=b.reshape(-11) 
   이 뜻은 기존 데이터는 -1로 가고 1개의 차원 추가!
   그래서 [[기존데이터]] 이 상태로 만든 것이다. 
    
4. 그 다음 이제 행의 수는 같고 새로운 열을 하나 통으로 추가하려면 hstack
   C=np.hstack((a,b))
   display(C)
  
   >>>>>>>matrix([[1,10,100],
                           [2,20,200],
                           [3,30,300]]) 
 
b가 100, 200, 300이었음!
 
 
5. 이제 CSV파일에 읽고 쓰기 !!!!!!!!!!!
 
import CSV
f=open('write.csv','a',newline='') #기존 파일 없으면 새로 생성 그리고 a모드는 새로운
                                       내용 있으면 끝에 더 추가
wr=csv.writer(f)    #f랑 wr은 그냥 간단히 하려고 변수 만든 것임
for i in range(20270):
wr.writerow(e[i])   #행에 저장해라   e의 0번째는 [A의 1행,B의 2행 ,C의 3행]
f.close()      
 
실습은 코랩하단에 있다.
 https://colab.research.google.com/drive/1fSIzHLYsJmg3yERqtLVy1P96EXNN5kw6?usp=sharing
 
 신기하다!
 

댓글

Creative Commons License