확률적 경사 하강법
확률적 경사 하강법을 사용해 점진적으로 학습하는 로지스틱 회귀 모델을 훈련할 수 있다. 확률적 경사 하강법은 손실 함수라는 산을 정의하고 가장 가파른 경사를 따라 조금씩 내려오는 알고리즘이다.
즉, 이전에 훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 더 훈련하는 방식이다.
이 알고리즘을 사용하는 이유는 데이터를 한 번에 모든 컴퓨터 메모리에 읽힐 수 없어 데이터를 조금씩 사용해 점진적으로 학습하는 방법이 필요하기 때문이다.
소스 코드
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 |