Notice
Recent Posts
Link
아무것도 모르는 공대생의 지식 탐험기
모두의 딥러닝 9일차 (ch.11) 본문
데이터 다루기
1. 데이터 분석과 전처리
데이터의 중요성
머신러닝과 딥러닝 모델이 좋은 성능을 내기 위해서는 충분한 양의 데이터뿐만 아니라, 대표성(representative)이 있는 균형 잡힌 데이터가 필요하다. 특히, 데이터 편향성(bias) 문제를 해결하지 않으면 모델이 한쪽 데이터에 치우쳐 학습될 가능성이 크다.
예를 들어, 전체 데이터셋에서 당뇨병 환자의 비율이 매우 낮다면 모델이 대부분을 "비당뇨"라고 예측해도 정확도가 높아 보일 수 있다. 그러나 이런 모델은 실제로 중요한 당뇨병 환자를 제대로 식별하지 못하는 심각한 문제를 초래할 수 있다.
데이터의 편향성 해결 방법
- 언더샘플링(Under-sampling): 건강한 사람의 데이터를 일부 제거하여 균형을 맞춤
- 오버샘플링(Over-sampling): 당뇨병 환자의 데이터를 증강하여 개수를 늘림
- SMOTE(Synthetic Minority Over-sampling Technique): 기존 데이터를 기반으로 새로운 데이터를 생성
2. 피마 인디언 당뇨병 데이터셋
피마 인디언 부족의 건강 데이터는 당뇨병 예측 연구에서 널리 사용되는 대표적인 데이터셋이다. 과거에는 비만 환자가 거의 없었지만, 서구식 식습관이 도입된 후 비만과 당뇨병 발생률이 급격히 증가했다.
데이터 개요
- 총 데이터 개수: 768명
- 특성(feature) 개수: 8개
- 클래스(class) 개수: 1개 (당뇨병 유무)
속성명설명단위
Pregnancies | 과거 임신 횟수 | 회 |
Plasma glucose | 포도당 부하 검사 2시간 후 공복 혈당 농도 | mg/dL |
Blood Pressure | 확장기 혈압 | mmHg |
Skin Thickness | 삼두근 피부 주름 두께 | mm |
Insulin | 혈청 인슐린 (2시간 후) | mu U/ml |
BMI | 체질량 지수 (몸무게 / 키²) | kg/m² |
Diabetes Pedigree | 당뇨병 가족력 지수 | - |
Age | 나이 | 세 |
Class (Target) | 당뇨병 여부 (0: 비당뇨, 1: 당뇨) | - |
3. 데이터 전처리
데이터를 분석하고 처리하는 과정은 딥러닝 모델의 성능에 중요한 영향을 미친다.
3.1 결측값 처리 (Missing Value Handling)
describe() 함수를 실행한 결과, Plasma(공복 혈당), Blood Pressure(혈압), BMI 등의 최솟값이 0으로 나타났다. 이는 실제 0이 아니라 측정되지 않은 결측값일 가능성이 크다.
해결 방법
- 삭제(Drop): 결측값이 포함된 행을 제거
- 평균값 대체(Mean Imputation): 전체 데이터의 평균값으로 채워 넣음
- 중앙값 대체(Median Imputation): 데이터의 분포가 비대칭일 경우, 중앙값으로 채움
- 회귀 모델을 활용한 대체(Predictive Imputation): 결측값을 예측하여 채움
# BMI, Blood Pressure, Insulin의 0을 중앙값으로 대체
import numpy as np
df['BMI'].replace(0, df['BMI'].median(), inplace=True)
df['Blood Pressure'].replace(0, df['Blood Pressure'].median(), inplace=True)
df['Insulin'].replace(0, df['Insulin'].median(), inplace=True)
3.2 데이터 시각화 및 상관관계 분석
데이터의 특성을 파악하기 위해 **히트맵(heatmap)**을 활용한다.
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12,12))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', linewidths=0.1)
plt.show()
주의: 상관관계가 높다고 해서 반드시 인과관계를 의미하는 것은 아니다.
4. 딥러닝 모델 학습
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 모델 생성
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 모델 학습
model.fit(X, Y, epochs=200, batch_size=10)
5. 모델 평가 방법 개선
기존에는 정확도(Accuracy)만을 평가 지표로 사용했지만, 이는 데이터 불균형이 있는 경우 적절한 평가 방식이 아니다.
5.1 정밀도(Precision) & 재현율(Recall) 추가
from sklearn.metrics import classification_report
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5).astype(int)
print(classification_report(y_test, y_pred))
5.2 Confusion Matrix 분석
from sklearn.metrics import confusion_matrix
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt="d", cmap="Blues")
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.show()
6. 결론
- 데이터의 편향성을 고려하여 샘플링 기법(SMOTE, 언더샘플링 등)을 적용할 수 있다.
- 단순한 정확도(Accuracy)만이 아니라, 정밀도(Precision) & 재현율(Recall), F1-score를 함께 고려해야 한다.
- Confusion Matrix를 활용하여 오진(False Positive)과 미탐지(False Negative)를 최소화해야 한다.
- 딥러닝 모델을 평가할 때는 다양한 지표를 활용하여 모델의 신뢰성과 실용성을 극대화하는 것이 중요하다.