폐암 데이터 이진 분류

2024. 6. 26. 12:42Deep Learning

 

✅ 활성화 함수 종류

 

✅ 활성화 함수

-> 사람의 신경망에서 역치(문턱값)를 구현하기 위해 도입된 함수

 

📌 기본적인 뉴런의 구조는 선형 회귀

  • 활성화 함수를 거치지 않은 뉴런에서 나오는 값은 연속된 실수 값

 

📌 계단함수 - 시그모이드 함수 비교

  • 어제 술을 마신 사람이 등원을 한다 / 안한다를 판단하는 모델
  • 1. 계단함수 -> 안나간다
    • 나간다
    • 안나간다
    • 나간다
    • 안나간다
    • 안나간다
  • 2. 시그모이드 함수
    • (나감 : 안나감)
    • 술이랑 상관 없다 나가야지 0.9 0.1 나감
    • 술 마셔서 힘들지만 나가자 0.7 0.3 나감
    • 컨디션 난조 무서운데... 0.4 0.6 안나감
    • 공부보다 건강이 우선! 0.3 0.7 안나감
    • 아 귀찮아! 땡땡이 0.3 0.7 안나감
    • -- 확률 정보의 총합 -- 2.6 2.4 -> 나왔다

 

✅ 목표 설정

  • 폐암 데이터를 활용해서 이진 분류 신경망 구현
  • 이진 분류 개념을 이해한다.
# 드라이브 마운트

from google.colab import drive

drive.mount('/content/drive')

%cd /content/drive/MyDrive/Colab Notebooks/Deep Learning

!ls

# 필요한 라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 불러오기

data = pd.read_csv('data/ThoraricSurgery.csv', header=None)
data
# 현재 데이터는 컬럼명이 별도로 존재하지 않는다.
# 이 상태로 데이터를 불러오면 첫번째 행이 컬럼 명으로 불러와진다.
# header 옵션을 사용해서 새로 불러와보자
# header : 데이터를 불러오면서 컬럼명을 설정해주는 키워드
# (None)으로 설정한 경우 : 인덱스 번호가 컬럼명으로 출력된다.
# 데이터 정보 : 0 ~ 16 컬럼 -> 속성(특성) : 종양 유형, 폐활량, 고통정도 등등
# 17번 컬럼 : 정답 클래스(수술 후 생존 결과) - 0(사망) / 1(생존)

data.info() # 결측치 없다. 정수 / 실수

 

✅ 데이터 분리

  1. 문제 데이터 / 정답 데이터 분리
  2. 훈련 데이터와 평가 데이터 분리
# 1. 문제 데이터와 정답 데이터로 분리 (iloc)

X = data.iloc[:, :-1]
y = data[17]
# 데이터 체크(shape)

X.shape, y.shape

# 훈련 셋과 평가 셋으로 분리(30%, 30)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=30)
# 데이터 체크(shape)

X_train.shape, X_test.shape, y_train.shape, y_test.shape

 

✅ 신경망 구축

  1. 신경망 구조 설계
  2. 학습 / 평가 방법 설정
  3. 학습 + 시각화
  4. 모델 평가
# 재료 import
# 뼈대 구성 재료

from tensorflow.keras.models import Sequential

# 층 구성 재료 - Dense

from tensorflow.keras.layers import Dense
# 모델 구축 시작
# 뼈대 설정
model = Sequential()

# 입력층 설정
# 뉴런의 갯수 = 10 / 데이터 입력 특성 갯수 = ?(체크 잘할 것) / 시그모이드 함수

model.add(Dense(10, input_dim=17, activation='sigmoid'))

# 중간층 설정
# 뉴런의 갯수 = 6 / 시그모이드 함수

model.add(Dense(6, activation='sigmoid'))

# 뉴런의 갯수 = 4 / 시그모이드 함수

model.add(Dense(4, activation='sigmoid'))

# 출력층 설정
# 뉴런의 갯수 = 1 / 시그모이드 함수

model.add(Dense(1, activation='sigmoid'))
# 현재 우리가 진행하는 분석 방법은 어떤 방법인가? -> 분류 -> 이진분류
# 출력층의 구조는 우리가 에측하는 분석 방법에 따라 구조가 달라진다.
# 이진 분류에서는 활성화 함수 sigmoid / 뉴런의 갯수 1
# 회귀 분석에서는 활성화 함수 생략 / 뉴런의 갯수 1

# 모델 요약

model.summary()

 

 

✅ 분석 방법에 따른 출력층 구조 및 손실함수 확인해보기

  • 📌 1. 회귀 분석
    • 출력층 뉴런의 갯수 : 1
    • 활성화 함수 : 생략 가능
    • 손실 함수 : mse(평균 제곱 오차)
  • 📌 2. 이진 분류
    • 출력층 뉴런의 갯수 : 1
    • 활성화 함수 : sigmoid
    • 손실함수 : binary_crossentropy
  • 📌 3. 다중 분류
    • 출력층의 뉴런의 갯수 : 클래스의 종류 갯수(원핫 인코딩한 정답 데이터의 컬럼 개수)
    • 활성화 함수 : softmax
    • 손실 함수 : categorical_crossentropy
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])

 

✅ activation(활성화 함수) : 자극에 대한 반응 여부를 결정

  • 회귀 : linear -> 신경망에서 도출된 수치값(결과값)을 그대로 예측값으로 사용
  • 분류 :
    • 딥러닝은 선형 모델 기반이다.
    • 도출된 수치값은 연속된 실수 -> 분류 예측 어려움
    • 이를 해결하기 위해 분류할 수 있는 형태로 변경(활성화 함수 도입)
    • 이진 분류 문제에서는 출력층에 활성화 함수를 sigmoid 함수로 사용한다. (0 / 1 분류, 0.5라는 기준 값을 가지고 높은지 낮은지 확률 정보를 바탕으로 최종 출력을 결정)
# 3. 모델 학습

h = model.fit(X_train, y_train, epochs=100)

# 모델 학습 시각화

plt.plot(range(1, 101), h.history['accuracy'])

plt.show()

# 모델 평가

model.evaluate(X_test, y_test)

# 모델 예측 
pre = model.predict(X_test)
pre

# y_test의 고유값과 갯수를 파악해보자

np.unique(y_test, return_counts=True)

# 혼동 행렬로 예측 결과를 표시해보자

pre = pre > 0.5

from sklearn.metrics import confusion_matrix, classification_report # classification_report : 분류 평가 보고서

cm = confusion_matrix(y_test, pre)
display(cm)

cm_df = pd.DataFrame(cm, index=['실제 0', '실제 1'], columns=['예측 0', '예측 1'])
cm_df

# 실제 사망인 것을 사망으로 예측 성공한 경우 : 121(tn)
# 실제 사망이 아닌 것을 사망으로 예측한 경우 : 20(fn)

 

 

✅ 문제 유형에 따른 활성화 함수, 손실 함수