본문 바로가기

Theory/MachineLearning

Scikit Learn (sklearn) SGDRegressor 사용할 떄 Loss 그래프 확인하는 방법

요즘 저는 한양대에서 본교와 에리카를 합쳐서 수업하는 머신러닝 수업을 교양으로 공동 수업 중이고, 한양대 에리카에서 로봇공학과 학생들을 대상으로 기계학습론이라는 과목도 공동 진행 중인데요. 그래서 수업용으로 자료를 만들다가, 한 가지 발견한 것이 있네요. 바로 scikit learn의 linear_model에 SGDRegressor에서 케라스나 텐서플로우 처럼 iteration마다 loss를 history로 저장해서 그래프로 확인하는 기능을 찾을 수 가 없더라구요ㅠㅠ. 그래서 역시 구글을 뒤졌죠^^ 이제 없던 옵션을 만들러 갑니다.^^ (아 근데 혹시 이것보다 더 간단한 방법이 있을 수 있죠.ㅠㅠ. 제가 들 찾아봤을 수 있으니까요ㅠㅠ)

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(13)
X = np.arange(0, 5, 0.1)
y = 2 + 3 * X + np.random.randn(len(X))

X = X.reshape(len(X), 1)

plt.scatter(X, y, s=10)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

먼저 시험 데이터를 만들어야죠.

이렇게 생겼습니다.^^ 뭐 누가봐도 선형회귀 테스트하려는가보다.. 하는 거죠^^

from sklearn import linear_model

clf = linear_model.SGDRegressor(max_iter=100, verbose=1)
clf.fit(X, y)

그리고 sklearn의 linear_model에서 SGDRegressor를 가지고 옵니다. verbose 옵션을 주면 iteration마다 상황을 보여주죠~

근데, 저걸 그래프로 확인하고 싶다는 거죠ㅠㅠ. 여기서 사용하는 것이 바로~ 저 출력 메세지를 가지고 오는 겁니다.^^

import sys
import io
import matplotlib.pyplot as plt

sys.stdout = io.StringIO()

clf.fit(X, y)

loss_history = sys.stdout.getvalue()
loss_list = []
for line in loss_history.split('\n'):
    if(len(line.split("loss: ")) == 1):
        continue
    loss_list.append(float(line.split("loss: ")[-1]))

plt.figure()
plt.plot(np.arange(len(loss_list)), loss_list)
plt.xlabel("Time in epochs")
plt.ylabel("Loss")
plt.show()

Jupyter의 출력 화면의 출력 메시지를 io.StrintIO() 함수를 이용해서 받아 올 수 있습니다. 그리고 거기서 loss부분을 잘라 가져오는 거죠~^^ 와우~

그러면 이렇게 이쁘게 loss 그래프를 그릴수있습니다.^^

뭐~ 선형회귀 성능은 잘 나왔네요 ㅎㅎㅎ

y_predicted = clf.predict(X)

plt.scatter(X, y, s=10)
plt.plot(X, y_predicted, color='r')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

결과도 같이 그려보면~

짠~~~~~~ 입니다. ㅎㅎ

반응형