defdraw_fruits(arr, ratio=1): n = len(arr) # n은 샘플 개수입니다 # 한 줄에 10개씩 이미지를 그립니다. 샘플 개수를 10으로 나누어 전체 행 개수를 계산합니다. rows = int(np.ceil(n/10)) # 행이 1개 이면 열 개수는 샘플 개수입니다. 그렇지 않으면 10개입니다. cols = n if rows < 2else10 fig, axs = plt.subplots(rows, cols, figsize=(cols*ratio, rows*ratio), squeeze=False) for i inrange(rows): for j inrange(cols): if i*10 + j < n: # n 개까지만 그립니다. axs[i, j].imshow(arr[i*10 + j], cmap='gray_r') axs[i, j].axis('off') plt.show()
1
draw_fruits(fruits[km.labels_ == 0])
클러스터 중심
1
draw_fruits(km.cluster_centers_.reshape(-1, 100, 100), ratio = 3) # fruits_2d 샘플의 클러스터 중심이기 때문에 이미지로 출력하려면 100 X 100 크기로 변환
1
print(km.transform(fruits_2d[100:101])) # transform 메서드는 훈련데이터 샘플에서 클러스터 중심까지 거리로 변환해준다.
[[3393.8136117 8837.37750892 5267.70439881]]
1
print(km.predict(fruits_2d[100:101]))
[0]
1
draw_fruits(fruits[100:101])
최적의 K-평균 찾기
inertia
목적함수 값이 최소화될 때까지 군집의 중심위치와 각 데이터가 소속될 군집를 반복해서 찾는다. 이 값을 관성(inertia)이라고 함
클러스터에 속한 샘플이 얼마나 가깝게 모여있는지를 나타내는 값
엘보우 방법
클러스터의 개수가 늘어나면 클러스터 개개의 크기는 줄어들기 때문에 이너셔도 같이 줄어듬, 그렇기 때문에 클러스터 개수를 늘려가면서 이너셔의 변화를 관찰하여 최적의 클러스터 개수를 찾는다.
1 2 3 4 5 6 7
inertia = [] for k inrange(2, 7): km = KMeans(n_clusters = k, random_state = 42) km.fit(fruits_2d) inertia.append(km.inertia_) plt.plot(range(2, 7), inertia) plt.show
from sklearn.preprocessing import StandardScaler ss = StandardScaler() ss.fit(train_input)
# ss 훈련 데이터만 활용해서 학습(?)이 끝난 상태 # 표준화 처리를 훈련 데이터와 테스트 데이터에 동시 적용 train_scaled = ss.transform(train_input) test_scaled = ss.transform(test_input)
모델 학습
2개의 매개 변수 지정
loss = “log” = 로지스틱 손실 함수로 지정
max_iter = 에포크 횟수 지정
에포크란(epoch)_01 : 훈련 데이터셋에 포함된 모든 데이터들이 한 번씩 모델을 통과한 횟수로, 모든 학습 데이터셋을 학습하는 횟수
에포크란_02 : 1 epoch는 전체 학습 데이터셋이 한 신경망에 적용되어 순전파와 역전파를 통해 신경망을 한 번 통과했다는 의미가 된다, 즉 epoch가 10회라면, 학습 데이터 셋 A를 10회 모델에 학습시켰다는 것
에포크란_03 : epoch를 높일수록, 다양한 무작위 가중치로 학습을 해보므로, 적합한 파라미터를 찾을 확률이 올라간다.(즉, 손실 값이 내려가게 된다.) 하지만 지나치게 epoch를 높이게 되면, 그 학습 데이터셋에 과적합되어 다른데이터에 대해선 제대로 된 예측을 하지 못할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from sklearn.linear_model import SGDClassifier
# 매개변수 지정 # 하이퍼파라미터 설정 ## 매개변수 값을 dictionary 형태로 추가하는 코드 작성 가능 ## 강사는 입문자들에게는 비추천 sc = SGDClassifier(loss = "log", max_iter = 40, random_state = 42)
# 모형 학습 sc.fit(train_scaled, train_target)
# 스코어 확인 (정확도) print(sc.score(train_scaled, train_target)) print(sc.score(test_scaled, test_target)) # 샘플링의 차이로 값이 일정하지 않고 다를 수 있다.
fig, ax = plt.subplots() ax.plot(train_score) ax.plot(test_score) ax.set_xlabel("Epoch") ax.set_ylabel("Accuracy") plt.show() # 파란색 훈련, 노란색 테스트 # 훈련데이터가 안정화되고 테스트데이터도 안정화되면서 가까운 곳은 epoch가 100일때의 지점이라고 알 수 있음.