이번 포스팅에서는 경사하강법에 대한 실습 과정을 알아보도록 하겠습니다.
본 포스팅은 혼자 공부 하는 머신러닝(박해선 저)와 충남대학교 AI 중급교육과정을 참고하였습니다.
경사하강법과 관련된 이론은 아래 포스팅을 참고해주시기 바랍니다.
https://math-love.tistory.com/24
<머신러닝 이론 01> 선형회귀 와 경사하강법
이번 포스팅에서는 선형회귀와 경사하강법 이론에 대한 기본적인 과정을 알아보겠습니다. 선형회귀 Input_data와 Target_data가 아래와 같이 열벡터로 주어졌다고 가정해보겠습니다. 각각의 점이 (1,
math-love.tistory.com
확률적 경사하강법
우선 data를 불러오겠습니다.
import pandas as pd
fish = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/fish_SGD.csv')
fish 변수는 Data_Frame으로 copy되었습니다.
fish의 head를 보고 어떤 Data_Frame인지 확인해보겠습니다.
fish.head()
Data_Frame을 준비했으니 input과 target을 나눠주어야 합니다.
'Weight', 'Length', 'Diagonal', 'Height', 'Width' 들을 input으로 두고
'Species'를 target으로 두겠습니다.
fish_input = fish[['Weight','Length','Diagonal','Height','Width']]
fish_target = fish['Species']
Input과 Target을 나누었으니 Train_set과 Test_set을 분류해 주어야겠지요.
sckit - learn을 통해 Train_set과 Test_set을 나눠봅시다.
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, test_size = 0.2, random_state = 42)
경사하강법을 사용할 때는 반드시 모든 feature들을 같은 scale을 가지도록 해야합니다. 그렇지 않으면 학습시간이 너무 오래걸리기 때문입니다. data값이 너무 크면 학습시간이 오래걸릴 수 밖에 없겠죠.
StandardScaler를 써서 scale작업을 진행해볼게요.
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
Train_set, Test_set 분리도 했고 input_data들을 표준화까지 시켰습니다.
이제 경사하강법을 진행해봅시다.
SGDClassifier를 씁니다.
SGDClassifier는 확률적 경사하강법을 제공하는 대표적인 분류용 클래스입니다.
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss = 'log', max_iter = 10, random_state = 42)
sc.fit(train_scaled, train_target_
그런데 SGDClassifier 객체를 생성하는 과정에서 생성자 파라미터에 낯선 파라미터가 보입니다.
loss와 max_iter이겠죠.
우선 파라미터 'loss'는 손실함수를 정의합니다.
loss = 'log'로 정의했으니 뭔가 로지스틱회귀의 Log loss로 정의한 것 같습니다.
target_set을 보면 'Species'에 따리 분류(Classification)하기 때문에 Log loss를 사용하는 것입니다.
loss의 dafault값은 hinge인데 이건 조금 뒤에 알아보도록 하겠습니다.
max_iter는 최대 epoch
즉 최대 반복 횟수를 지정합니다.
전체 Data_set을 1번 모두 학습했다면 1epoch입니다.
epoch 값이 크면 클 수록 model의 score값이 높지만 시간이 오래걸립니다.
자 이제 Train_set과 Test_set을 통해 model의 성능을 측정해봅시다.
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
생각보다 score가 낮게 나왔네요.
1epoch를 한 번만 더 진행해볼까요?
SGDClassifier 객체를 한 번 더 만들지 않고, parial_fit() 함수를 써서 1epoch를 더할 수 있습니다.
sc.partial_fit(train_scaled, train_target)
1epoch를 더 수행했으니 점수가 더 올라갔을겁니다.
score를 출력해보겠습니다.
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
에포크와 과대 / 과소적합
그럼 에포크를 얼마로 해야 적절할까요?
반복문을 통해 그 값을 찾아보겠습니다.
그 전에 물고기 종류를 한 번 알아보겠습니다.
cl = np.unique(train_target)
print(cl)
이제 for문을 써볼게요.
sc = SGDClassifier(loss = 'log', random_state = 42)
train_score = []
test_score = []
for _ in range(0, 300) :
sc.partial_fit(train_scaled, train_target, classes = cl)
train_score.append(sc.score(train_scaled, train_target))
test_score.append(sc.score(test_scaled, test_target))
여기서 partial_fit() 메서드에 하이퍼파라미터로 classes를 지정해줬습니다.
partial_fit() 메서드는 train 데이터의 일부만 사용한다고 가정하기 때문에 fit 메서드를 통해 target_data를 지정하지 않고 partial_fit() 메서드를 사용한다면 반드시 classes를 지정해 주어야 합니다.
이제 epoch당 score를 시각화해볼까요?
plt.plot(train_score, label = 'Train Score')
plt.plot(test_score, label = 'Test Score')
plt.legend(loc = 'lower right', fontsize = 10)
plt.xlabel("Epoch")
plt.ylabel("Accuracy")
plt.show()
그래프를 보니 200정도의 epoch를 가지면 좋은 model평가를 받을 수 있을 것 같습니다.
200보다 너무 작다면 과소적합
200보다 너무 크다면 과대적합에 해당되겠죠.
max_iter = 200으로 설정하고 다시 한 번 학습시켜보겠습니다.
sc = SGDClassifier(loss = 'log', max_iter = 200, tol = None, random_state = 42) # tol = None 반복을 하다가 멈춤
sc.fit(train_scaled, train_target)
이제 model의 score를 볼게요.
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
마지막으로 손실 함수를 hinge로 바꿔서 학습해보겠습니다.
sc = SGDClassifier(loss = 'hinge', max_iter = 100, tol = None, random_state = 42)
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
'데이터 사이언스 > 하계 AI 중급과정' 카테고리의 다른 글
Ch 7. Logistic Regression (로지스틱 회귀) (0) | 2023.07.15 |
---|---|
Ch 5. Multiple Regression (다중 회귀) (0) | 2023.07.12 |
Ch 4. Polynomial Regression (다항회귀) (0) | 2023.07.12 |
Ch 3. Linear Regression(선형회귀) (0) | 2023.07.12 |
Ch 2. 훈련 및 테스트 세트 (Train set, Test set) (0) | 2023.07.11 |