알파카징징이 알파카징징이 코딩하는 알파카

혼공머_4_2 확률적 경사 하강법 알아보기

» writing

혼자공부하는머신러닝+딥러닝 수업을 참고하여 작성하였습니다

4_2_확률적 경사 하강법 알아보기

정의


확률적 경사 하강법 알아보기

1. 확률적 경사 하강법 (Stochastic gradient descent)
   : 훈련 세트에서 랜덤하게 하나의 샘플을 고르는 것
   : 훈련 세트에서 샘플 하나씩 꺼내 손실 함수의 경사를 따라 최적의 모델을 찾는 알고리즘
   : 훈련 데이터가 모두 준비되어 있지 않고 매일매일 업데이트 되어도 계속 이어갈 수 있다
- 에포크 (Epoch)
   : 전체 샘픙르 모두 사용하는 한 번 반복

2. 미니배치 경사 하강법 (Mini-batch gradient descent)
   : 샘플을 하나씩 사용하지 않고 여러 개를 사용

3. 배치 경사 하강법 (Batch gradient descent)
   : 한 번에 전체 샘플 사용
   : 전체 데이터를 사용해서 가장 안정적인 방법이지만, 컴퓨터 자원 많이 사용

4. 손실함수 (loss function)
   : 나쁜 정도 측정 함수
   : 어떤 문제에서 머신러닝 알고리즘이 얼마나 엉터리인지 측정하는 기준
   : 값이 작을 수록 좋다
   : 샘플 하나에 대한 손실 정의
   : 정확도 X, 미분 가능 X
   - 비용 함수(cost function)
        : 훈련 세트에 있는 모든 샘플에 대한 손실 함수의 합
   - 로지스틱 손실 함수
        : 타깃 1일 때 -log(예측확률)
        -> 확률 1에서 멀어질수록 손실은 아주 큰 양수
        -> 확률 클수록 손실 작음
        : 타깃 0일 때 -log(1-예측확률)
        -> 확률 0에서 멀어질수록 손실은 아주 큰 양수
        -> 확률 클수록 손실 큼

5. 데이터 전처리
import pandas as pd
import numpy as np 
fish = pd.read_csv("http://bit.ly/fish_csv_data")
fish.head()

fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()
fish_target = fish['Species'].to_numpy()

from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, random_state = 42)

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
6. SGDClassifier
    : 머신러닝 모델이 아니고 머신러닝 모델을 훈련시켜 최적화하는 방법
    : 어떤 손실함수를 최적화할지 지정해준다
    - hinge loss
        : loss의 매개변수 기본값은 hinge
            (= support vector machine)
from sklearn.linear_model import SGDClassifier

sc = SGDClassifier(loss= "log", max_iter = 10, random_state = 42)
            # logictic loss function   # epoch    # random_seed
sc.fit(train_scaled, train_target)

print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
# 0.773109243697479
# 0.775
sc.partial_fit(train_scaled, train_target)
  # 기존의 학습 내용 유지 !
  # fit 은 이전 학습내용 버리기 ! 새로 학습 !
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
]
sc.partial_fit(train_scaled, train_target)
  # 기존의 학습 내용 유지 !
  # fit 은 이전 학습내용 버리기 ! 새로 학습 !
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
# 0.8151260504201681
# 0.825
7. 에포크와 과대/과소적합
    : alpha(규제) 가 엄청 크면 과소적합
    : alpha(규제) 가 엄청 작으면 과대적합
    : 에포크 횟수가 적으면 모델이 훈련세트를 덜 훈련함
    : -----------------------> 에포크 증가
    : 훈련세트 점수는 꾸준히 증가
    : 테스트세트 점수는 어느순간 감소
    (이 지점이 과대적합 시작 하는 곳)
    - 조기 종료
        : 과대적합 되기 전에 훈련 멈추기  
import numpy as np
sc = SGDClassifier(loss = "log", random_state=42)
train_score =[]
test_score = []
classes = np.unique(train_target)

for _ in range(0, 300):
  sc.partial_fit(train_scaled, train_target, classes = classes)
  train_score.append(sc.score(train_scaled, train_target))
  test_score.append(sc.score(test_scaled, test_target))

sc = SGDClassifier(loss= "log", max_iter = 100, tol = None, random_state = 42)
            # logictic loss function   # epoch  # 반복을 멈출 조건  # random_seed
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
# 0.957983193277311
# 0.925

조기종료

8. 점진적 학습을 위한 확률적 경사 하강법
   : 확률적 경사 하강법은 손실 함수라는 산을 정의하고 가장 가파른 경사를 따라 조금씩 내려오는 알고리즘
   : 훈련을 반복할수록 모델이 훈련 세트에 점점 더 잘 맞게 되어 어느순간 과대적합, 테스트의 정확도는 줄어들 것
   : 하지만 데이터는 매우 크기 때문에, 조금씩 사용해 점진적으로 학습하는 방법이 필요