KNOU STUDYREAD

한국방송통신대학교 통계데이터과학과 블로그

CS & Department of Statistics and Data Science

통계데이터과학과 및 컴퓨터과학 독서

07. 딥러닝 10-12장

Harryㅤ 2023. 12. 4.

 

2강 - 폐암 환자 수술 생존율 예측 딥러닝 모델 설계하기

model = Sequential() # 딥러닝 구조 설계
model.compile()  # 컴파일. 
model.fit()      # 모델 수행
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense      
import numpy as np

!git clone https://github.com/taehojo/data.git

Data_set = np.loadtxt("./data/ThoraricSurgery3.csv", delimiter=",")
X = Data_set[:,0:16]                                           
y = Data_set[:,16]    

model = Sequential()                                                 
model.add(Dense(30, input_dim=16, activation='relu')) 
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])  
history=model.fit(X, y, epochs=5, batch_size=16)


딥러닝의 층 구조 : 입력층, 은닉층, 출력층

model = Sequential()

케라스에서는 Sequential() 함수를 통해 설계한다. 이때 여러개의 층을 추가할 경우

model.add(Dense(30, input_dim=16, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.add() 함수를 이용하며. Dense(첫 번째 인자, 두 번째 인자)에서 30은 은닉층의 노드 생성개수이며 input_dim은 입력 데이터에서 가져오는 데이터의 개수를 저장하기 위한 임시적 변수이름이므로 16개의 입력데이터를 받아 은닉층 노드 30개에 이를 전달하는 것을 의미한다.

두 번째로 add() 된 모델은 출력층. 즉, 활성화 함수로 시그모이드 함수를 설정.

model.compile(loss='binary_crossentropy', optimizer='adam', metrics= ['accuracy'])

model.compile() 부분에서는 실제 컴파일 부분이며 폐암 수술의 경우 생존/사망의 두가지 선택지 중 하나를 예측한다. 이때 사용하는 오차 함수는 교차 엔트로피 함수로 설정한다. 그리고 이를 바탕으로 손실함수의 가중치를 최적화하기 위한 옵션으로 'adam'을 설정하고 메트릭수 함수 부분에 테스트 세트에 대한 정확도를 기반해서 값을 출력하게 설정하는 부분이다.

history = model.fit(X, y, epochs=5, batch_size=16)

마지막으로 model.fit()은 실행부분이다. 에포크는 총 반복횟수이며 배치사이즈는 입력데이터를 inport input시 개 단위로 끊어 입력하는것을 의미한다.


from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

import pandas as pd                            # pandas 라이브러리 import

!git clone https://github.com/taehojo/data.git # 깃허브 데이터 import

df = pd.read_csv('./data/pima-indians-diabetes3.csv') # 피마 인디언 당뇨병 데이터 csv 파일 import

# iloc[] = 불러온 데이터 프레임으로부터 대괄호 안에 범위를 설정한 만큼 각각의 x,y로 저장
X = df.iloc[:,0:8]   # X = 세부 정보
y = df.iloc[:,8]     # y = 당뇨병 여부

# 모델설정, 각각의 다중 층 add() 함수로 생성. 출력층은 시그모이드 함수를 활성화 함수로 설정
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu', name='Dense_1'))
model.add(Dense(8, activation='relu', name='Dense_2'))
model.add(Dense(1, activation='sigmoid', name='Dense_3'))
model.summary()

# 컴파일. 교차엔트로피 손실함수로 설정하고 최적화는 아담 설정. 정확도만 출력
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 결과 출력. 100회까지 반복하며 배치 사이즈는 5개씩 끊어서 입력
history = model.fit(X, y, epochs=100, batch_size=5)


피마 인디언의 당뇨병 예측을 구현했고 100 세트씩 배치 사이즈를 5개씩 끊어 입력한 결과 76퍼센트의 정확도인 것을 확인할 수 있다.


# 아이리스 꽃 품종 예측


from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


!git clone https://github.com/taehojo/data.git


df = pd.read_csv('./data/iris3.csv')


X = df.iloc[:,0:4]
y = df.iloc[:,4]


y = pd.get_dummies(y)

# 모델설정, 각각의 다중 층 add() 함수로 생성. 출력층에서의 활성화 함수는 소프트맥스를 사용
model = Sequential()
model.add(Dense(12, input_dim=4, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.summary()


model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 컴파일. 다항 분류문제의 최적화 손실함수 설정, 최적화 아담 설정

history = model.fit(X, y, epochs=50, batch_size=5) # 결과 출력. 50회 반복, 배치 사이즈는 5개씩 끊어서 입력

아이리스 붓꽃의 품종을 분석한 결과 정확도가 96퍼센트이임을 알 수 있다. 
다만 아이리스 붓꽃의 예시처럼 여러개의 선택지 중에 하나만의 정답을 찾는경우(특정 품종 선별) 다항 분류를 적용하는데 이때 사용되는 손실함수는 앞서 피마 인디언 사례와 다르게 binary_crossentropy가 아닌 categorical_crossentropy를 사용한다.
 
 

'통계데이터과학과 및 컴퓨터과학 독서' 카테고리의 다른 글

09. 딥러닝 16-18장  (1) 2023.12.18
08. 딥러닝 13-15장  (1) 2023.12.11
06. 딥러닝 7-9장  (0) 2023.11.27
05. 딥러닝 6장  (0) 2023.11.20
04. 딥러닝 5장  (0) 2023.11.13