

목표
- 환자 데이터를 바탕으로 유방암인지 아닌지 분류해내는 딥러닝 모델링 실습
- 이진분류 실습
- 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)

# 모델 생성을 위한 라이브러리 불러오기
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()
