딥러닝

[딥러닝] 유방암 데이터분류(keras)

퓨어맨 2022. 7. 18. 11:43
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 학습용 유방암 데이터 로드
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()

data.keys()
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

 

X = data['data']
y = data['target']

X.shape, y.shape
((569, 30), (569,))

 

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)

print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
(455, 30)
(455,)
(114, 30)
(114,)

 

 

# 신경망 구조 설계
model1 = Sequential()

# input_dim : 입력되는 데이터의 특성 개수를 설정
# activation : 활성화 함수를 설정(들어온 자극(데이터)에 대한 응답여부(예측결과)를 결정하는 함수)
# 입력층(input_dim) + 중간 1개층(Dense)
model1.add(Dense(100, input_dim=30, activation='relu'))

# 중간층
model1.add(Dense(50, activation='relu'))
model1.add(Dense(20, activation='relu'))
model1.add(Dense(10, activation='relu'))

# 출력층
model1.add(Dense(1, activation='sigmoid'))

model1.summary()
Model: "sequential_7"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_32 (Dense)            (None, 100)               3100      
                                                                 
 dense_33 (Dense)            (None, 50)                5050      
                                                                 
 dense_34 (Dense)            (None, 20)                1020      
                                                                 
 dense_35 (Dense)            (None, 10)                210       
                                                                 
 dense_36 (Dense)            (None, 1)                 11        
                                                                 
=================================================================
Total params: 9,391
Trainable params: 9,391
Non-trainable params: 0
_________________________________________________________________

 

# 학습 및 평가방법 설정
# binary_crossentropy : 2진분류에 사용하는 손실함수
#  -> 오차의 평균을 구하는 것은 mse와 같지만 0~1사이의 값으로 반환한 후에 평균오차를 구함(그래야 0또는1로 분류하기 편하니까!)
model.compile(loss='binary_crossentropy',
              optimizer='Adam',   # 최적화함수 : 최근에 가장 많이 사용되는 일반적으로 성능이 좋은 최적화함수
              metrics=['acc']    # metrics : 평가방법을 설정(분류문제이기 때문에 정확도를 넣어줌)
              )
              
# 학습
h = model.fit(X_train, y_train, epochs=100)

plt.figure(figsize=(15,5))

plt.plot(h.history['acc'], label='acc')

plt.legend()
plt.show

 

model.evaluate(X_test, y_test)
4/4 [==============================] - 0s 4ms/step - loss: 0.5825 - acc: 0.5965
[0.5825210809707642, 0.5964912176132202]