SGD 를 이용한 정규화 기법 적용

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 scikit-learn 의 SGDClassifier 와 SGDRegressor 를 배우고, 이를 사용하여 데이터에 L1, L2, 그리고 탄성 네트워크 (elastic-net) 패널티를 적용하는 방법을 학습합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접속합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제약으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기

첫 번째 단계는 필요한 라이브러리를 가져오는 것입니다. NumPy, Matplotlib, 그리고 scikit-learn 을 사용할 것입니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier, SGDRegressor

데이터 생성

패널티를 적용하기 위한 샘플 데이터를 생성합니다. 이 예제에서는 각각 100 개의 샘플을 가진 두 개의 클래스 데이터를 생성합니다.

np.random.seed(42)

## 두 개의 클래스 데이터 생성
X = np.random.randn(200, 2)
y = np.repeat([1, -1], 100)

L1 패널티 적용

이제 SGDClassifier 를 사용하여 데이터에 L1 패널티를 적용합니다.

## L1 패널티를 가진 분류기 생성
clf = SGDClassifier(loss='hinge', penalty='l1', alpha=0.05, max_iter=1000, tol=1e-3)

## 모델 학습
clf.fit(X, y)

## 결정 경계 시각화
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('L1 Penalty')
plt.show()

L2 패널티 적용

이제 SGDClassifier 를 사용하여 데이터에 L2 패널티를 적용합니다.

## L2 패널티를 가진 분류기 생성
clf = SGDClassifier(loss='hinge', penalty='l2', alpha=0.05, max_iter=1000, tol=1e-3)

## 모델 학습
clf.fit(X, y)

## 결정 경계 시각화
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('L2 Penalty')
plt.show()

탄성 네트 패널티 적용

이제 SGDClassifier 를 사용하여 데이터에 탄성 네트 패널티를 적용합니다.

## 탄성 네트 패널티를 가진 분류기 생성
clf = SGDClassifier(loss='hinge', penalty='elasticnet', alpha=0.05, l1_ratio=0.15, max_iter=1000, tol=1e-3)

## 모델 학습
clf.fit(X, y)

## 결정 경계 시각화
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('탄성 네트 패널티')
plt.show()

요약

이 실험에서 scikit-learn 의 SGDClassifier 를 사용하여 데이터에 L1, L2 및 탄성 네트 패널티를 적용하는 방법을 배웠습니다. 샘플 데이터를 생성하고 패널티를 적용한 후 결정 경계를 플롯했습니다. 이는 특히 과적합을 방지하기 위한 머신 러닝 모델의 정규화에 유용한 도구입니다.