지난 글에서 이어집니다. ([Machine Learning] 무엇이 미량영양소의 결핍을 야기하는가? - 1)
프로젝트 개요
프로젝트 명 :
무엇이 미량 영양소(micro-nutritient)의 결핍을 야기하는가?
: 미량영양소 섭취와 연관이 있는 특성 분석
프로젝트 진행 기간 : 2022년 5월 19 ~ 2022년 5월 24일
사용 데이터 : NHANES(The National Health and Nutrition Examination Survey) datasets from 2013 ~ 2014.
사용 모델 : Random Forest Classifier, XGBClassifier
분석 모델 설정
이렇게 정리한 데이터를 활용하여 분석 모델을 만들었습니다.
기준 모델
타깃 변수인 미량영양소 섭취 상태의 분포는 '정상(1)'이 1802명, '결핍/과다(0)'이 6770명으로 나타났습니다. 이 분포를 활용하여 기준 모델은 최빈값의 비율인 0.7897로 설정하였습니다.
훈련데이터/테스트데이터 분할
훈련데이터와 테스트데이터는 타깃 특성의 비율을 유지한 채로 데이터를 분할할 수 있도록 'stratify' 파라미터를 사용하여 8대 2로 분할하였습니다.
데이터 누수 방지를 위한 pipeline 설정
데이터 누수 문제를 방지하기 위해 sklearn에서 제공하는 pipeline을 활용하여 다음과 같은 파이프라인을 구성하였습니다.
from sklearn.pipeline import make_pipeline
from category_encoders import TargetEncoder
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import f_classif, SelectKBest
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
pipe = make_pipeline(
TargetEncoder(),
SimpleImputer(),
StandardScaler(),
SelectKBest(f_classif),
RandomForestClassifier()
)
1) 파이프라인에는 non-numeric 데이터를 분석에 사용될 수 있는 수치값으로 인코딩 시켜주는 방식 중 TargetEncoder 사용. (타깃값을 활용한 인코딩)
2) 결측치를 평균이나 최빈값 등의 값으로 채워 분석에 사용될 수 있도록 만드는 SimpleImputer 사용
3) 각기 다른 단위를 가지고 있는 특성들을 표준화시켜줄 수 있는 StandardSclaer 사용
4) 보다 설명력이 높은 모델을 만들기 위한 특성 선택을 위해, 타깃 변수와의 관계가 높은 특성 K개를 선별하는 SelectKBest 사용. (변수 간 관계 측정 기준은 f_classif)
5) 마지막으로, 이 프로젝트의 분류 모델인 RandomForestClassifier 사용.
최적의 파라미터 찾기
다음으로 이러한 모델에 들어갈 최적의 파라미터를 찾기 위해 sklean에서 제공하는 'RandomizedSearchCV'를 활용하였습니다.
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform
dists = {
'targetencoder__smoothing': [2.,20.,50.,60.,100.,500.,1000.],
'targetencoder__min_samples_leaf': randint(1, 10),
'simpleimputer__strategy': ['mean', 'median'],
'randomforestclassifier__class_weight' : ['balanced', None],
'randomforestclassifier__n_estimators': randint(50, 500),
'randomforestclassifier__max_depth': [5, 10, 15, 20, None],
'randomforestclassifier__max_features': uniform(0, 1)
}
clf = RandomizedSearchCV(
pipe,
param_distributions=dists,
n_iter=100,
cv=5,
scoring='accuracy',
verbose=1,
n_jobs=-1,
random_state = 42
)
위 dists에서 지정한 파라미터들을 총 500회 (5회(cv) * 100회(n_iter)) 반복하여 가장 높은 설명력을 가지는 모델에 사용될 파라미터를 탐색하였습니다.
그 결과 모델의 검증 정확도는 'f-1 score'가 0.8182로 기준 모델로 설정했던 0.7897보다 상승한 설명력이 상승한 것을 확인할 수 있었습니다. 아래 사진은 분석 모델의 설명력과 최적의 파라미터 값입니다.
특성 중요도
그런데 이런 설명 모델에서 '미량 영양소' 분류에 중요한 영향을 미치고 있는 변수는 무엇일까요?
이를 살펴보기 위해 추가적으로 Feature Importance와 Permutation Importance를 통해 특성 중요도를 검증하였습니다.
![]() |
![]() |
Feature Importance : Top 20 Features | Feature Importances & Perumtation Importances : Top 20 Features |
두 가지 특성 중요도를 고려해본 결과 '주요 영양소', '신체적 특성', '소득'과 관련된 특성들이 공통적으로 모델에서 중요한 영향력을 행사하고 있는 것을 확인할 수 있었습니다.
이렇게 확인한 특성 중요도 값을 활용해 Permutation Importance의 값이 0보다 큰 경우(20개의 특성)만 다시 모델에 포함시켜, 위에서 찾아낸 파라미터와 함께 다시 분석 모델로 활용하였으며, 그 결과 다시 기존 모델에서 얻었던 0.8182보다 소폭 상승한 0.8244의 설명력을 가지는 모델을 만들 수 있었습니다!
특성 분석
마지막으로 어떤 특성이 어떤 결론을 미치고 있는지를 분석하기 위해 'SHAP'을 사용하였습니다.
순위 | Positive | Negative |
1 | 콜레스트롤 | 섬유질 |
2 | 포화지방산 | 탄수화물 |
3 | 섭취량 | 프로틴 |
4 | 악력 | 당 |
5 | 테오브로민 | 칼로리 |
6 | 소득 | 알코올 |
7 | BMI | 나이 |
8 | 카페인 | 다가불포화지방산 |
결론
1) 미량 영양소 영양 상태의 '미국적 현상' 확인
미국에서도 미량영양소의 영양 상태가 사람들의 인구-사회 및 기타 영양 상태와 관련이 있는 것으로 나타났습니다. 소득은 높을수록, 탄수화물이나 칼로리 섭취는 낮을수록 미량영양소에 긍정적인 영향을 미치고 있는 것으로 나타났습니다. 탄수화물이나 칼로리 섭취가 미량영양소와 음의 관계에 있다는 것은 다소 의외의 결과로 보이기도 합니다. 그러나 동시에 이러한 의외의 결과는 미국의 독특한 특성을 반영하는 '미국적 특성'을 반영하는 것으로도 해석될 수 있습니다. 미국의 경우, 소득이 낮을수록 각종 패스트푸드나 인스턴트 식품이 식사에서 차지하는 비중이 높아지는 반면, 채소나 과일이 차지하는 비중은 낮기 때문입니다.
2) 미국과 같은 선진국에서는 '소득'이 미량 영양소 영양 상태에 큰 영향을 미치지 않는다?
소득이 미량 영양소 영양 상태에 미치는 영향력이 다른 변수에 비해 상대적으로 작은 것을 고려하면, 미국과 같은 선진국에서는 미량 영양소 영양 상태 문제가 계급 문제라고 딱 잘라 말하기 어려워보입니다. 물론 이는 표면적으로 드러난 분석 결과를 고려했을 때 충분히 그럴듯해 보이는 해석입니다.
그러나 동시에 NHNES 데이터셋이 가진 한계 자체를 이야기할 수도 있습니다. 우선 건강/영양 상태 측정을 위해 고안된 데이터라는 점에서, 다른 사회-경제적 지표에 비해 사회-경제학적 특성에 대한 정보가 부족합니다.
또한 NHNES 데이터셋은 빈곤층과 고소득층 간의 표집이 통계적으로 유의미하게 이루어지지 않은 것으로 보입니다. 6세 이상의 소득 분포를 확인했을 때, 연 가구 소득 10억 달러(약 1억) 이상이 전체 대상 중 약 10%에 해당하고 있는 것을 확인할 수 있었습니다.
따라서 이러한 사실들을 종합하여, 다음과 같은 결론을 도출하였습니다.
비록 데이터 자체가 빈곤층을 충분히 대표하지 못함에도 불구하고, 여전히 소득과 미량 영양소 영양 상태 간에는 유의미한 연관 관계가 있는 것으로 나타난다.
이런 연관 관계에서 특히 주목해야 할 점은 탄수화물이나 칼로리 섭취가 미량 영양소 영양 상태와는 부정적인 관계를 가지고 있다는 점이다. 이는 저소득층일수록 인스턴트,패스트푸드를 많이 섭취하는 미국적인 현상을 보여준다고 할 수 있다.
따라서 미국 내에서도 빈곤층의 미량 영양소 영양 상태 문제에 관심을 가지고 이를 개선해 나갈 필요가 있다. 마찬가지로 NHNES 데이터도 빈곤층을 보다 더 잘 반영할 수 있게 표집되어야 한다.
참고자료
'Project' 카테고리의 다른 글
[Deep Learning] Gerhard Richter 소개하기 (자연어 처리, GAN) (0) | 2022.08.05 |
---|---|
[Machine Learning & Data Engineering] 시집 데이터를 분류해 추천하는 서비스를 웹으로 구현해보기 - 후기 (0) | 2022.06.28 |
[Machine Learning & Data Engineering] 시집 데이터를 분류해 추천하는 서비스를 웹으로 구현해보기 - 2 (0) | 2022.06.28 |
[Machine Learning & Data Engineering] 시집 데이터를 분류해 추천하는 서비스를 웹으로 구현해보기 - 1 (0) | 2022.06.28 |
[Machine Learning] 무엇이 미량영양소의 결핍을 야기하는가? - 1 (0) | 2022.06.13 |