Machine Learning

Machine Learning - Logistic Regression 심장 병 여부 예측하기

electronicprogrammer 2020. 10. 7. 12:56

 

데이터 출처 : www.kaggle.com/ronitf/heart-disease-uci

 

Heart Disease UCI

https://archive.ics.uci.edu/ml/datasets/Heart+Disease

www.kaggle.com

ipynb file : github.com/sangHa0411/DataScience/blob/main/Heart_Disease.ipynb

 

sangHa0411/DataScience

Contribute to sangHa0411/DataScience development by creating an account on GitHub.

github.com

 

먼저 Pandas를 이용해서 데이터를 불러오겠습니다.

데이터의 총 갯수는 303개인 것을 확인할 수 있습니다.

데이터의 속성을 보니 나이 , 성별 등을 비롯해서 여러 속성이 있는 것을 확인할 수 있습니다.

각 속성에 대한 정보는 위 데이터 출처 주소에 가시면 확인하실 수 있습니다.

 

그리고 저희의 목표가 되는 target data는 심장 병의 여부 입니다. 따라서 그에 대한 데이터를 분석해보겠습니다.

심장병이 없는 사람의 데이터는 54.5%정도이고 심장병이 있는 사람의 데이터는 대략 45%정도 인 것을 확인하였습니다.

여기서 데이터를 추가적으로 분석하기 위해서 심장병이 있는 데이터와 심장병이 없는 데이터를 분할하도록 하겠습니다.

 

이제 이렇게 분할된 데이터를 이용해서 심장병과 성별을 먼저 분석해보겠습니다.

분석 결과 심장병이 없는 데이터의 경우 남성 보다는 여성이 훨씬 많았음을 알 수 있습니다.

심장병이 있는 경우에는 남성이 여성보다 수가 부족하지만 그대로 그 차이가 크지 않았습니다.

 

이제 심장병과 나이를 연관지어서 분석해보겠습니다.

아래의 그래프는 심장병의 있는 데이터와 심장병이 없는 데이터에서 나이를 히스토그램으로 표현한 것입니다.

보면 심장병이 있는 경우의 데이터에서 보면 나이대가 40대 초반 그리고 50대 초반이 많은 것을 확인할 수 있습니다.

심장병이 없는 경우에는 나이대가 50대후반에서 60대 초반이 위주인 것을 확인할 수 있습니다.

 

심장병과 Chest Type과 연관지어서 분석해보겠습니다.

심장병이 없는 경우에는 Chest Type이 0인 경우가 위주를 이루었고 심장병이 있는 경우에는 다양하게 Chest Type이 분포되있는 것을 확인할 수 있습니다. 

심장병의 유무와 전체 속성들의 상관관계를 파악하기 위해서 상관관계 계수를 구해서 파악해보겠습니다.

여기서 심장병과 관련된 속성만을 수치로 구해보겠습니다.

-1이 가까울 수록 반비례하는 관계 1에 가까울 수록 정비례하는 관계 0에 가까울 수록 연관성이 없음을 의미합니다.

이를 토대로 해서 절댓값이 0.2만을 넘는 속성을 선택해서 Logistic Regression을 이용해보도록 하겠습니다.

 

여기서 심장 병의 유무에 관한 데이터인 target을 label로 정하고 나머지는 훈련에 대한 데이터로 이용해보겠습니다.

 

이제 위 데이터를 훈련 및 테스트 데이터로 80% 대 20%로 분할해서 진행하겠습니다.

 

여기서 각 데이터의 속성을 전처리하겠습니다.

이산적인 속성의 데이터는 One Hot Encoding을 진행하고 연속적인 속성의 데이터는 Scaling을 진행합니다.

이제 훈련 데이터만을 이용해서 전처리 도구를 학습시키고 훈련 데이터 및 테스트 데이터를 모두 변환시키도록 하겠습니다.

이제 이 데이터를 이용해서 Logistic Regression을 구현해보고 Scikit-learn의 Logistic Regression의 함수와 성능을 비교해보겠습니다.

Logistic Regression에 대해서는 이전 포스팅에서 자세하게 다루었습니다.

이전 포스팅 주소 : eletronicprogrammer.tistory.com/7

 

Machine Learning - Logistic Regression 연봉 예측하기 Part2

데이터 출처 : www.kaggle.com/lodetomasi1995/income-classification Income classification Prediction task is to determine whether a person makes over 50K a year. www.kaggle.com Ipynb File : github.c..

electronicprogrammers.com

 

먼저 활성화 함수인 시그모이드 함수를 정의합니다.

시그모이드를 이용한 Binary Classification이므로 Binary Classification CrossEntropy를 손실함수로 생각하고 

손실함수를 시그모이드 출력값에 대해서 미분한 값을 구하는 함수를 만들었습니다.

 

이제 이 값을 이용해서 오차역전파의 원리를 통해서 가중치의 값을 갱신하는 함수를 만듭니다.

아래는 오차역 전파를 설명하는 그림입니다.

가중치를 갱신하는 함수입니다.

이제 구한 가중치 값의 크기를 확인해보겠습니다.

입력이 길이가 22인 벡터이니 가중치또한 길이가 22인 벡터여야 하는 것을 확인할 수 있습니다.

이제 이를 이용해서 테스트 데이터를 대상으로 성능을 측정하고 Loss 값을 그래프로 그려보겠습니다.

전체 정확도는 87% 정도인 것을 확인할 수 있습니다.

True Postivie Rate는 89%로 실제 심장병이 있는데 심장병이 있다고 예측할 확률이 89%인 것을 의미합니다.

False Postivie Rate는 16%로 실제 심장병이 없는데 심장병이 있다고 예측할 확률이 16%인 것을 의미합니다.

 

이제 Scikit Learn의 Logistic Regression을 이용해보겠습니다.

훈련 데이터를 이용해서 Logistic Regression을 학습시킵니다. 그리고 이를 기반으로 해서 테스트 데이터의 결과를 예측합니다.

이 예측 값과 실제 값을 비교해보겠습니다.

위에서 직접 구현한 성능 측정 결과와 같은 것을 확인할 수 있습니다.

참고자료 1. www.yes24.com/Product/Goods/9046762

 

머신러닝 인 액션

최고의 한 수를 위한 데이터 마이닝!개발자를 위한 지침서. 기계 학습 소개, 다양한 예제로 기계 학습 실습하기, 매일 발생되는 데이터 분석하기, 어프라이어리와 에이다부스트 같은 전형적인 ��

www.yes24.com

참조자료2 : www.yes24.com/Product/Goods/34970929

 

밑바닥부터 시작하는 딥러닝

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서 이 책은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘밑바닥부터’ 직접 만들어보며 즐겁게 배울 수 있는 본격 딥

www.yes24.com