본문 바로가기
공부/인공지능

파킨스 텔레모니터링 데이터 셋 분석과 모델 훈련 (feat. 랜덤 포레스트)

by 혼밥맨 2020. 12. 23.
반응형

파킨스 텔레모니터링 데이터 셋 분석 (Parkins Telemonitoring Data Set Analysis and Model Training)

 

 

데이터 셋 (Data Set)

Parkins Telemonitoring Data Set UCI

목표 : predict the values for motor_UPDRS and total_UPDRS 

 

데이터 셋은 옥스포드 대학의 Athanasios Tsanas와 Max Little이 음성 신호를 녹음하기 위해 원격 모니터링 장치를 개발한 미국 및 인텔의 10개 의료 센터와 협력하여 만들었습니다. 원래 연구는 UPDRS 임상의사의 파킨슨병 증상 점수를 예측하기 위해 다양한 선형 및 비선형 회귀 방법을 사용했다.

 

출처 : archive.ics.uci.edu/ml/datasets/Parkinsons+Telemonitoring

 

It is How the Data Set Looks Like

데이터 셋 정보 (Data Set Information)

Data Set Information

데이터 셋은 6개월 텔레모니터링 기기 시험을 목적으로 모집된 초기 단계 파킨슨병 환자 42명으로부터 수집한 다양한 생명공학 음성 측정으로 구성되어 있습니다. 데이터 셋의 데이터들은 자동적으로 환자의 집에서 수집/저장되었습니다.

데이터 셋의 피쳐(열)는 환자 번호, 환자 연령, 환자 성별, 기준 모집 날짜로부터의 시간 간격, 모터 UPDR, 총 UPDR 및 16개의 생물의학 음성 측정값이 포함되어 있습니다.

 

 

피쳐/열 정보 (Attribute Information)

Attribute Information

코드 (Code)

importing necessary libraries

시작은 어느 때와 같이 필요한 라이브러리를 임포트하는 것으로 시작합니다.

 

데이터 셋이 '.data'이지만, 데이터 추출 기술을 사용해서 안전히 '.csv' 포맷으로 변경한 이후에 읽습니다.

 

dataset.describe()

describe()를 통해서 간단한 통계 요약을 확인할 수 있습니다. 그리고 결과는 모든 칼럼들이 5,875개의 동일한 행을 가지고 있기 때문에 missing value와 missing data가 없음을 알려줍니다. 

 

위에 요약 결과표를 관찰함으로써 UPDRS score를 결정하는 데에 중요한 역할을 할 것 같은 열(feature) 또한 발견할 수 있었습니다. Age (나이)가 큰 영향을 미칠 것 같습니다.

 

Age (나이)가 UPDRS score와 어떤 관계가 있는지 확인하기 위해, motor_UPDRS와 total_UPDRS에 Box Plot (상자 그림)을 사용할 것입니다.

 

Box Plotting; motor_UPDRS
Motor_UPDRS; Box Plot Grouped by Age

UPDRS는 임상 척도이고 UPDRS score가 낮을수록 더 건강하다는 뜻입니다. 

36세 환자가 낮은 motor_UPDRS을 가지고 있고, 71세 환자가 가장 높은 motor_UPDRS를 가지고 있음을 보입니다.

 

이제 Age (나이)와 total_UPDRS의 관계 역시 박스 플랏을 통해서 확인하겠습니다.

Box Plotting; total_UPDRS

total_UPDRS와 age의 박스플랏 역시 이전에 motor_UPDRS와 age와 비슷한 결과를 보여줍니다. motor_UPDRS와 total_UPDRS를 비교함으로써 상관관계를 더 확인해보도록 합시다.

 

motor_UPDRS와 total_UPDRS를 데이터 셋에서부터 분리시켜줍니다.

그리고 motor_UPDRS와 total_UPDRS를 한 눈에 비교할 수 있도록 같이 플랏합니다.

둘의 상관관계를 확인하려고 했는데 눈에 띄게 보이는 특이점이 없는 것 같습니다. 그러면 데이터 셋의 모든 피쳐들의 상관관계를 찾아볼 수 있도록 합시다. 

 

