TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 머신 | 딥러닝 & AI>

[파이썬 머신러닝] 피마 인디언 당뇨병 예측

by 기록자_Recordian 2024. 6. 11.
728x90
반응형
시작에 앞서
해당 내용은 '<파이썬 머신러닝 완벽 가이드> 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

 피마 인디언 당뇨병 예측

 

◆ 피마 인디언 당뇨병(Pima Indian Diabetes) 데이터 세트를 이용해 당뇨병 여부를 판단하는 머신러닝 예측 모델을 수립하고 평가 지표 적용하기

 

고립된 유전적 특성 때문에 당뇨학회에서는 피마 인디언의 당뇨병 자료에 대해 많은 연구를 했다.


1. 캐글에서 데이터 세트 다운받기

하단 캐글 페이지에 접속하여 압축 파일을 다운로드

https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database

 

Pima Indians Diabetes Database

Predict the onset of diabetes based on diagnostic measures

www.kaggle.com

캐글에 로그인은 필수다

 

[피마 인디언 당뇨병 데이터 세트 피처 구성]

  • Pregnancies: 임신 횟수
  • Glucose: 포도당 부하 검사 수치
  • BloodPressure: 혈압(mm Hg)
  • SkinThickness: 팔 삼두근 뒤쪽의 피하지방 측정값(mm)
  • Insulin: 혈청 인슐린(mu U/ml)
  • BMI: 체질량지수(체중(kg)/키(cm)^2)
  • DiabetesPedigreeFunction: 당뇨 내력 가중치 값
  • Age: 나이
  • Outcome: 클래스 결정 값(0 또는 1)

2. 필요한 모듈 Import, 파일 로딩(csv를 DataFrame으로)

[각 모듈 별 설명]

  • train_test_split: 학습/테스트 데이터 세트 분리
  • accuracy_score: 정확도
  • precision_score: 정밀도
  • recall_score: 재현율
  • roc_auc_score: ROC 곡선, AUC 값
  • f1_socre: F1 스코어
  • confusion_matrix: 혼동 행렬
  • precision_recall_curve: 임곗값별 정밀도와 재현율 계산
  • roc_curve: ROC 곡선 구하는 클래스
  • StandardScaler: 표준화 지원 클래스
  • LogisticRegression: 로지스틱 회귀

▶ 전체 768개 데이터 중에서 Negative 값 0이 500개, Positive 값 1이 268개로 Negative가 상대적으로 많다.

 

해당 데이터의 feature 타입 및 Null 개수 파악

▶ Null 값 없음. 피처의 타입은 모두 int64, float64로 숫자형. (별도의 인코딩 불필요)


3. 로지스틱 회귀를 이용해 예측 모델 생성

데이터 세트를 피처 데이터 세트와 클래스 데이터 세트로 나누고 학습 데이터 세트와 테스트 데이터 세트로 분리.

함수를 이용해 성능 평가 지표를 출력

 

먼저 이전에 만들어둔 유틸리티 함수를  적용하고,

 

성능 평가 지표 추출

▶ 예측 정확도는 77.27%, 정밀도는 71.11%, 재현율은 59.26%로 측정되었다.


4. 정밀도와 재현율 값의 변화 확인 + 재현율 곡선 시각화

전체 데이터가 Negative 이므로 정확도보다는 재현율 성능에 초점을 맞춰 임곗값별 정밀도와 재현율 값의 변화를 확인하기 위해 precision_recall_curve( ) 함수 이용하고 재현율 곡선으로 시각화 하기

 

먼저 기존에 만들어둔 precision_recall_curve_plot() 함수를 불러오고

 

재현율 곡선 시각화를 하면

▶ 임곗값을 0.42 정도로 낮추면 정밀도와 재현율이 어느 정도 균형을 맞출 것으로 예상 되나, 두 지표 모두 0.7이 안 되는 낮은 값으로 보인다.


5. 데이터 값 체크하고 처리하기

임곗값을 인위적으로 조작하기 전에 다시 데이터 값을 점검(describe() 메서드를 호출해 피처 값의 분포도 체크)

▶ min 값이 0으로 되어 있는 피처가 상당히 많은데, 특히, 포도당 수치가 0인 것은 잘못되어 있다고 판단된다.

 

이를 히스토그램으로 확인해 보면 아래와 같다.

 

◆ min 값이 0으로 되어 있는 피처에 대해 0 값의 건수 및 전체 데이터 건수 대비 몇 퍼센트의 비율로 존재하는지 확인

