기존의 학습된 모델에 새로운 데이터를 추가하여 모델을 업데이트하는 방법
대표적인 점진적 학습 알고리즘은 확률적 경사 하강법이다.
손실 함수를 최소화하기 위해 파라미터를 업데이트 하는 최적화 알고리즘이다.
각 단계마다 랜덤하게 선택한 데이터 샘플에 대한 기울기를 사용하여 파라미터를 조정한다.
모든 데이터를 한 번에 사용하는 배치 경사 하강법과 달리, 각 단계에서 하나의 데이터 샘플을 사용하기 때문에 게산 속도가 빠르다
확률적 경사 하강법은 대규모 데이터셋 및 온라인 학습에 적합하다.
손실 함수는 모델의 예측과 실제 타깃 값 사이의 차이를 측정하는 함수로, 이 차이가 작을수록 모델의 성능이 좋다고 판단하다. 손실 함수는 모델이 학습하는 동안 최소화해야 하는 목적 함수이기도 하다.
이진 분류 문제에서 사용되는 손실 함수로, 주로 로지스틱 회귀와 같은 모델에서 활용된다. 로지스틱 손실은 모델의 예측 확률과 실제 타깃 값 사이의 차이를 측정하는 모델을 학습하고 최적화하는데 사용된다.
확률적 경사 하강법을 사용한 분류 모델을 만든다.
import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv_data')
print(fish)
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_loss', max_iter=10, random_state=42)
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
#출력 0.773109243697479
print(sc.score(test_scaled, test_target))
#출력 0.775
sc.partial_fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
#출력 0.8151260504201681
print(sc.score(test_scaled, test_target))
#출력 0.85
*에포크 횟수가 적으면 훈련 데이터셋을 덜 학습하여 과소적합된 모델이 될 수 있고, 에포크 횟수가 많으면 훈련 데이터셋에 과대적합될 수 있다.
💡에포크
에포크는 훈련 데이터셋을 한 번 학습하는 과정을 말한다.
import numpy as np
sc = SGDClassifier(loss='log_loss', random_state=42)
train_score = []
test_score = []
classes = np.unique(train_target) #7개 생선 목록 생성
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_loss', max_iter=100, tol=None, random_state=42) #tol=None 자동 멈춤 해제
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
#출력 0.957983193277311
print(sc.score(test_scaled, test_target))
#출력 0.925
