Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

kang's study

8일차 : 확률적 경사 하강법 (Stochastic Gradient Descent) 본문

[학습 공간]/[혼공머신러닝]

8일차 : 확률적 경사 하강법 (Stochastic Gradient Descent)

보끔밥0302 2022. 3. 3. 06:20

확률적 경사 하강법 (Stochastic Gradient Descent)

대표적인 점진적 학습 알고리즘
훈련데이터가 한 번에 준비되는 것이 아니라 조금씩 전달되는 경우

한번 학습할 때 랜덤하게 추출한 일부 데이터에 대해 가중치를 조절
 
점진적 학습 : 새로운 데이터가 들어와도 가중치와 절편을 유지하며 업데이트하는 최적화 방법
 
 

손실함수 (나쁜 정도 측정함수)

분류에서 정확도의 대안으로 로지스틱 손실함수를 사용한다.
이진 크로스 엔트로피 손실함수
예측이 잘 맞으면 손실이 낮고 예측이 안 맞으면 손실이 높게끔 Trick으로 값조정(log 사용)
 
 

데이터 준비

In [1]:
import pandas as pd

fish = pd.read_csv('https://bit.ly/fish_csv_data')
In [2]:
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
fish_target = fish['Species'].to_numpy()
In [3]:
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)
In [4]:
from sklearn.preprocessing import StandardScaler 
# 확률적경사하강을 위해서 반드시 필요한 과정

ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
 

SGDClassifier

한 개씩 꺼내 조금씩 경사를 따라 이동
훈련이 1번 끝나는 것을 1에포크라 한다.
반복횟수:하이퍼 파라미터
In [5]:
from sklearn.linear_model import SGDClassifier 
# 확률적 경사 하강법을 제공하는 분류 모델
In [6]:
sc = SGDClassifier(loss='log', max_iter=10, random_state=42) 
# 하이퍼파라미터 지정해야함, max_iter는 에포크

sc.fit(train_scaled, train_target)

print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
 
0.773109243697479
0.775
 
 
점진적 학습
In [7]:
sc.partial_fit(train_scaled, train_target) # 기존의 학습을 유지하면서 다시 학습

print(sc.score(train_scaled, train_target)) # 하나씩 샘플을 꺼내서 쓴다
print(sc.score(test_scaled, test_target)) # 사이킷런에는 확률적경사하강만 가능하다
 
0.8151260504201681
0.825
 

에포크와 과대/과소적합

In [8]:
import numpy as np

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

train_score = []
test_score = []
In [9]:
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))
In [10]:
import matplotlib.pyplot as plt

plt.plot(train_score, "b")
plt.plot(test_score, "r")
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()
 
In [11]:
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
In [12]:
# 기본 손실함수: 힌지손실(hinge)은 SVM 알고리즘을 위한 손실함수이다.
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

출처 : 박해선, 『혼자공부하는머신러닝+딥러닝』, 한빛미디어(2021), p199-215

Comments