반응형

 

이번 포스팅은 파이썬의 라이브러리들을 사용하여 머신러닝을 통한 데이터를 예측해보는 것에 대한 내용이다. 사이킷런(Scikit-learn)에서 제공하는 daibetes 데이터셋442명의 당뇨병 환자 각각에 대해 10개의 기준 변수, 연령, 성별, 체질량 지수, 평균 혈압 및 6 개의 혈청 측정값이 있으며, 1년 후 질병 진행에 대한 정량적 측정이 담겨있다. 이러한 데이터를 이용하여 400명의 데이터를 학습시키고 442명의 데이터를 예측해보려 한다.

아래의 링크는 머신러닝을 연습할 때 사용해볼 수 있는 데이터셋들의 목록이다. diabetes(당뇨병 dataset) 외에도 boston(보스턴 주택 가격 dataset), iris(붓꽃 식물 dataset) 등등이 있다. 현재 학교에서 수강 중인 수학프로그래밍실습 시간에 범죄율, 도로와의 거리, 산화질소농도, 교사-학생 비율 등등 13가지의 기준 변수에 의거하여 보스턴 주택 가격을 예측하는 실습도 하였었다.

scikit-learn.org/stable/datasets/index.html#toy-datasets

 

7. Dataset loading utilities — scikit-learn 0.23.2 documentation

The 20 newsgroups dataset comprises around 18000 newsgroups posts on 20 topics split in two subsets: one for training (or development) and the other one for testing (or for performance evaluation). The split between the train and test set is based upon a m

scikit-learn.org

 

 

<코드>

import matplotlib.pyplot as plt
import numpy as np
import sklearn

from sklearn import datasets
from sklearn.datasets import load_diabetes

#442 명의 당뇨병 환자 각각에 대해 10 개의 기준 변수, 연령, 성별, 체질량 지수, 평균 혈압 및 6 개의 혈청 측정 값
diabetse=load_diabetes()
print(diabetse.keys())
print(diabetse.feature_names)
aa=diabetse.data # 442x10 행렬의 데이터 (행은 환자번호, 열은 기준 변수)
bb=diabetse.target # 1년 후 질병 진행에 대한 실제 정량적 측정

nr,nc=aa.shape # 442,10

from keras import optimizers
from keras.layers import Dense, Activation
from keras.models import Sequential

nov=400 # 학습할 데이터
x_train=aa[:nov,:] # 입력데이터
y_train=bb[:nov] # 라벨 값

model=Sequential() # Seqeuntial 모델 오브젝트를 model이라는 변수안에 넣고 모델 구성
model.add(Dense(8,input_dim=nc,activation='relu')) # 출력 뉴런(노드), 입력 뉴런(노드), 활성화 함수
model.add(Dense(4,activation='relu'))
model.add(Dense(2,activation='relu'))
model.add(Dense(1)) # 마지막 레이어의 노드갯수는 출력 데이터 갯수와 동일하게 1로 지정
# relu는 은닉층, Dense 레이어는 입력과 출력을 모두 연결해주며 입력과 출력을 각각 연결해주는 가중치를 포함한다.

model.compile(loss='mse',optimizer='adam') #모델 컴파일
# loss는 입력데이터가 출력데이터와 일치하는지 평가해주는 손실함수 (평균제곱오차mse(mean squared error)를 사용)
# optimizer는 손실함수를 기반으로 네트워크가 어떻게 업데이트 될지 결정 (adam 사용)
model.summary() #모델의 구조를 요약해 출력

H=model.fit(x_train,y_train,batch_size=20,epochs=500) # 컴파일 한 모델을 학습
# epochs는 학습 반복횟수
# batch_size는 몇개의 샘플로 가중치를 갱신할 것인지 지정
# x_train,y_train,batch_size=20,epochs=500 뜻은 쉽게말하면 
# 문제집(nov개의 문항)을 500회(epochs) 반복해서 푸는데 
# 20문항(batch_size)을 풀때마다 해답을 맞추는 것을 뜻한다.

plt.figure()
plt.title('loss')
plt.plot(H.history['loss']) # 손실함수 플롯

y_predict=model.predict(aa[:,:]) # 예측값
plt.figure()
plt.title('disease progression one year after baseline')
plt.plot(bb[:],'g',label='real') # 실제 값
plt.plot(y_predict,'r',label='predict') # 예측 값
plt.legend()
plt.show()

 

<실행결과>

위에서 초록선 데이터가 실제 질병 진행도값이고 빨간 선 데이터가 400명의 환자 데이터를 이용하여 머신러닝 한 후 질병 진행도를 예측한 값이다. 10개의 기준 변수(입력 노드, input_dim)에 대해 출력 노드를 각각 8,4,2,1로 지정하고 에포크(epochs)와 배치 사이즈(batch_size)를 각각 500과 20으로 지정하였다. 머신러닝이 진행될수록 loss(손실 함수)도 줄어드는 것을 볼 수 있었다. 

 

 

<설명>

import matplotlib.pyplot as plt
import numpy as np
import sklearn

from sklearn import datasets
from sklearn.datasets import load_diabetes

from keras import optimizers
from keras.layers import Dense, Activation
from keras.models import Sequential

<import한 라이브러리 목록>

Sklearn(Scikit-learn, 사이킷런) : Python 프로그래밍 언어를 위한 무료 소프트웨어 기계 학습 라이브러리
NumPy : 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리
Matplotlib : 파이썬에서 매트랩과 유사한 그래프 표시를 가능케 하는 라이브러리
Keras : 파이썬으로 작성된 오픈 소스 신경망 라이브러리

 

 

