2 분 소요

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

확률적 경사 하강법(SGD)은 기계 학습에서 널리 사용되는 최적화 알고리즘입니다. 이 알고리즘은 대규모 데이터 셋에서도 빠르고 효율적으로 동작합니다. 아래는 확률적 경사 하강법에 대한 핵심 포인트와 상세한 설명입니다.

핵심 포인트

  • 확률적 경사 하강법: 훈련 세트에서 샘플 하나씩 꺼내 손실 함수의 경사를 따라 최적의 모델을 찾는 알고리즘.
  • 미니배치 경사 하강법: 여러 개의 샘플을 동시에 사용하는 방법.
  • 배치 경사 하강법: 전체 샘플을 한 번에 사용하는 방법.
  • 손실 함수: SGD가 최적화할 대상. 이진 분류에는 로지스틱 회귀, 다중 분류에는 크로스엔트로피 손실 함수, 회귀 문제에는 평균 제곱 오차 손실 함수를 사용.
  • 에포크: 전체 샘플을 모두 사용하는 한 번의 반복. 수십에서 수백 번의 에포크를 반복.

주요 패키지와 함수

  • scikit-learn

    • SGDClassifier
      

      : 확률적 경사 하강법을 사용한 분류 모델.

      • loss 매개변수: 최적화할 손실 함수를 지정 (기본값은 ‘hinge’ 손실 함수).
      • penalty 매개변수: 규제의 종류를 지정 (기본값은 L2 규제를 위한 ‘l2’).
      • alpha 매개변수: 규제 강도 (기본값은 0.0001).
      • max_iter 매개변수: 에포크 횟수 지정 (기본값은 1000).
      • tol 매개변수: 반복을 멈출 조건 (기본값은 0.001).
    • SGDRegressor
      

      : 확률적 경사 하강법을 사용한 회귀 모델.

      • loss 매개변수: 손실 함수를 지정 (기본값은 ‘squared_loss’).

1. 라이브러리 임포트 및 데이터 준비

먼저, 필요한 라이브러리를 임포트하고 데이터를 준비합니다.

from sklearn.linear_model import SGDClassifier, SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 예시 데이터 준비
X, y = load_some_data()  # 적절한 데이터 로드 함수 사용
  • SGDClassifier, SGDRegressor: 확률적 경사 하강법을 사용한 분류 및 회귀 모델을 생성하는 클래스.
  • StandardScaler: 데이터 표준화를 위한 클래스.
  • train_test_split: 데이터를 훈련 세트와 테스트 세트로 분할하기 위한 함수.
  • load_some_data(): 실제로는 사용자가 로드하는 데이터셋을 가져오는 함수입니다.

2. 데이터 분할

데이터를 훈련 세트와 테스트 세트로 분할합니다.

train_data, test_data, train_target, test_target = train_test_split(X, y, test_size=0.2, random_state=42)
  • train_test_split: 데이터를 무작위로 섞어서 훈련 세트와 테스트 세트로 나눕니다.
    • test_size=0.2: 데이터의 20%를 테스트 세트로 사용합니다.
    • random_state=42: 결과 재현성을 위해 난수 시드를 설정합니다.

3. 데이터 스케일링

훈련 세트와 테스트 세트를 표준화합니다.

scaler = StandardScaler()
train_scaled = scaler.fit_transform(train_data)
test_scaled = scaler.transform(test_data)
  • StandardScaler(): 각 특징의 평균을 0, 분산을 1로 맞추어 표준화합니다.
  • fit_transform(train_data): 훈련 데이터의 평균과 분산을 계산하여 변환합니다.
  • transform(test_data): 훈련 데이터의 평균과 분산을 사용하여 테스트 데이터를 변환합니다.

4. SGDClassifier 사용 예제

로지스틱 회귀를 사용한 확률적 경사 하강법 분류 모델을 학습시키고 평가합니다.

clf = SGDClassifier(loss='log', max_iter=1000, tol=0.001, random_state=42)
clf.fit(train_scaled, train_target)
print("훈련 세트 점수:", clf.score(train_scaled, train_target))
print("테스트 세트 점수:", clf.score(test_scaled, test_target))
  • SGDClassifier(loss='log', max_iter=1000, tol=0.001, random_state=42): SGDClassifier 객체를 생성합니다.
    • loss='log': 로지스틱 회귀 손실 함수를 사용합니다.
    • max_iter=1000: 최대 1000번의 에포크 동안 학습합니다.
    • tol=0.001: 손실 함수가 이 값 이하로 감소하면 학습을 중지합니다.
    • random_state=42: 결과 재현성을 위해 난수 시드를 설정합니다.
  • fit(train_scaled, train_target): 훈련 데이터를 사용하여 모델을 학습시킵니다.
  • score(train_scaled, train_target): 훈련 세트에 대한 모델의 성능을 평가합니다.
  • score(test_scaled, test_target): 테스트 세트에 대한 모델의 성능을 평가합니다.

5. SGDRegressor 사용 예제

제곱 오차를 사용한 확률적 경사 하강법 회귀 모델을 학습시키고 평가합니다.

reg = SGDRegressor(loss='squared_loss', max_iter=1000, tol=0.001, random_state=42)
reg.fit(train_scaled, train_target)
print("훈련 세트 점수:", reg.score(train_scaled, train_target))
print("테스트 세트 점수:", reg.score(test_scaled, test_target))
  • SGDRegressor(loss='squared_loss', max_iter=1000, tol=0.001, random_state=42): SGDRegressor 객체를 생성합니다.
    • loss='squared_loss': 평균 제곱 오차 손실 함수를 사용합니다.
    • max_iter=1000: 최대 1000번의 에포크 동안 학습합니다.
    • tol=0.001: 손실 함수가 이 값 이하로 감소하면 학습을 중지합니다.
    • random_state=42: 결과 재현성을 위해 난수 시드를 설정합니다.
  • fit(train_scaled, train_target): 훈련 데이터를 사용하여 모델을 학습시킵니다.
  • score(train_scaled, train_target): 훈련 세트에 대한 모델의 성능을 평가합니다.
  • score(test_scaled, test_target): 테스트 세트에 대한 모델의 성능을 평가합니다.

댓글남기기