파이썬/딥러닝

[딥러닝][광주인공지능학원] 딥러닝 실습 - 와인 데이터 & 폐암환자 데이터

취준생코린이 2021. 8. 1. 23:52
728x90

사용할 라이브러리

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn import datasets
from tensorflow.keras.utils import plot_model # 모델 시각화

와인데이터 분류 실습

 

wine데이터 셋 가져오기

wine = datasets.load_wine()

와인데이터는 딕셔너리 형태의 데이터이기 때문에 키값을 확인

wine

 

위의 키값들중 분석에 사용할 데이터를 보겠습니다.

wine['data']

wine['feature_names']

 

wine['data']는 데이터프레임에 값

wine['feature_names']는 데이터프레임의 컬럼

으로 설정하여  X 데이터를 만들어요

X = pd.DataFrame(wine['data'], columns = wine['feature_names'])
X.shape

wine['target']

wine['target_names']

정답 데이터 만들기

y = wine['target']
y

 y를 카테고리화 시킴

y = pd.get_dummies(y)
y

모델 설계

# 모델 설계
model = Sequential()

# 입력층
# input_dim = 입력 데이터의 특성 개수
# activation = 활성 함수 Relu 사용
model.add(Dense(30,input_dim = 13, activation = 'relu'))
# 은닉층
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(4, activation='relu'))

# 출력층
# y를 get_dummies로 컬럼 3개로 나눠서 출력층도 노드를 3개로 해줘야된다.
model.add(Dense(3, activation = 'sigmoid'))

# 설계한 신경망의 구조를 확인
# 출력되는 파라미터수: 입력층 *출력층 + 출력층의 수
model.summary()

모델 컴파일

  • 모델 학습전 compile메소드를 통해서 학습방식에 대한 환경설정
  • loss: 손실함수
    • 회귀분석 : MSE 또는 mean_squared_error
    • 분류에서 정확도를 사용하지않는 이유: 가중치를 업데이트하는 과정에서 미분값을 활용 정확도를 사용할때는 미분을 하게 되면 값이 사라짐 -> 갱신이 안됨
    • 이진분류: binary_crossentropy
    • 다진분류: categorical_crossentropy
    • 원핫인코딩이 안된 다진 분류: spare_categorical_crossentropy
  • optimizer : 경사하강법 종류
    • adam(보통 이걸 가장많이 사용)
    • rmsprop(SGD을 보안)
  • metrics: 평가방법
    • 회귀분석일때:디폴트로 loss로 설정
    • 분류분석일때: accuracy
model.compile(loss= 'categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

 

모델 학습

  • 문제, 정답, 반복할 횟수, 한번에 확인할 데이터 수
  • 여기서 X, y, epochs는 필수로 적어야 됩니다.
model.fit(X, y, epochs = 500, batch_size=10)

 

평가

  • loss, accuracy
  • model.evaluate(X,y)
  • loss, accuracy모두 반환
  • model.evaluate(X,y)[0] = loss
  • model.evaluate(X,y)[1] = accuracy

 

추가로 모델 설계부분을 plot으로 그려서 출력하거나 저장할수있어요.

plot.model을 사용하면 됩니다. 이러면 실습파일과 같은 위치에 png파일로 이미지가 저장됩니다.

plot_model(model, to_file='model.png')
plot_model(model, to_file='model_shapes.png', show_shapes=True)

 


폐암환자 데이터 분류 실습

  • 이진 분류
  • 470개 데이터로 구성
  • 17개의 특성 데이터와 1개의 라벨 데이터
  • 라벨 데이터중 0은 사망 1은 생존
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.keras import Sequential # 딥러닝 모델 생성, 딥러닝 모델의 뼈대
from tensorflow.keras.layers import Dense # 층을 쌓음

df = pd.read_csv("ThoraricSurgery.csv", header = None)
df.head()

X = df.iloc[:, :-1]
y = df.iloc[:,-1]
X.shape, y.shape

 

파라미터 초기화를 위한 랜점 seed설정(동일한 값으로 파라미터값이 설정)

import numpy as np
import tensorflow as tf
seed = 100
np.random.seed(seed)
tf.random.set_seed(seed)

 

훈련데이터 테스트 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3)

 

신경망 설계

model = Sequential()

# 입력층
model.add(Dense(30, input_dim = 17, activation = "sigmoid"))

# 중간층(은닉층)
model.add(Dense(20, activation = "sigmoid"))
model.add(Dense(15, activation = "sigmoid"))
model.add(Dense(7, activation = "sigmoid"))
model.add(Dense(3, activation = "sigmoid"))

# 출력층
model.add(Dense(1, activation = "sigmoid"))

# 모델 확인
model.summary()

모델 학습 방법 설정

model.compile(loss = "binary_crossentropy", metrics = ["accuracy"], optimizer="Adam")

 

모델 학습

  • 머신러닝에서는 학습과 검증이 따로
  • 딥러닝에서는 한번에 가능
  • fit함수 속성으로 validation_data 사용하면 된다.
model.fit(X_train,y_train, epochs=300, validation_data=[X_test, y_test])

 

모델 평가

model.evaluate(X_test,y_test)

 

이번에는 폐암환자 분류를 데이터를 원핫인코딩하여 딥러닝 돌려봅니다.

y_train_one_hot = pd.get_dummies(y_train)
y_test_one_hot = pd.get_dummies(y_test)

y_train_one_hot

 

여기서는 신경망을 설계할때 출력층은 출력수를 2로 설정합니다.

이유는 정답 데이터인 y데이터가 원핫인코딩으로 인하여 컬럼이 2개가 되었기 때문입니다.

model2 = Sequential()

# 입력층
model2.add(Dense(34, input_dim = 17, activation = "relu"))

# 중간층(은닉층)
model2.add(Dense(20, activation = "softmax"))
model2.add(Dense(15, activation = "softmax"))
model2.add(Dense(7, activation = "softmax"))
model2.add(Dense(3, activation = "softmax"))

# 출력층
model2.add(Dense(2, activation = "softmax"))

# 모델 확인
model2.summary()

model2.compile(loss = "categorical_crossentropy", metrics = ["accuracy"], optimizer="Adam")

모델 학습

model2.fit(X_train,y_train_one_hot, epochs=300, validation_data=[X_test, y_test_one_hot])

 

모델 평가
오차[0], 정확도[1]

model2.evaluate(X_test,y_test_one_hot)

 

활성화 함수 비교

sigmoid를 사용할때

  • 결과값이 1개일때 사용
  • compile에서 loss를 binary_crossentropy를 사용

softmax를 사용할때

  • 결과값이 1개 이상일때(원핫인코딩) 사용
  • compile에서 loss를 categorical_crossentropy를 사용

 

 

스마트인재개발원에서 진행된 수업내용입니다.

https://www.smhrd.or.kr/

728x90