[혼자 공부하는 머신러닝+딥러닝] 10강. 확률적 경사 하강법 알아보기 - 점진적 학습, 온라인 학습
https://www.youtube.com/watch?v=A1UUnfijQfQ&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=10
- 확률적 경사 하강법(Stochastic Gradient Descent, SGD)
- 머신러닝 알고리즘이 아니다.
- 머신러닝, 딥러닝 알고리즘을 훈련하는 방법이다. 혹 최적화 하는 방법이다
- 경사하강법의 종류
- 확률적 경사 하강법 : 1개씩 샘플을 선택해 경사를 내려간다
- 미니배치 경사 하강법(minibatch gradient descent): 1개씩이 아니라 무작위로 몇 개의 샘플을 선택해 경사를 내려간다.
- 배치 경사 하강법(batch gradient descent): 극단적으로 한 번 경사로를 이동하기 위해 전체 샘플을 사용하는 것이다.
- 전체 데이터를 사용하기 때문에 가장 안정적인 방법이 될 수 있다. 단, 그만큼 컴퓨터 자원을 많이 요구한다.
- 손실 함수
- 머신러닝 알고리즘의 나쁜 정도를 측정하는 함수이다.
- 확률적 경사 방법을 이용해 손실함수가 낮아지는 쪽으로 가중치(W), 계수/기울기 절편(b)를 옮긴다.
- [0, 0.25, 0.5, 0.75, 1] 이렇게 구간이 있는 정확도에서는 손실함수로 사용할 수 없다.
- 정확도는 손실함수로 사용할 수 없는 측정 방법이다.
- 정확도 = 미분 가능하지 않다(?) -> 연속적인 데이터만 가능하다.
- 미분가능한 함수가 필요하다.
- 최적화를 위해서는 다른 손실함수를 사용한다.
- 로지스틱 손실 함수
- 이진 크로스 엔트로피 손실 함수
- 손실 함수에 로그 함수를 적용하면 0에 가까울 수록 아주 큰 음수가 되기 때문에 손실을 아주 크게 만들어 준다.
- 로그함수를 적용해 '높은 손실'일수록 아주 큰 양수값이 되도록 만들어 준다.
- 로지스틱 손실함수
- 분류일때 사용
- 정답과 가까운 예측은 '낮은 손실'로 표현되고, 먼 예측은 '높은 손실'로 표현되도록 계산
- 회귀 방법
- 평균 절대값 오차나 평균 제곱 오차를 사용할 수 있다. 둘 다 미분가능해서 손실함수를 사용할 수 있다.
- 평균 절댓값 오차 : 타깃에서 예측을 뺀 절댓값을 모든 샘플에 평균한 값
- 평균 제곱 오차 : 타깃에서 예측을 뺀 값을 제곱한 후 모든 샘플에 평균한 값
- 손실함수나 측정지표를 동일하게 가져갈 수 있다.
- 머신러닝, 딥러닝 대부분 모델에서 평균 제곱 오차를 사용하는 편이다.
- 분류일 때는 정확도로 모델의 성능을 보고 정확도는 로지스틱 손실함수로 최적화를 한다.
- 정확도는 미분이 안되기 때문에 경사 하강법을 사용할 수 없다. 때문에 경사 하강법을 사용할 수 있는 방법으로 찾은 것이 로지스틱 손실함수이다.
- 확률적 경사 하강법을 사용하기 위해서는 각 특성마다의 스케일이 같아야 한다.
- 경사를 공평하게 평가하기 위해서이다.
- 데이터를 전처리 해야 한다 대표적으로 표준점수로 특성의 스케일을 바꿔줄 수 있다.
- 다중 분류일 경우 SGDClassifier에 loss='log'로 지정하면 클래스마다 이진 분류 모델을 만든다.
- 생선 클래스를 예로들면 도미를 양성 클래스로 두고 나머지를 모두 음성 클래스로 두고 모델을 만드는 식이다.
- 이런 방식을 OvR(One versus Rest)라고 부른다.
- 데이터 분할 : 훈련 세트와 타겟, 테스트 세트와 타겟
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)
- StandardScaler는 평균과 분산을 이용한 전처리 스케일러이다.
- 학습 세트를 fit 함수를 이용해 평균과 표준편차를 구한다.
- transform()을 이용해 정규화/표준화를 수행한다.
- fit_transform()으로 두 작업을 한번에 수행할 수 있다.
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
- 사이킷런에서 제공하는 경사 하강법 : SGDClassifier(분류) <-> SGDRegressor(회귀)
from sklearn.linear_model import SGDClassifier
- 머신러닝을 최적화 하는 방법이기에 어떤 모델을 최적화 할지를 정의해 줘야 한다.
- loss 변수는 손실함수의 종류를 정의하며, 'log'만 정의하면 로지스틱 손실 함수를 사용하겠다는 뜻이 된다.
- max_iter 변수는 수행할 에포크 횟수를 지정한다.
sc = SGDClassifier(loss='log_loss', max_iter=10, random_state=42)
- fit()을 사용할 때는 이전 학습 내용을 사용하지 않고 매번 새로 학습을 한다.
- partial_fit()은 기존 학습한 내용을 그대로 유지하면서 학습을 한다.
sc.partial_fit(train_scaled, train_target)
- SGDClassifier는 확률적 경사 하강법만 지원한다. 배치, 미니배치 하강법은 지원하지 않는다.
- 조기종료
- 에포크 또한 과대 적합과 과소 적합이 존재한다.
- partial_fit()는 데이터의 일부부만 전달된다고 가정한다. 때문에 가능한 전체 샘플의 클래스 객체 갯수, 목록을 전달해 줘야 한다.
- fit()을 이전에 사용했다면 이미 전체 목록을 전달했었기 때문에 따로 고려할 필요가 없다.
- 하지만 두 메서드를 섞어 사용하는 것은 사이킷런이 안전을 보장하지는 않는다.
sc.partial_fit(train_scaled, train_target, classes=classes)
- reference :
'데이터분석-머신러닝-AI > 강의 정리' 카테고리의 다른 글
[혼자 공부하는 머신러닝+딥러닝] 12강. 교차 검증과 그리드 서치 - (1) | 2023.11.13 |
---|---|
[혼자 공부하는 머신러닝+딥러닝] 11강. 로지스틱 회귀로 와인 분류하기 & 결정 트리 - 와인 분류하기 (1) | 2023.11.12 |
[혼자 공부하는 머신러닝+딥러닝] 9강. 로지스틱 회귀 알아보기 - 분류모델 (2) | 2023.11.09 |
[혼자 공부하는 머신러닝+딥러닝] 8강. 특성 공학과 규제 알아보기 - 다중회귀 (1) | 2023.10.25 |
[혼자 공부하는 머신러닝+딥러닝] 7강. 사이킷런으로 선형 회귀 모델 만들어 보기 - 선형 회귀, 다항회귀 (0) | 2023.10.24 |
댓글