[ 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
신기하다!
댓글
댓글 쓰기