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