요즘 저는 한양대에서 본교와 에리카를 합쳐서 수업하는 머신러닝 수업을 교양으로 공동 수업 중이고, 한양대 에리카에서 로봇공학과 학생들을 대상으로 기계학습론이라는 과목도 공동 진행 중인데요. 그래서 수업용으로 자료를 만들다가, 한 가지 발견한 것이 있네요. 바로 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()
결과도 같이 그려보면~
짠~~~~~~ 입니다. ㅎㅎ
'Theory > MachineLearning' 카테고리의 다른 글
전처리와 학습 과정을 하나의 과정으로 실행하는 sklearn의 pipeline (10) | 2020.04.06 |
---|---|
머신러닝을 이용한 Human Activity Recognition 실습 (12) | 2019.10.29 |
Scikit Learn을 이용한 라벨인코딩 - LabelEncode (6) | 2019.09.30 |
결정트리를 이용한 타이타닉 생존자 예측 (26) | 2018.07.02 |
연습삼아 해보는 비트코인(bitcoin) 시세 예측하기 - 그런데 비트코인이랑 목요일이 뭔 관계가 있나??? (34) | 2018.01.08 |
주가 예측? 나도 해보자~ Forecast 수행에 적합한 Prophet (20) | 2017.08.03 |