<알고가야하는 키워드>
점진적 학습(Online 학습): 기존 훈련된 모델에서, 새로운 학습용 데이터가 들어온다면?
--> 기존에 학습한 모델에 새로운 데이터를 계속해서 추가하여 학습하는 방식을 의미
확률적 경사 하강법(Stochastic Gradient Descent): 훈련세트에서 무작위의 샘플을 하나만 골라서 학습한다. 이것을 반복해서 학습을 수행하면서(에포크) 그레디언트를 점점 업데이트 해나가는 방식이다. 이 방식을 통해서 점진적 학습이 가능한걸 알수 있다.
미니배치 경사하강법: 여러개의 샘플을 사용하여 경사 하강법을 진행한다(실전에서 가장 많이 사용함)
배치 경사 하강법: 전체 샘플을 사용하여 경사하강법을 진행한다.(가장 안정적이지만, 전체 데이터를 사용하기에 가장 자원소모를 많이함)
신경망 모델은 확률적 경사하강법과 미니배치 경사하강법을 가장 많이 사용한다는걸 기억하자
손실함수: 머신러닝 알고리즘이 얼마나 부족한지를 알려줌, 작으면 좋지만 최소 손실값이 얼마인지는 알지 못함(적당한 수준에서 만족 해야 함) 중요: 손실함수는 미분가능하며 연속된 식과같은 구조여야만 한다.(이산적이면 경사하강법을 통해서 조금씩 내려가는게 불가능함 )
비용함수와 손실함수의 차이: 거의 둘이 같은 의미로 혼동해서 사용하지만, 굳이 나누자면
손실함수- 샘플 하나에 대한 손실을 정의, 비용함수-훈련세트에 있는 모든 샘플에 대한 손실 함수의 합을 말함
<로지스틱 손실 함수(이진 크로스엔트로피 손실 함수)> #실제 로지스틱 회귀에서 사용
우선 타깃을 양성(1), 음성(0)으로 나누고 각각 예측확률이 있다고 가정 해보자
예측 | 정답(타깃) | 손실계산(항상 타깃이 1일때를 기준으로 계산해야 한다. 3,4번째를 잘 보자) |
1 (샘플 예측확률: 0.9) | 1 (맞춤) | -1*0.9 # 낮은 손실 |
0 (샘플 예측확률: 0.3) | 1 (틀림) | -1*0.3 # 높은 손실 |
0 (샘플 예측확률: 0.2) | 0 (맞춤) | -1*0.8 # 낮은 손실 |
1 (샘플 예측확률: 0.8) | 0 (틀림) | -1*0.2 # 높은 손실 |
위의 손실계산한 식을 양수로 바꾸어 주고 로그 함수에 대입한뒤 출력되는 결과가 로지스틱 손실함수 이다.
(0에 가까워 질수록 오차가 기하급수적으로 늘어난다. --> 손실이 커지는 현상)
타깃이 1일때? | -1*log(예측확률) # -1 곱해줘서 다시 양수로 손실을 바꾸어줌 |
타깃이 0일때? | -1*log(1-예측확률) # -1 곱해줘서 다시 양수로 손실을 바꾸어줌 |

다중분류(Classification)에서는 크로스엔트로피 손실함수를 사용한다.(로지스틱 손실함수랑 비슷)
참고로 회귀에서는 평균 절대값 오차, 평균 제곱 오차(MSE)를 사용한다. (작으면 좋은것)
손실함수를 왜 정의해야 하는지, 이해하는것이 가장 중요함(왜 사용 하는가: 더 좋은 방향으로 경사하강을 진행하기 위해서 이다.)
다중분류에서는 SDGClassifier에 크로스 엔트로피 손실함수를 적용하면, 각 클래스마다 이진 분류를 만든다.
해당 클래스(양성) / 해당 클래스가 아닌 다른 모든 클래스(음성) 이렇게 두고, 5개의 클래스가 존재하면 5개 각각의 손실함수를 이렇게 정의한뒤, 계산을 마친뒤 더해주면 그게 다중분류에서 이진 크로스 엔트로피 손실값이다. 이렇게 양성 음성 클래스를 나누는 방식을 OVR(One Versus Rest)이라고 한다.
조기종료(early stoppiing): 과대적합이 시작되기 직전에 훈련을 멈추는것(SDG클래스에서는 pratial.fit() 메서드를 통해서 점진적으로 학습을 반복한다, 반복문을 통해서 쓰면서 나뻐지는 지점을 파악한다)
SDGclassifier는 기본 손실함수는 힌지손실을 사용한다. 이는 서포트 벡터 머신이라 불리는 또다른 머신러닝을 위한 손실함수 이다.
<유용한 코드>
from sklearn.linear_model import SGDClassifier
import numpy as np
sc = SGDClassifier(loss = 'log_loss', random_state = 42)
classes = np.unique(train_target)
for _ in range(300):
sc.partial_fit(train_scaled, train_target, classes = classes) #부분학슴을 할떄는 항상 클래스를 넣어주어야 한다.
전체코드는 아래와 같다
#%%
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)
# 학습 횟수가 부족해서 과소적합이 발생 함
#%%
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log_loss', 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
# 과소적합이 발생함 한번 학습 횟수를 더 늘려 보자
#%% SGD알고리즘은 미니배치, 배치 경사하강법을 제공하지 않음
# 알아서 1개씩 학습 함
sc.partial_fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target)) # 0.8151260504201681
print(sc.score(test_scaled, test_target)) # 0.85
# %% 그렇다면 얼마나 학습을 진행하고 종료시켜야 하는지를 알아야 한다. 조기종료(early stopping)
import numpy as np
sc = SGDClassifier(loss='log_loss', random_state=42)
train_score = []
test_score = []
classes = np.unique(train_target) # 어떤 요소들이 존재하는지 알려줌
print(classes)
# %%
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))
#%%
import matplotlib.pyplot as plt
plt.plot(train_score)
plt.plot(test_score)
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show() # 100회가 적당하다는것을 알아냄
#%%
sc = SGDClassifier(loss='log_loss', max_iter=100, tol=None, random_state=42)
sc.fit(train_scaled, train_target) #tol = None으로 지정함으로써 무조건 100회를 반복하게 지정함
'머신러닝 & 딥러닝' 카테고리의 다른 글
[혼자 공부하는 머신러닝] 05-02 교차검증과 그리드 서치 (0) | 2024.02.11 |
---|---|
[혼자 공부하는 머신러닝] 05-01 결정트리(Decision tree) (1) | 2024.02.06 |
[혼자 공부하는 머신러닝] 04-01 로지스틱 회귀 (0) | 2024.01.28 |
[혼자 공부하는 머신러닝] 03-03 특성공학과 규제(다중회귀, 변환기, 릿지&라쏘 회귀) (1) | 2024.01.24 |
[혼자 공부하는 머신러닝] 03-2 선형회귀 그리고 다항회귀 (0) | 2024.01.21 |