(확인할 피처는 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI')

 

▶ SkinThickness, Insulin의 0 값은 각각 전체의 29.56%, 48/70% 로 상당히 많다.

전체 데이터 수가 많지 않기 때문에 이들 데이터를 삭제할 경우 학습을 효과적으로 수행하기 어려우므로, 위 피처의 0 값을 평균값으로 대체한다.


6. 0 값을 평균값으로 대체하기

 

0 값을 평균값으로 대체한 데이터 세트에 피처 스케일링을 적용해 변환한다.

(로지스틱 회귀의 경우 일반적으로 숫자 데이터에 스케일링을 적용하는 것이 좋다.)

스케일링 적용 후 다시 학습/테스트 데이터 세트로 나누고 로지스틱 회귀를 적용해 성능 평가 지표를 확인.

 

▶ 데이터 변환과 스케일링을 통해 성능 수치가 일정 수준 개선되었다.


7. 임곗값 조작을 통한 재현율 값 개선하기

위의 성능 지표를 보면 재현율은 여전히 개선이 필요해보이기 때문에 분류 결정 임곗값을 변화시키면서 재현율 값의 성능 수치가 어느 정도나 개선되는지 확인.

 

임곗값을 0.3에서 0.5까지 0.03씩 변화시키면서 재현율과 다른 평가 지표의 값 변화 출력 (get_eval_by_threshold 함수 사용)

먼저 기존에 만들어둔 get_eval_by_threshold 함수를 입력하고 (사이킷런의 Binarizer 클래스 임포트 선행)

 

임곗값에 따른 평가 수치 출력 코드를 입력하면

이를 정리하면

평가 지표 분류 결정 임곗값
0.3 0.33 0.36 0.39 0.42 0.45 0.48 0.5
정확도 0.7013 0.7403 0.7468 0.7532 0.7792 0.7857 0.7987 0.7987
정밀도 0.5513 0.5972 0.6190 0.6333 0.6923 0.7059 0.7447 0.7674
재현율 0.7963 0.7963 0.7222 0.7037 0.6667 0.6667 0.6481 0.6111
F1 스코어 0.6515 0.6825 0.6667 0.6667 0.6792 0.6857 0.6931 0.6804
ROC AUC 0.8433 0.8433 0.8433 0.8433 0.8433 0.8433 0.8433 0.8433

 

▶ 위 표를 기준으로 하면 재현율을 높이는 데 가장 좋은 임곗값은 0.33인 것으로 알 수 있다. (정확도와 정밀도 배제)

임곗값 0.48이 전체적인 성능 평가 지표를 유지하면서 재현율을 약간 향상시키는 좋은 임곗값으로 보인다.


8. 임곗값을 0.48로 낮춘 상태에서 다시 예측

※  사이킷런의 predict( ) 메서드는 임곗값을 마음대로 변환할 수 없다. 따라서 별도의 로직으로 산출

 

Binarizer 클래스를 이용해 predict_proba( ) 로 추출한 예측 결과 확률값을 변환해 변경된 임곗값에 따른 예측 클래스 값 산출


정리

 

이진 분류의 레이블 값이 불균형하게 분포될 경우 정확도만으로는 머신러닝 모델의 예측 성능을 평가할 수 없다.

 

오차 행렬은 Negative와 Positive 값을 가지는 실제 클래스 값과 예측 클래스 값이 True와 False 에 따라 TN, FP, FN, TP 로 매핑되는 4분면 행렬을 기반으로 예측 성능을 평가한다.

정확도, 정밀도, 재현율 수치는 이 네 가지 값을 다양하게 결합해 만들어지며, 이를 통해 분류 모델 예측 성능의 오류가 어떠한 모습으로 발생하는지 알 수 있다.

 

정밀도와 재현율은 Positive 데이터 세트의 에측 성능에 좀 더 초점을 맞춘 평가 지표이다.

 

F1 스코어는 정밀도와 재현율을 결합한 지표이며, 정밀도와 재현율이 어느 한 쪽으로 치우치지 않을 때 높은 지표값을 가지게 된다.

 

ROC-ACU 는 일반적으로 이진 분류의 성능 평가를 위해 가장 많이 사용되는 지표이며, AUC 값은 ROC 곡선 밑의 면적을 구한 것으로서 일반적으로 1에 가까울수록 좋은 수치이다.


전체 코드

03.Pima_Indians.ipynb
0.09MB

 

728x90
반응형