# 실행
# shift + enter : 현재 셀을 실행하고 아래로 커서 이동
# (아래 셀이 없다면 생성하고 이동)
# ctrl + enter : 현재 셀 실행
# 셀 생성
# 위에 셀 생성 : ctrl + m + a
# 밑에 셀 생성 : ctrl + m + b
# 마크다운 변환 : ctrl + m + m (m을 꾹 누르면 mm이라고 인식)
# 코드 모드로 되돌리기 : ctrl + m + y
# 셀 삭제 : ctrl + m + d
# 하나의 셀 안에 있는 동일 단어 한꺼번에 접근하기 : ctrl + shift + l(엘)
from google.colab import drive
drive.mount('/content/drive')
# 데이터를 연결하는 방법
# drive 연동해서 사용해야함
# 데이터 접근 machineLearning 폴더의 data > 파일 접근(상대 경로)
# 딥러닝 폴더 쪽으로 경로 이동 > 상대경로 값으로 활용
# /content/drive/MyDrive/Colab Notebooks/DeepLearning/data/student-mat.csv
%cd /content/drive/MyDrive/Colab Notebooks/DeepLearning
# 현재 커서 경로 확인
%pwd
### 목표
- 폐암환자의 생존을 예측하는 분류 모델을 만들어보자!(0:사망, 1:생존)
- 다층퍼셉트론(인공신경망)을 활용하여 이진분류 문제를 해결해보자
# 환경셋팅
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 훈련셋, 테스트셋 분리하는 도구 가져오기
from sklearn.model_selection import train_test_split
# 데이터 불러오기
# 컬럼명 안보고싶을 땐 : header = None (컬럼명은 보지 않고 인덱스 번호로 컬럼명에 출력)
data = pd.read_csv('data/ThoraricSurgery.csv', header=None)
# 위에서 다섯 개 행 출력
data.head()
# 0 ~ 16 컬럼 : 특성 데이터(종양 유형, 폐활량, 고통정도 ,기침정보 등 환자상태)
# 17번 컬럼 : 답 데이터(수술 후 생존 결과, 0 or 1)
# 클래스 2개 : 이진분류 binary classification
data.info()
# 문제와 답 분리
X = data.iloc[:, :17]
y = data.iloc[:, 17]
# 크기확인
X.shape, y.shape
# 훈련 데이터셋과 테스트 데이터셋 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=5)
# 크기확인
X_train.shape, X_test.shape, y_train.shape, y_test.shape
### 인공 신경망 모델 생성
- tensorflow.keras 도구 활용
- 1. 신경망 구조 설계(뼈대 구축, 층 쌓기)
- 2. 학습/평가 방법 설정(compile)
- 3. 학습 및 시각화(fit)
- 4. 평가 + 예측값 확인(evaluate, predict)
# keras 필요한 도구 가져오기
# 뼈대 구축 도구
from tensorflow.keras import Sequential
# 층 쌓는 도구
from tensorflow.keras.layers import Dense # activation 매개변수 활용
# 뼈대 구축
model = Sequential()
# 입력층 (특성의 개수 연결 -> input_dim) + 중간층1 (퍼셉트론 개수 -> units: 34)
# Dense(퍼셉트론 개수, 입력크기, activation='sigmoid')
model.add(Dense(units=34, input_dim=17, activation='sigmoid'))
# 중간층 2개, 특성 전달 개수 설명 X
# 중간층 퍼셉트론 개수 16개, 중간층 퍼셉트론 개수 8개
model.add(Dense(units=16, activation='sigmoid'))
model.add(Dense(units=8, activation='sigmoid'))
# 출력층
# 회귀 vs 분류(이진, 다중)??
# 이진분류(클래스 2개 분류)
# 퍼셉트론 개수 : 1개, 활성화 함수 : 'sigmoid'
# sigmoid를 통해서 마지막 결과가 0 ~ 1사이의 확률 정보로 출력되게 하기 위해서
# 0.5라는 기준값보다 크면 1, 아니면 0 클래스이다 정리(분류)
model.add(Dense(units=1, activation='sigmoid'))
# 모델 정보 요약
model.summary()
# 2. 이진분류 학습 / 평가방법 설정
# 회귀 오차 계산 공식 - 'mse'
# 이진 분류 오차 계산 공식(loss) - 'binary_crossentropy'
# 경사하강법을 통해 w, b를 갱신(찾는 것)(optimizer) - 'sgd' : 확률적 경사 하강법
# 평가지표설정(metrics) - ['accuracy']
model.compile(loss='binary_crossentropy',
optimizer='sgd',
metrics=['accuracy']) # 정확도 지표 연결
# 3. 모델 학습
# fit(훈련문제, 훈련답, 반복횟수 epochs=100)
h = model.fit(X_train, y_train, epochs=100)
h.history.keys()
h.history['accuracy'] # acc를 담은 list
# 선그래프 정확도 시각화
# 학습 현황 접근 h.history['accuracy']
plt.figure(figsize=(10,3))
plt.plot(range(1, 101), h.history['accuracy'])
# 4. 모델 평가
# 테스트용 데이터셋
# X_test, y_test - 이진분류(답 데이터 전처리 X)
# 모델.evaluate(X_test, y_test)
model.evaluate(X_test, y_test)[1]
# [loss, accuracy]
# 예측
# 모델.predict(X_test)
pre = model.predict(X_test)
pre
# 0~1 출력 => sigmoid 출력한 값(활성화, activation)
# 0.5보다 크면 1,
# 0.5보다 작으면 0 으로 class를 이해하자
# X_test 예측을 모두 0 class로 예측 => 0: X_test모두가 사망 예측
# 혼동 행렬표 - 머신러닝에서 나오는 개념
pre2 = pre > 0.5
pre2
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, pre2)
cm # 배열 -> 인덱스 이름, 컬럼명 X
# 데이터 프레임 변환
cm_df = pd.DataFrame(cm, index=['실제0', '실제1'], columns=['예측0', '예측1'])
cm_df
댓글