관리 메뉴

DeseoDeSeo

[Deep Learning] ex01_유방암데이터분류( 이진분류 ) 본문

Deep Learning

[Deep Learning] ex01_유방암데이터분류( 이진분류 )

deseodeseo 2023. 9. 19. 21:49

목표

  • 환자 데이터를 바탕으로 유방암인지 아닌지를 구분해보자
  • 딥러닝으로 이진분류 실습을 진행하자.
라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer # 사이킷런 내장 유방암데이터

 

데이터 불러오기
breast_data =load_breast_cancer()
breast_data

○  머신러닝 데이터 구조 : 번치객체( 딕셔너리 형태 )

 

breast_data.keys()
# data: 문제 데이터, 입력특성
# target: 정답데이터
# target_names: 정답데이터의 이름

breast_data.target_names
# 0 ➜ 'malignant(악성)'
# 1 ➜ 'benign'(양성)
#class의 개수는 2개 ➜ 이진 분류 !

문제, 정답 분리
# 문제 데이터는 x, 정답 데이터는 y
X = breast_data['data']
y = breast_data['target']
 train, test로 분리
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=919)

< 모델링 과정 >

1. 신경망 구조 설계( 뼈대, 입력층, 중간층, 출력층 )

2. 신경망 모델 학습/평가 방법 설정 (회귀, 분류)

3. 모델 학습

4. 모델 예측 및 평가

 

from tensorflow.keras.models import Sequential # 뼈대
from tensorflow.keras.layers import InputLayer, Dense
# 1. 신경망 구조 설계( 뼈대, 입력층, 중간층, 출력층 )
# 뼈대
model = Sequential()
# 입력층
model.add(InputLayer(input_shape=(30,))) # 입력층( 입력 특성의 개수를 정확하게 작성해야함.)
# 중간층(은닉층)
model.add(Dense(units=16, activation='sigmoid'))
model.add(Dense(units=8, activation='sigmoid'))
# 출력층 (출력받고 싶은 데이터 형태를 지정하는 곳임.) , 이진분류 1개의 확률값으로 결과값으로 받고 싶음.
model.add(Dense(units=1,activation='sigmoid'))
# sigmoid의 역할은 중간층에서는 역치의 역할? 출력층에서는 이진분류 1개의 확률값으로 결과값으로 변환시켜줌.
# sigmoid함수는 0에서 1사이의 함수이며, 값이 들어오면 0~1사이의 값을 반환함..
# sigmoid : S자형 곡선을 가지는 함수로 0~1사이의 값을 반환 !
# 선형모델의 결과값: 연속형 값 !

 활성화함수는 중간층, 출력층에서 사용됨,

중간층 : 역치 역활( 활성화, 비활성화할지?)

step function ➜ sigmoid사용.(왜? 최적화 알고리즘 경사하강법을 적용하기 위해서 기울기와 역치 개념을 가지는 sigmoid를 사용하기 위해서)

출력층 : 최종결과의 데이터 형태를 결정

(내가 출력하고자 하는 형태에 따라 다르게 작성, units/activation)

 

2.모델학습 및 평가방법 결정
model.compile(loss='binary_crossentropy',  # 오차: 이진분류➜ binary_crossentropy
              optimizer='SGD', # 최적화 알고리즘(확률적 경사하강법)
              metrics=['accuracy']) # metrics : 평가방법( 분류: 정확도)
3.모델 학습 및 시각화
h1=model.fit(X_train, y_train,validation_split=0.2, epochs=100)

시각화
plt.figure(figsize=(15,5))
plt.plot(h1.history['loss'],label='train_loss')
plt.plot(h1.history['val_loss'], label='val_loss')
plt.legend()
plt.show()

모델에 대한 전체적인 내부 구조 확인
model.summary()