DL [03] 이진분류 실습(유방암데이터)

totwo·2024년 9월 5일
post-thumbnail

지도학습

  • 회귀 : 연속형(숫자형태) -> 평가지표 (오차 -> MSE)
  • 분류 : 범주형(카테고리) -> 평가지표 (정확도 -> accuracy)
    • 이진분류 : 클래스의 개수가 2개
      • 1개의 확률값
    • 다중분류 : 클래스의 개수가 3개 이상
      - 클래스의 개수만큼 확률값을 보임

목표

  • 환자 데이터를 바탕으로 유방암인지 아닌지 분류해내는 딥러닝 모델링 실습
  • 이진분류 실습
  • sklearn에서 제공하는 load_breast_cancer 유방암 데이터를 활용해보자
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer # 사이킷런 내장 유방암 데이터
data = load_breast_cancer()
print(data)
# sklearn에서 제공하는 데이터 형태 -> 번치객체
# 활용방법은 딕셔너리와 동일
data.keys()

  • data : 문제데이터, 입력특성
  • target : 정답데이터
  • target_names : 정답데이터의 이름 ('malignant'=악성, 'benign'= 양성)
  • feature_names : 특성의 이름
  • DESCR : 데이터에 대한 설명
data['target_names']
# 'malignant' : 악성, 0
# 'benign' : 양성, 1

->입력특성이 30개

# 데이터 분리하기
# 1. 문제와 정답
X = data['data']
y = data['target']
# 2. train, test (random_state=93, test:25%)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=93)

모델링

  1. 신경망 모델 구조 설계
  • 입력층, 중간층, 출력층
  1. 신경망 모델 학습방법, 평가방법 설정
  • compile : 회귀, 이진분류, 다중분류인지에 따라 학습방법 평가방법을 다르게 설정
  1. 모델 학습
  2. 모델 예측 및 평가
# 모델 생성을 위한 라이브러리 불러오기 
from tensorflow.keras.models import Sequential # 뼈대 
from tensorflow.keras.layers import InputLayer, Dense
# 뼈대
model = Sequential()
# 입력층
model.add(InputLayer(shape=(30,))) # 입력특성 개수 정확하게!!!
# 중간층 (은닉층) -> 층을 여러층 쌓기
# 퍼셉트론 = 선형모델 + 활성화함수 (역치)
# 중간층에서 사용하는 sigmoid : 활성화 여부(역치)
model.add(Dense(units=8, activation='sigmoid'))
model.add(Dense(units=16, activation='sigmoid'))
model.add(Dense(units=8, activation='sigmoid'))
# 출력층
model.add(Dense(units=1, activation='sigmoid'))
# 이진분류 : 1개의 확률값 -> 0~1 사이의 값으로 출력
# 50%를 기준으로 이상이면 양성클래스, 미만이면 음성클래스
# 하나의 선형모델과 sigmoid를 합쳐서 사용
# 출력층에서의 sigmoid 함수 역할 : 출력 결과를 0~1 사이의 확률값으로 변환 출력
# 모델 학습 평가방법 설정
# loss(학습시 사용하는 오차), optimizer(최적화 함수), metrics(평가지표)
model.compile(loss="binary_crossentropy", # 이진분류
              optimizer="adam",
              metrics=["accuracy"]) # 평가지표 : 정확도 (분류)
# 모델 학습
model_history = model.fit(X_train,y_train,validation_split=0.2, epochs=100)
# 결과 시각화 
# 그래프 크기 조절
plt.figure(figsize=(12,4)) # 가로, 세로 
# plt.plot(x축,y축)
# loss, val_loss 값이 크게 차이가 없어야 과적합이 아니라 한다
plt.plot(range(1,101), model_history.history['loss'], label='train_loss')
plt.plot(range(1,101), model_history.history['val_loss'], label='val_loss')
plt.legend() # 범례표시
plt.show()

profile
Hello, World!

0개의 댓글