2021. 6. 24. 21:24ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
10강 - 확률적 경사 하강법 알아보기

지난 시간에

럭키 백 대박!
럭키 백이 대박이 나서 생선 종류나 수가 늘어나면서 데이터가 증가하게 됨.
이 과정에서 데이터가 추가될 때마다 새로운 모델을 만드는 것도 문제.
새로운 데이터가 추가됐을 때 일부 데이터를 버리고 훈련 데이터 전체 크기를 일정하게 유지하게 만드는 것도 문제.
원래 있던 모델을 그대로 유지하면서 업데이트만 하는 것도 문제(가중치w, 절편b 유지, 업데이트).
점진적 학습 - 처음부터 모델 훈련하는 게 아니라 기존 모델 유지하며 새로운 모델만 업데이트하는 방식. 모델 서비스 도중 업데이트도 가능하고 오프라인으로 서비스 중지하고도 업데이트 가능함.
온라인 학습 - 점진적 학습과 유사하지만 다름. 온라인 도중에만 업데이트 가능.
확률적 경사 하강법 - Stochastic Gradient Descent(SGD)
온라인 학습 혹은 점진적 학습 방법을 사용할 수 있는 훈련 방법, 최적화 방법. 알고리즘은 아니고 알고리즘의 최적화 방법.
확률적 경사 하강법
확률적 - 랜덤
경사 - 기울기
하강법 - 내려감
가장 가파른 경사를 찾아 내려가되 조금씩 내려감.
크게 내려가면 최적점을 놓치고 넘어갈 수 있어 조금씩 천천히 내려감.

샘플을 꺼내서 훈련하는 걸 경사를 따라 내려간다고 표현.
하나씩 꺼내서 훈련 - 확률적 경사 하강법
여러 개씩 꺼내서 훈련 - 미니 배치 경사 하강법 (개수:하이퍼 파라미터 - 보통 2배수 사용)
한번에 다 꺼내서 훈련 - 배치 경사 하강법
에포크(epoch) - 경사 하강법에서 훈련 세트를 다 썼을 때 쓰는 표현.
조금씩 내려가야 하기 때문에 한 번만 쓰는 게 아니라 여러 번 사용하여 에포크를 여러 번 반복하게 됨.
샘플을 한 개씩 사용하는 것보다 여러 개 사용하면 판단이 합리적이고 좋은 방향으로 유도됨.
확률적 경사 하강법보다 미니 배치 경사 하강법이, 미니 배치 경사 하강법보다 배치 경사 하강법이 이 점에서는 더 유리하지만 딥러닝은 데이터양이 크기 때문에 몽땅 꺼내기는 자원들이 한정적이라 무리가 있음.
따라서 보통 배치 경사 하강법보다 확률적 경사 하강법이나 미니 배치 경사 하강법이 많이 사용됨.
손실 함수
나쁜 정도를 측정하는 함수

분류 - 정확도로 판단
정확도는 0, 0.25, 0.5, 0.75, 1 과 같이 끊어져 있음. 구간이 있는 정확도는 손실함수로 사용할 수 없음.
미분가능하지 않아서 그런 것.
경사 하강법을 사용하기 위해서는 미분 가능한 것을 사용하는 것이 좋음.
따라서 미분 가능한 다른 손실함수를 사용하는 것이 더 좋음
로지스틱 손실 함수(이진 크로스 엔트로피 손실 함수)