모든 피쳐들의 상관관계를 화인하는 것은 한 눈에 관계를 확인할 수 있는 아주 좋은 기능입니다.

붉을수록 상관관계도가 높고, 파란색에 가까울수록 상관관계가 낮습니다. 위에 상관관계도 표를 보면 여전히 total_UPDRS와 motor_UPDRS의 상관관계가 매우 높은 것을 확인할 수 있습니다. 데이터 셋을 훈련시킬 때, 다른 피쳐들은 독립적인(independent) 변수 역할을 하는 반면, motor_UPDRS와 total_UPDRS은 서로 의존적인 (dependent) 역할을 합니다.

 

이제 독립적인 (independent) 피쳐와 의존적인 (dependent) 피쳐까지 알아냈습니다. 그 둘을 분리하는 작업을 함으로써 데이터 셋 준비와 모델 훈련을 할 것입니다.

 

모델 훈련 준비를 위해 데이터 분할 (data split)을 진행합니다.

 

Data Splitting

이제 어떤 모델을 이용하여 훈련할 것인지 정해야 합니다. 저는 랜덤 포레스트 (Random Forest Regressor) 모델을 이용할 것입니다. 이는 다변량 회귀 분석 작업/프로젝트이기 때문에 독립 변수의 수에 관계없이 하나의 종속 변수만 처리하는 일부 회귀 모형을 무시하는 것이 안전합니다. 

 

Model #01

모델을 훈련한 이후에 예측된 결과 (y_pred)를 확인해줍니다.

예상한대로 예측 결과와 실제 데이터의 큰 차이가 없기 때문에 괜찮게 모델이 훈련된 것 같습니다.

 

 

 

 

 

모델이 실제로 잘 훈련됐는지 메트릭을 통해 확인합니다.

분산 (var), MAE, MSE, R^2의 메트릭을 확인했습니다. 

 

랜덤 포레스트 회귀 모델의 트리가 10개일 때의 결과를 확인했습니다. 그러면 트리가 50개일 때는 어떨지 확인해줍니다. 

 

Model #02

이제 트리가 50개일 때의 모델 역시 메트릭들을 통해 객관적으로 이전 모델과 비교를 해줍니다.

트리가 50개일 때 MAE가 트리가 10개일 때 보다 조금 개선한 것으로 보입니다.

 

모델을 조금 더 발전시켜보겠습니다.

데이터 셋에서 불필요한 피쳐들은 제외하고 가장 상관관계도가 높은 3개의 피쳐만 가지고 모델을 훈련시켜보겠습니다. 그리고 정말로 효과가 있는지 메트릭 결과로 확인도 해보겠습니다.

 

5875 rows x 20 columns

각 피쳐들이 얼마나 중요한지 확인하겠습니다. using 'regressor.feature_importance_'.

각 피쳐들의 중요도 (importance)를 출력해봄으로써 'subject#'가 다변량 의존 변수를 결정하는 데 50% 정도 중요하고, 이어서 age가 36%, test_time 7%, DFA 4%, sex 2%, RPDE 1%를 차지한다는 것을 알 수 있습니다.

즉, 6개의 피쳐들만이 motor_UPDRS를 결정하기 위해 모델 훈련에서 어느 정도의 의미를 기여한다는 것을 의미합니다.

 

중요도를 한 번 플랏해보겠습니다.

이제 가장 중요한 피쳐들은 'subject #', 'age', 'test_time'이라는 것을 알아냈습니다. 데이터 셋에서 이 피쳐들만 골라서 모델을 훈련시켜보도록 하겠습니다.

 

Model #03

예측 결과에 있어서, 모든 피쳐들을 이용해서 훈련했을 때보다 훨씬 나은 결과를 보여줍니다. 

 

요약 Summary

Summary

모델을 개선하는 데에 성공했습니다!

모델을 계속해서 발전시키는 데에 공을 들인 결과가 나타났습니다. 모델을 어떻게 개선할 수 있는지에 대한 방법론을 알아봤습니다.

반응형

댓글