본문 바로가기
IT & 데이터 사이언스/데이터 분석 실습

[DACON] 심장질환예측 경진대회(Basic)(2)

by 바른 호랑이 2021. 12. 18.
728x90
반응형

※ DACON 링크 

 

심장 질환 예측 경진대회 - DACON

좋아요는 1분 내에 한 번만 클릭 할 수 있습니다.

dacon.io

※ 이전 분석내용

 

[DACON] 심장질환예측 경진대회(Basic)(1)

※ DACON 링크 : https://dacon.io/competitions/official/235848/overview/description 심장 질환 예측 경진대회 - DACON 좋아요는 1분 내에 한 번만 클릭 할 수 있습니다. dacon.io ※ 변수 분석시 참고한 사이..

data-is-power.tistory.com

 

탐색적으로 예측결과를 확인해보기 위해 간단한 변수처리만 했던 것을 이어서 분석을 진행해보았다. 추가적인 전처리는 따로 하지 않았고, 분석모델만 추가적으로 사용해보았다. 가장먼저 써본 모델은 나이브 베이즈 다항분포 모델을 사용해보았는데, 모델에 대한 설명을 아주 간단하게 하자면, 조건부확률과 베이즈 확률을 이용하여 분석을 하는 모델이라고 생각하면 되겠다. 나이브 베이즈 다항분포 모델은 변수에 음수가 들어가면 작동이 안되서 기존에 사용한 Standard Scaler대신에 0과 1사이의 값으로 변수를 스케일링 해주는 MinMax Scaler를 사용하여 따로 변수처리를 해주었다. 분석코드와 결과는 아래와 같다.

 

# 나이브베이즈드(다항분포) 로드 및 테스트 
# 인풋값이 음수면 작동을 안해서 스케일러를 MinMaxScaler로 변환해서 모델 작성
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import joblib
model = MultinomialNB()
model.fit(df_train[x_list], list(df_train.target))

 

예측결과 정확도가 기존에 사용했던 KNN과 의사결정나무보다 낮게 나와서 해당 모델은 추후 분석간 우선순위를 낮춰서 하기로 결정내렸고, 이어서 로지스틱 회귀모델을 이용해서 예측결과를 확인해보기로 하였다. 분석코드와 결과는 아래와 같다.

 

# 로지스틱 회귀분석 테스트
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(df_train[x_list], df_train.target)

 

예측결과가 90%에 달하는 수준으로 나온 것으로 확인할 수 있었으며, 이후 추가 변수처리 및 분석시에 해당모델의 우선순위를 높게두고 진행해보기로 결정하였다. 마지막으로 신경망을 활용한 딥러닝 분류모델도 사용해보기로 결정했는데, 데이터의 수가 너무 적다는 문제가 있어서 일단은 과적합되는 부분은 배제하고 정확도를 확인하기로 했고, 기존의 데이터 151개를 계속 이어 붙여서 1057개의 데이터로 만든 후 분석을 진행하였다. 그 후 데이터를 8:2 비율로 분할하여 훈련 및 검증에 사용하였고, 트레이닝 로스와 정확도의 기울기의 변화가 적어지는 부분에서 훈련을 중단하였다. 분석코드와 결과는 아래와 같다.

 

# 데이터 숫자가 부족하여 같은 데이터를 복사하여 데이터 증대 151개 -> 1057개
df_train_plus = pd.concat([df_train, df_train, df_train, df_train, df_train, df_train, df_train])

# 훈련 및 검증을 위한 데이터셋 분할 및 부여(8:2)로 분할
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df_train_plus[x_list], df_train_plus[['target']], \
                                   test_size = 0.2, stratify = df_train_plus.target, \
                                   random_state = 7)
                                                    
# 학습데이터로 사용하기 위해 pandas파일을 numpy파일로 변환
print(X_train.shape, X_train.to_numpy().shape, X_test.shape, X_test.to_numpy().shape)
X_train = X_train.to_numpy()
X_test = X_test.to_numpy()
y_train = y_train.target.to_numpy()
y_test = y_test.target.to_numpy()

# 신경망 분류모델 작성
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical

# quality가 범주형이므로 범주형으로 변환
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# 입력데이터의 형태를 반드시 입력해주어야 함
# 차원이 6개 -> input값 일치화
model = Sequential()
model.add(Dense(64, activation = 'relu', input_shape = (9, ))) 
# 6차원의 데이터를 입력으로 받고, 64개의 출력 가지는 첫번째 Dense층
model.add(Dense(32, activation = 'relu')) 
# 32개의 출력을 가지는 Dense층
model.add(Dense(16, activation = 'relu')) 
# 16개의 출력을 가지는 Dense층
model.add(Dense(8, activation = 'relu')) 
# 8개의 출력을 가지는 Dense층
model.add(Dense(2, activation = 'softmax')) 
# 9개의 출력을 가지는 신경망(마지막은 반드시 y의 변수 종류수와 일치시켜줄 것)

# 학습과정 설정하기
# 옵티마이저 : Adam, 손실함수 : categorical_crossentropy, 모니터링할 평가지표 : acc
model.compile(optimizer=tf.keras.optimizers.Adam(), loss = 'categorical_crossentropy', \
metrics=[tf.keras.metrics.CategoricalAccuracy()])
model.summary()
# 모델학습하기
history = model.fit(X_train, y_train, epochs = 1000, batch_size = 128, \
					validation_data = (X_test, y_test))

 

과적합을 시켰음에도 정확도가 다른 모델들과 비교해봤을 때도 준수한 수준인 것을 확인하였다.

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

세부코드가 궁금하신 분들은 아래 GitHub를 참고해주시기 바랍니다.

 

※ Github

 

GitHub - Jeong-Beom/TIL: 교육받은 내용을 기록하기 위한 레파지토리입니다.

교육받은 내용을 기록하기 위한 레파지토리입니다. Contribute to Jeong-Beom/TIL development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글