-
확률적 경사 하강법 (+ 로지스틱 회귀)머신러닝(+딥러닝) 2023. 8. 8. 17:43
문제
혼공머신 04-2: 생선의 weight, length, diagonal(대각선 길이), height, width 가 주어졌을때, 7가지(species) 생선중 어떤 생선일지를 맞춰보라.
코드
fish 데이터 준비
import pandas as pd fish = pd.read_csv('https://bit.ly/fish_csv_data') fish
Input 데이터와 target 데이터 준비
fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy() fish_target = fish['Species'].to_numpy()
training 세트와 test 세트로 나누기
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)
모델 훈련
loss='log_loss' 로 loss function 을 로지스틱 손실 함수로 지정한다. (default 는 'hinge' loss 로 support vector machine 이라 불림) max_iter 값에 따라 over-fitting 또는 under-fitting 이 될 수 있는데, 조금 있다 살펴보자.
from sklearn.linear_model import SGDClassifier sc = SGDClassifier(loss='log_loss', max_iter=10, random_state=42) sc.fit(train_scaled, train_target) sc.score(train_scaled, train_target) # 0.773109243697479 sc.score(test_scaled, test_target) # 0.775
훈련시 반복횟수(max_iter) 가 10 으로 작은것 같다. 에포크를 한번더 실행해 보자
에포크를 한번 더 실행하면, 아래에서 처럼 score 값이 올라간 것을 확인할 수 있다.
sc.partial_fit(train_scaled, train_target) sc.score(train_scaled, train_target) # 0.8151260504201681 sc.score(test_scaled, test_target) # 0.85
훈련에 사용할 좀더 나은 max_iter 값을 찾아보자
epoch 를 0 에서 부터 300번 까지 순차적으로 수행하기 위해 partial_fit() 을 사용했고, 이때 classes 파라미터 값 지정이 필요하다.
import numpy as np sc = SGDClassifier(loss='log_loss', 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)) import matplotlib.pyplot as plt plt.plot(train_score) plt.plot(test_score) plt.xlabel('epoch') plt.ylabel('accuracy') plt.show()
좀더 나은 max_iter 값으로 최종 훈련을 하자
위의 그래프를 봤을 때 max_iter=100 이면 적당한 것 같다. SGDClassifier 는 일정 에포크 동안 성능이 향상되지 않으면 더 이상 훈련하지 않고 자동으로 멈추는데, tol=None 으로 지정해 무조건 max_iter=100 만큼 반복하도록 한다.
from sklearn.linear_model import SGDClassifier sc = SGDClassifier(loss='log_loss', max_iter=100, tol=None, random_state=42) sc.fit(train_scaled, train_target) sc.score(train_scaled, train_target) # 0.957983193277311 sc.score(test_scaled, test_target) # 0.925
최종 모델로 예측해 보기
test 데이터 맨위의 5개 레코드에 대해 예측해 본다.
sc.predict(test_scaled[:5]) # Perch Smelt Pike Perch Perch proba = sc.predict_proba(test_scaled[:5]) np.round(proba, decimals=3)
sc.classes_
참고
- 로지스틱 회귀(logistic regression) 는 이름은 회귀이지만 분류 모델이다. SGDClassifier 는 확률적 경사 하강법을 사용한 분류 모델을 만든다.
- SGDRegressor 는 확률적 경사 하강법을 사용한 회귀 모델을 만든다.
'머신러닝(+딥러닝)' 카테고리의 다른 글
랜덤 포레스트 & 랜덤 서치 (0) 2023.08.10 릿지 회귀 (0) 2023.08.08 sklearn 으로 학습한 모델을 파일로 저장하기 (0) 2023.08.08