본문 바로가기

ML,DL

[ML] 확률적 경사 하강법

확률적 경사 하강법

전체 샘플을 사용하지 않고 딱 하나의 샘플을 훈련 세트에서 랜덤하게 골라 가장 가파른 길을 찾아 조금씩 내려오는 방법

 

에포크 epoch

그다음 훈련 세트에서 랜덤하게 또 다른 샘플을 하나 선택하여 경사를 조금 내려간다. 이런 식으로 전체 샘플을 모두 사용할 때까지 계속한다. 훈련 세트를 모두 사용했다면 훈련 세트에 모든 샘플을 다시 채워 넣는다.

이렇게 확률적 경사 하강법에서 훈련 세트를 한 번 모두 사용하는 과정 = 에포크

 

미니배치 경사 하강법

1개씩이 아닌 무작위로 여러개의 샘플을 선택해서 경사 하강법을 수행하는 방식

 

배치 경사 하강법

전체 샘플을 사용하는 방법

전체 데이터를 사용하기 때문에 가장 안정적인 방법이 될 수 있으나, 그만큼 컴퓨터 자원을 많이 사용하게 된다.

 

손실 함수

어떤 문제에서 머신러닝 알고리즘이 얼마나 엉터리인지 특정, 손실 함수의 값이 작을수록 좋음

로지스틱 손실 함수

  • 양성 클래스(타깃 = 1)일 때 손실은 -log (예측 확률)로 계산 
    • 확률이 1에서 멀어져 0에 가까워질수록 손실은 아주 큰 양수가 됨
  • 음성 클래스(타깃 = 0)일때 손실은 -log (1 - 예측 확률) 로 계산
    • 이 예측 확률이 0에서 멀어져 1에 가까워질수록 손실은 아주 큰 양수가 됨

SGDClassifier

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,stratify=y, random_state=42)

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train_scaled = ss.fit_transform(X_train)
X_test_scaled = ss.transform(X_test)
from sklearn.linear_model import SGDClassifier
model = SGDClassifier(loss='log',max_iter=50000, early_stopping=True)
model.fit(X_train_scaled,y_train)
model.score(X_train_scaled,y_train), model.score(X_test_scaled,y_test)

loss 매개변수로 손실 함수를 지정

 

model.partial_fit(X_train_scaled,y_train)
model.score(X_train_scaled,y_train), model.score(X_test_scaled, y_test)

SGDClassifier 객체를 다시 만들지 않고 훈련한 모델을 추가로 훈련할 때 partial_fit 사용

에포크

model = SGDClassifier(loss='log_loss', random_state=25)
history = {
    'train':[], 'test':[]
}
for i in tqdm(range(500)):
  model.partial_fit(X_train_scaled, y_train, classes=np.unique(y_train))
  history['train'].append(model.score(X_train_scaled,y_train))
  history['test'].append(model.score(X_test_scaled,y_test))

500번의 에포크 동안 훈련을 반복하여 진행

반복마다 훈련 세트와 테스트 세트의 점수를 계산하여 추가

plt.plot(range(500),history['train'],label='train')
plt.plot(range(500),history['test'],label='test')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.xlim(1,100)
plt.legend()
plt.show()

 

500번의 에포크 실행 결과

100번째 에포크 이후에는 훈련 세트와 테스트 세트의 차이가 극명하게 나타남

 

model = SGDClassifier(loss='log_loss',random_state=25,max_iter=10,tol=None)  # 손실함수의 값이 tol보다 작으면 최적화를 종료
model.fit(X_train_scaled,y_train)
model.score(X_train_scaled,y_train), model.score(X_test_scaled,y_test)

tol 매개변수 : 성능이 향상될 최솟값을 지정하여 일정 에포크 동안 성능이 향상되지 않으면 더 훈련하지 않고 자동으로 멈춘다

max_iter = 10 만큼 무조건 반복하도록 설정

'ML,DL' 카테고리의 다른 글

[DL] 인공 신경망 - 단일 신경망  (0) 2024.04.16
[ML] 트리의 앙상블  (1) 2024.04.12
[ML] 로지스틱 회귀 Logistic Regression  (0) 2024.04.08
[ML] Ridge, Lasso Regression  (0) 2024.04.08
[ML] 다중 회귀 multiple regression  (0) 2024.04.05