본문으로 바로가기

요즘 저는 한양대에서 본교와 에리카를 합쳐서 수업하는 머신러닝 수업을 교양으로 공동 수업 중이고, 한양대 에리카에서 로봇공학과 학생들을 대상으로 기계학습론이라는 과목도 공동 진행 중인데요. 그래서 수업용으로 자료를 만들다가, 한 가지 발견한 것이 있네요. 바로 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()

결과도 같이 그려보면~

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


댓글을 달아 주세요

  1. BlogIcon 북두협객 2019.09.23 08:08 신고

    수업용으로 프로그램 잘 짜셨네요~ 한양대에서 수업도 하시고 대단하십니다^^

  2. BlogIcon 핑구야 날자 2019.09.25 06:54 신고

    잘 보고 갑니다 오늘은 조금 어렵네요 즐거운 하루 보내세요

  3. BlogIcon 잉여토기 2019.09.25 11:02 신고

    깔끔한 직선이 '짠' 하고 나타났네요.
    선형 회귀를 프로그램으로 이렇게 짜는군요.

  4. BlogIcon M의하루 2019.09.29 21:15 신고

    멋지네요~ 잘보고갑니다~