음수로 만들어 손실에 대한 값을 개념적으로 적용 가능함.
음성 클래스는 정답값이 본래 0인데 0을 곱하면 무조건 0이 나오므로 정답을 1로 바꾸고 예측값을 (1- 예측값)으로 바꿔줌.
정답에 가까운 것은 낮은 값을 갖고 정답에 먼 것은 손실이 높은 값을 가짐.
로그함수
타깃 = 1
예측 값 = 0.8일 때 -log(예측확률)에 넣으면 -log0.8 = -(log8 - log10) = -log8 + 1 = 0.096910013 (작은 양수)
예측 값 = 0.2일 때 -log0.2 = -(log2 - log10) = -log2 + 1 = 0.69897000433 (큰 양수)
타깃 = 0
예측 값 = 0.8일 때 -log(1- 예측확률)에 넣으면 -log(1 - 0.8) = -log0.2 = -(log2 - log10) = -log2 + 1 = 0.69897000433 (큰 양수)
예측 값 = 0.2일 때 -log(1 - 0.2) = -log0.8 = -(log8 - log10) = -log8 + 1 = 0.096910013 (작은 양수)
이걸 참고로 손실이 가장 작은 걸 선택하여 가중치(계수) 값을 변경하여 적용 가능함.
cf)
회귀
평균 절댓값 오차
평균 제곱 오차
회귀에서는 위의 2가지가 미분가능하기 때문에 사용할 수 있음.
회귀에서는 손실함수 = 측정지표 가능.
분류
정확도(성능) - 로지스틱 손실 함수로 최적화
미분 가능한 다른 대안 사용한 것.
데이터 전처리
import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv_data')
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)
가장 가파른 경사를 따라 내려가기 위해서는 각 특성마다 스케일이 같아야 함.
경사하강법 알고리즘 사용 시에는 반드시 데이터 전처리 과정을 거쳐야 함.
StandardScaler
항상 훈련세트에서 찾은 통계값으로 훈련세트와 테스트세트 모두 변경해줘야 함.
SGDClassifier
확률적 경사 하강법 분류 알고리즘
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', 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
# 과소적합으로 볼 수 있음. epoch 증가하면서 과대적합으로 갈 수 있음.
sc.partial_fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
# //0.8151260504201681
print(sc.score(test_scaled, test_target))
# //0.825
확률적 경사 하강법 회귀 알고리즘 - SGDRegressor 사용
score 메소드로 출력되는 것 - 정확도
loss = 'log' 는 로지스틱 손실 함수로 지정.
SGDClassifier 자체는 알고리즘이 아니라 어떤 알고리즘을 사용할지 선택해 줘야 함.
max_iter = 10 - epoch와 동일
fit 메소드 호출 - 기존의 학습 내용 다 버리고 다시 훈련하는 것.
partial_fit 메소드 호출 - 기존 학습 w(가중치), b(절편) 유지하면서 다시 훈련. 정확도 향상됨.
SGDClassifier - 확률적 경사 하강법만 지원, 배치, 미니배치 지원 X
에포크와 과대/과소적합

알파값에 따라 과대적합과 과소적합이 결정되듯이 에포크에 따라서도 과대적합과 과소적합이 결정됨.
적절한 지점을 조기종료라고 부름
조기 종료
sc = SGDClassifier(loss='log', random_state=42)
train_score = []
test_score = []
classes = np.unique(train_target)
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))
sc = SGDClassifier(loss='log', max_iter=100, tol=None, random_state=42)
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
# //0.957983193277311
print(sc.score(test_scaled, test_target))
# //0.925

에포크가 클수록 자원을 많이 소모하며 테스트 세트와 훈련 세트 간 간격이 가장 작은 편인 100 정도로 잡는 것이 적절.
다른 loss로는 'hinge' 존재 SVM 알고리즘 사용하는 방법.
참고 자료
https://www.youtube.com/watch?v=A1UUnfijQfQ&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=10
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
17강 - 인공 신경망 ▶️ 간단한 인공 신경망 모델 만들기 (0) | 2021.06.24 |
---|---|
11강 - 로지스틱 회귀로 와인 분류하기 & 결정 트리 (0) | 2021.06.24 |
9강 - 로지스틱 회귀 알아보기 (0) | 2021.06.24 |
8강 - 특성 공학과 규제 알아보기 (0) | 2021.06.17 |
7강 - 사이킷런으로 선형 회귀 모델 만들어 보기 (0) | 2021.06.17 |