본문 바로가기
딥러닝 & 머신러닝/혼자 공부하는 머신러닝 딥러닝

4-2. 확률적 경사 하강법

by sim0609 2023. 2. 14.

확률적 경사 하강법

확률적 경사 하강법을 사용해 점진적으로 학습하는 로지스틱 회귀 모델을 훈련할 수 있다. 확률적 경사 하강법은 손실 함수라는 산을 정의하고 가장 가파른 경사를 따라 조금씩 내려오는 알고리즘이다. 

 

즉, 이전에 훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 더 훈련하는 방식이다.

 

이 알고리즘을 사용하는 이유는 데이터를 한 번에 모든 컴퓨터 메모리에 읽힐 수 없어 데이터를 조금씩 사용해 점진적으로 학습하는 방법이 필요하기 때문이다. 

 

소스 코드

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDClassifier
import numpy as np
import matplotlib.pyplot as plt

# input data와 target data 만들기 
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()

# 훈련 세트와 테스트 세트 만들기
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, random_state = 42)

# 훈련 세트와 테스트 세트 표준화 전처리 
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

# 로지스틱 손실 함수로 훈련(확률적 경사 하강법 사용)
sc = SGDClassifier(loss = 'log', max_iter = 10, random_state = 42)
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))

# 정확도가 낮으므로 모델을 이어서 훈련시키기 -> partial_fit() 사용 
sc.partial_fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))

# 과대 적합과 과소 적합이 시작되는 시기 알아보기
sc = SGDClassifier(loss = 'log', random_state = 42)
train_score =[]
test_score = []
classes = np.unique(train_target)

# 300번의 epoch동안 훈련을 반복해 훈련 세트와 테스트 세트의 점수 계산하기 
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))
  
# 그래프로 표현하기(주황색: 테스트 세트, 파란색: 훈련 세트) 
plt.plot(train_score)
plt.plot(test_score)
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()

# 100번째 epoch이 가장 적절한 반복 횟수이기에 SGDClassifier를 100에 맞춤
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))

# 힌지 손실 이용해보기
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))

'딥러닝 & 머신러닝 > 혼자 공부하는 머신러닝 딥러닝' 카테고리의 다른 글

6-1. 군집 알고리즘  (0) 2023.02.17
5-1. 결정 트리  (0) 2023.02.15
4-1. 로지스틱 회귀  (0) 2023.02.14
3-3. 특성 공학과 규제  (0) 2023.02.13
3-2. 선형 회귀  (0) 2023.02.13