#442 명의 당뇨병 환자 각각에 대해 10 개의 기준 변수, 연령, 성별, 체질량 지수, 평균 혈압 및 6 개의 혈청 측정 값
diabetse=load_diabetes()
print(diabetse.keys())
print(diabetse.feature_names)
aa=diabetse.data # 442x10 행렬의 데이터 (행은 환자번호, 열은 기준 변수)
bb=diabetse.target # 1년 후 질병 진행에 대한 실제 정량적 측정

nr,nc=aa.shape # 442,10

keys() 함수는 해당 사전형 데이터에 저장된 key 값들을 리스트의 형태로 반환합니다.
feature_names라는 key값에는 age, sex, bmi, bp, s 등등의 10가지의 기준 변수가 있다.

 

nov=400 # 학습할 데이터
x_train=aa[:nov,:] # 입력데이터
y_train=bb[:nov] # 라벨 값

nov변수는 총 442명의 환자데이터 중 400명의 데이터를 학습시키기 위한 변수이다.

 

model=Sequential() # Seqeuntial 모델 오브젝트를 model이라는 변수안에 넣고 모델 구성
model.add(Dense(8,input_dim=nc,activation='relu')) # 출력 뉴런(노드), 입력 뉴런(노드), 활성화 함수
model.add(Dense(4,activation='relu'))
model.add(Dense(2,activation='relu'))
model.add(Dense(1)) # 마지막 레이어의 노드갯수는 출력 데이터 갯수와 동일하게 1로 지정
# relu는 은닉층, Dense 레이어는 입력과 출력을 모두 연결해주며 입력과 출력을 각각 연결해주는 가중치를 포함한다.

model.compile(loss='mse',optimizer='adam') #모델 컴파일
# loss는 입력데이터가 출력데이터와 일치하는지 평가해주는 손실함수 (평균제곱오차mse(mean squared error)를 사용)
# optimizer는 손실함수를 기반으로 네트워크가 어떻게 업데이트 될지 결정 (adam 사용)
model.summary() #모델의 구조를 요약해 출력

모델의 입력 뉴런(노드)은 10(기준 변수의 개수)을, 출력 뉴런(노드)은 8,4,2,1을 지정하였다.

activation(활성화 함수) 목록

  • ‘linear’ : 디폴트 값, 입력뉴런과 가중치로 계산된 결괏값이 그대로 출력으로 나옵니다.
  • ‘relu’ : rectifier 함수, 은익층에 주로 쓰입니다.
  • ‘sigmoid’ : 시그모이드 함수, 이진 분류 문제에서 출력층에 주로 쓰입니다.
  • ‘softmax’ : 소프트맥스 함수, 다중 클래스 분류 문제에서 출력층에 주로 쓰입니다.

모델 컴파일시 손실 함수로 mse(mean squared error, 평균 제곱 오차)를 사용하고 optimizer로는 adam을 사용하였다.



model.summary() 함수로 출력된 모델 요약 

 

모델 레이어의 모습 (input_dim=10(기준변수 갯수))

www.draw.io/

노드 그래프 그릴때 사용한 사이트!

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software diagrams.net (formerly draw.io) is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPM

app.diagrams.net

 

 

H=model.fit(x_train,y_train,batch_size=20,epochs=500) # 컴파일 한 모델을 학습
# epochs는 학습 반복횟수
# batch_size는 몇개의 샘플로 가중치를 갱신할 것인지 지정
# x_train,y_train,batch_size=20,epochs=500 뜻은 쉽게말하면 
# 문제집(nov개의 문항)을 500회(epochs) 반복해서 푸는데 
# 20문항(batch_size)을 풀때마다 해답을 맞추는 것을 뜻한다.

Keras에서는 모델 학습을 위해 fit을 사용한다. 에포크(epochs)와 배치 사이즈(batch_size)는 각각 학습 반복 횟수와 가중치를 갱신할 샘플의 수를 뜻하며 500과 20으로 지정하였다. 쉽게 풀이하자면 nov개의 문항이 있는 문제집을  500회(epochs) 반복해서 푸는데, 20문항(batch_size)마다 풀고 해답을 맞추는 것을 뜻한다.

 

plt.figure()
plt.title('loss')
plt.plot(H.history['loss']) # 손실함수 플롯

y_predict=model.predict(aa[:,:]) # 예측값
plt.figure()
plt.title('disease progression one year after baseline')
plt.plot(bb[:],'g',label='real') # 실제 값
plt.plot(y_predict,'r',label='predict') # 예측 값
plt.legend()
plt.show()

손실함수 그래프와 실제 데이터, 예측 데이터를 비교한 그래프를 출력한다.

 

 

 

 

파이썬으로 진행되는 수학프로그래밍실습 강의는 수학과에서 열리는 과목이다. 빅데이터, 머신러닝, 딥러닝, 통계 등등이 hot한 요즘, 이 강의를 듣기 전 까지는  머신러닝이란게 어렵게 느껴졌었는데 이렇게 데이터만 있으면 파이썬을 통해 분석과 예측을 쉽게 할 수 있다는 것에 좀 놀랐고 생각이 깊어졌다. 뭔가 데이터를 예측하고 분석한다는 것에 흥미가 생기는 계기가 된 것 같다.

 

 

 

 

반응형

+ Recent posts