728x90

확률적 경사 하강법, 손실 함수, 에포크

 

점진적 학습(온라인 학습)

 - 한번에 수많은 data를 모두 memory에 넣고 학습을 할 수 없으니 점진적으로 학습이 필요.

 - 또는 학습할 data가 시간이 지나면서 계속 추가되는 경우

 

확률적 경사 하강법 : Stochastic  Gradient Descent

 - 대표적인 점진적 학습 알고리즘

 - 훈련세트에서 하나씩 샘플을 꺼내 손실함수의 경사를 따라 최적의 모델을 찾는 알고리즘

미니배치 경사 하강법 : Minibatch Gradient Descent

 - 여러 개씩 꺼내 사용

배치 경사 하강법 : Batch Gradient Descent

 - 모두 꺼내 사용

점진적 학습 과정

손실함수: Loss Function, 비용 함수 : Cost Function

 - 손실 함수는 샘플 하나에 대한 손실을 정의, 비용 함수는 훈련 세트에 있는 모든 샘플에 대한 소실 함수의 합을 말하지만 엄격히 구분하지 않고 섞어 사용하는 경우가 많음

 - 확률적 경사 하강법이 최적화할 대상

 - 손실 함수는 오차가 얼마나 큰 지 측정하는 기준으로 함수의 값이 작을수록 좋다.

 - 손실 함수는 미분이 가능해야 한다

 

로지스틱 손실함수: Logistic Loss Function

이진 크로스엔트로비 손실 함수: Binary Cross-entropy Loss Function

크로스엔트로비 손실 함수: Cross-entropy Loss Function

 - 로지스틱 손실 함수를 사용하면 로지스틱 회귀 모델이 만들어진다.

 

회귀에서 사용하는 손실 함수:

평균 절댓값 오차

 - 타깃에서 예측을 뺀 절댓값을 모든 샘플에 평균한 값

평균 제곱 오차: Mean Squared Error

 - 타깃에서 예측을 뺀 값을 제곱한 다음 모든 샘플에 평균한 값

 

에포크

 - 확률적 경사 하강법에서 전체 샘플을 모두 사용하는 한 번 반복을 의미

 - 확률적 경사 하강법을 사용한 모델은 에프크 횟수에 따라 과소적합/과대적합이 될 수 있다.

 - 에포크가 너무 적으로면 과소, 많으면 과대 적합

 - 과대적합이 되기 전에 훈련을 멈추는 것이 조기종료(early stopping)

 

힌지 손실: hinge loss

 - SGDClassifier의 loss parameter의 기본 값, 서포트 백터 머신(Support vector machine) 알고리즘을 위한 손실 함수

 

SGDClassifier

import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv_data')

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)

from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=35, random_state=42)
sc.fit(train_scaled, train_target)

print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))

0.8403361344537815

0.8

sc.partial_fit(train_scaled, train_target)

print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))

0.907563025210084

0.925

에포크와 과대/과소적합

import numpy as np

sc = SGDClassifier(loss='log', random_state=42)

train_score = []
test_score = []

classes = np.unique(train_target)

# python에서 _ 변수는 다른 곳에서 사용하지는 않고 버리는 값을 저장하는데 쓴다
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))

import matplotlib.pyplot as plt

plt.plot(train_score)
plt.plot(test_score)
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()

sc = SGDClassifier(loss='log', max_iter=100, tol=None, random_state=42)
sc.fit(train_scaled, train_target)

print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))

0.957983193277311

0.925

sc = SGDClassifier(loss='hinge', max_iter=100, tol=None, random_state=42)
sc.fit(train_scaled, train_target)

print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))

0.9495798319327731

0.925

728x90

+ Recent posts