앎을 경계하기

DAFIT/906 - 머신러닝으로 당뇨병 예측

<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 07 Feature Importance

양갱맨 2019. 11. 26. 01:54

지금까지 풀었던 문제를 다시 한 번 정리해볼 수 있는 시간이다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pandas as pd

지난 번 예측문제에서 사용했던 의사결정트리와 랜덤포레스트를 다시 한 번 사용한다.

데이터를 로드하고,

data = pd.read_csv("/content/drive/My Drive/다핏문제/906/dataset_37_diabetes.csv")
data

결측치 처리한다.

presd = data.replace({'pres':0},{'pres':None})
presd1 = presd.dropna()
presd = data.replace({'pres':0}, {'pres':None})
presd = presd.fillna(presd1.pres.median())

massd = presd.replace({'mass':0.0},{'mass':None})
massd1 = massd.dropna()
massd = data.replace({'mass':0.0},{'mass':None})
massd = massd.fillna(massd1.mass.median())

plasd = massd.replace({'plas':0}, {'plas':None})
plasd1 = plasd.dropna()
data = plasd.fillna(plasd1.plas.median())

feature도 class feature분리시킨다.

col = list(map(str, data.columns))
x = data[col[:-1]]
y = data[col[-1]]
print(x, y)

train, validation, test set을 나눠주자.

x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.4)

x_test, x_val, y_test, y_val = train_test_split(x_test,y_test, test_size=0.5)

먼저 decision tree 구현

dTree = DecisionTreeClassifier(max_depth=3,random_state=0).fit(x_train,y_train)

print("train score : {}".format(dTree.score(x_train, y_train)))
print("val score : {}".format(dTree.score(x_val, y_val)))

#print("test score : {}".format(dTree.score(x_test,y_test)))
predict_y = dTree.predict(x_test)
predict_y

from sklearn.metrics import classification_report
print(classification_report(y_test, dTree.predict(x_test)))
print("test score : {}".format(dTree.score(x_test, y_test)))

다음 random forest 구현

rf = RandomForestClassifier(n_estimators=100, random_state=0).fit(x_train,y_train)

print("train score : {}".format(rf.score(x_train, y_train)))
print("val score : {}".format(rf.score(x_val, y_val)))

#print("test score : {}".format(dTree.score(x_test,y_test)))
predict_y = rf.predict(x_test)

from sklearn.metrics import classification_report
print(classification_report(y_test, rf.predict(x_test)))
print("test score : {}".format(rf.score(x_test, y_test)))

이번엔 randomforest가 test mean accuracy가 높았다.

갑자기 왜 decision tree score가 떨어졌는지 모르겠다..

일단 지금 문제에서는 어떤 feature들이 예측에 있어서 중요성을 띄는지를 확인하는 문제니까 넘어가도록함.

feature_importances_를 사용해서 각 feature들의 중요도를 계산한다.

tree_im = dTree.feature_importances_
rf_im = rf.feature_importances_

숫자로 보면 별로 눈에 안들어오니까 그래프를 그려야겠다.

먼저 판다스로 series 구성을 한다.

tree_im = pd.Series(tree_im, col[:-1])
rf_im = pd.Series(rf_im, col[:-1])

bar chart를 그리는게 좋을 것 같다.

tree_im.plot(kind="bar", color="g")
rf_im.plot(kind="bar", color="purple")

left : decision tree, right : random forest

Decision Tree와 Random Forest 모두 plas (임당 시험 2시간 경과 후의 혈당 수치)가 당뇨 예측에 가장 중요한 feature로 해석할 수 있다.

그리고 두 알고리즘 모두 plas 다음으로 mass와 age가 중요성이 높은것으로 나타났다.

차이점은 decision tree에서는 plas 항목이 0.53으로 importance가 월등히 높고 mass, age가 0.2x로 그 다음으로 높았으며 insu이 0.041 정도의 값으로 나타났다.
그러나 random forest에서는 insu가 0.07로 decision tree에서는 0.0으로 나왔던 preg, press, pedi와 같은 항목들보다 낮은 값이 나왔다.
random forest에서는 pedi 항목이 mass와 age 다음으로 예측에 중요한 feature로 나타났다.

중요도가 낮다고 해서 신경을 안써도 되는 feature는 아니라는 것을 유의해야한다.

 

 

 

http://www.dafit.me/question/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&bmode=view&idx=2682894&t=board

 

[DF906] 머신러닝을 통한 당뇨병 예측 : 다핏, 데이터사이언스 연습문제

🔥 문제 설명당뇨병에 영향을 주는 8가지 특징을 바탕으로, 머신러닝 기법을 통해 당뇨병을 예측해보는 문제입니다. 🔥 추천 대상머신러닝에 많이 활용되는 SciKit-Learn을 활용하여 머신러닝 입문을 해보고 싶은 자.캐글의 타이타닉 생존자 예측 문제 수준을, 새로운 문제로 스스로 해결해보고 싶은 자.이진 분류데이터(True / False)를 활용하여 기초적인 데이터 분석과 머신러닝 기법을 체험해보고 싶은 사람.🔥 학습 목표머신러닝의 세부적인 모델링 또는

www.dafit.me