이번 포스팅은 파이썬의 라이브러리들을 사용하여 머신러닝을 통한 데이터를 예측해보는 것에 대한 내용이다. 사이킷런(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
<코드>
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을 사용하였다.
노드 그래프 그릴때 사용한 사이트!
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한 요즘, 이 강의를 듣기 전 까지는 머신러닝이란게 어렵게 느껴졌었는데 이렇게 데이터만 있으면 파이썬을 통해 분석과 예측을 쉽게 할 수 있다는 것에 좀 놀랐고 생각이 깊어졌다. 뭔가 데이터를 예측하고 분석한다는 것에 흥미가 생기는 계기가 된 것 같다.
'🐍PYTHON' 카테고리의 다른 글
[Python] 2차원 배열 선언하는 방법 (0) | 2021.01.19 |
---|---|
[PYTHON ] 파이썬 tkinter를 이용한 몽타주 조합 프로그램 (0) | 2020.11.11 |
[Python] 연결 리스트(Linked List) (2) | 2020.04.11 |
[PYTHON ] 파이썬 print함수 서식 (0) | 2020.03.04 |
[PYTHON] 파이썬 팩토리얼(Factorial)을 구하는 여러가지 방법 (0) | 2020.02.28 |