지금까지 풀었던 문제를 다시 한 번 정리해볼 수 있는 시간이다.
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")
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는 아니라는 것을 유의해야한다.
'DAFIT > 906 - 머신러닝으로 당뇨병 예측' 카테고리의 다른 글
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 06 Random Forest를 이용한 당뇨병 예측 (0) | 2019.11.26 |
---|---|
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 05 Decision Tree를 이용한 당뇨병 예측 (0) | 2019.11.26 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 04 데이터 분할 (0) | 2019.11.24 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 03 데이터 시각화 (0) | 2019.11.24 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 02 NaN값,NULL 값 처리하기 (+ 삽질연속, 실망스러운 결과..) (0) | 2019.11.23 |