주제: 결정트리 실습
작성: 2023-03-03
데이터: Pima Indians Diabetes Database
버젼: ① python : 3. 9.13 ② pandas : 1. 4. 4 ③ sklearn : 1. 1. 1
안녕하세요, wscode 루카스입니다.
본 포스팅은 「파이썬 머신러닝 완벽가이드」 의 독학한 내용을 기반으로 하고 있습니다. 사용하게 될 Pima Indians Diabetes Database 데이터는 로지스틱 회귀알고리즘을 적용 시, 더 높은 정확도가 나오나, 결정트리의 사용법을 익히기 위해 해당 알고리즘을 사용함을 사전에 알려드립니다.
1. 데이터 준비
Pima Indians Diabetes Database 데이터는 측정을 기반으로 환자의 당뇨병 여부를 진단하기위한 데이터입니다. 변수는 아래와 같으며, 데이터는 하단의 링크를 통해서 다운로드 가능합니다.
- 변수 : 임신횟수, BMI, 인슐린 수치, 연령등이 포함
- 결과값 : outcome
Pima Indians Diabetes Database
https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database?resource=download
Human Activity Recognition Using Smartphones Data Set
https://archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones
일반적으로 머신러닝 알고리즘을 적용하기 전에 데이터의 특성을 파악하는 작업인 EDA을 진행해여 적합한 알고리즘을 적용하는것이 본편적인 방식이나, 본 포스팅은 결정트리 알고리즘 사용법에 중점을 두기때문에 EDA는 생략하도록 하겠습니다.
2. 데이터 읽기
pandas의 .read_csv( ) 이용하여 다운받은 데이터를 읽습니다.
import pandas as pd
df= pd.read_csv('./diabetes.csv')
df.info() #데이터의 일반적인 특성 파악
df.corr() #데이터변수간의 상관관계 파악
더보기
.info() 결과값
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Pregnancies 768 non-null int64
1 Glucose 768 non-null int64
2 BloodPressure 768 non-null int64
3 SkinThickness 768 non-null int64
4 Insulin 768 non-null int64
5 BMI 768 non-null float64
6 DiabetesPedigreeFunction 768 non-null float64
7 Age 768 non-null int64
8 Outcome 768 non-null int64
dtypes: float64(2), int64(7)
memory usage: 54.1 KB
.corr() 결과값
3. 모델 적용 및 시각화
3.1. DecisionTree
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
dt_clf = DecisionTreeClassifier(random_state = 55)
X_train,X_test, y_train, y_test = train_test_split(df.iloc[:,:-1], df.iloc[:,-1],
test_size =0.3, random_state =77)
dt_clf.fit(X_train, y_train)
3.2. 시각화
import graphviz
from sklearn.tree import export_graphviz
# export_graphviz()의 호출 결과로 out_file로 지정된 tree.dot 파일을 생성
export_graphviz(dt_clf, out_file="tree.dot",
feature_names = df.columns[:-1].to_list(), impurity=True, filled=True)
# %conda install graphviz
# 위에서 생성된 tree.dot 파일을 Graphviz 읽어서 Jupyter Notebook상에서 시각화
with open("tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
만약, 해당 데이터를 png로 저장하고싶다면?
## How to convert Decision Tree.dot as png file
dot = graphviz.Source(dot_graph)
dot.format='png'
dot.render(filename='tree3') #tree.png 저장
3.3. 변수간의 영향력 판단하기
import seaborn as sns
import numpy as np
%matplotlib inline
print("Feature importance :\n{0}".format(np.round(dt_clf.feature_importances_, 3)))
for name, value in zip(df.iloc[:,:-1],dt_clf.feature_importances_):
print('{0}: {1:.3f}'.format(name, value))
sns.barplot(x=dt_clf.feature_importances_, y= df.columns[:-1])
3.4. 예측하기
pred = dt_clf.predict(X_test)
import sklearn
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, pred)
print("결정트리의 예측정화도: {0:.4f}".format(accuracy))
3.5. Grid_cv 활용하여 정확도 높히기
parmas = {'max_depth' : [5,6,7,8,9,10]
}
grid_cv= GridSearchCV(dt_clf, param_grid = parmas, scoring ='accuracy', cv=5, verbose =1
)
grid_cv.fit(X_train, y_train)
print("Gridsearchcv 최고 평균 정확도 수치 : {0:.4f}".format(grid_cv.best_score_))
print("Gridsearchcv 최적 하이퍼 파라미터:", grid_cv.best_params_)
4. 요약 - 결정트리의 장단점
장점
- 쉽고 직관적임
- 피처의 스케일링이나 정규화등의 사전 가공 영향도가 적은 편임
단점
- 과적합 알고리즘으로 성능이 떨어지는 경향이 있어, 이를 위해 트리의 크기(max_depth) 등의 하이퍼파라미터의 튜닝 필요함
Reference
- [도서] 「파이썬 머신러닝 완벽가이드」 4장 분류
- graphviz 설치 오류: https://wscode.tistory.com/70
- 사잇킬런으로 시작하는 머신러닝: https://wscode.tistory.com/68
728x90
반응형
'Python > 2️⃣ 데이터 처리' 카테고리의 다른 글
웹크롤링으로 SST(Surface Sea Temperature) 데이터 다운로드 자동화하기 (0) | 2023.07.31 |
---|---|
[머신러닝] 랜덤포레스트 예시 - Pima Indians Diabetes Database (0) | 2023.03.04 |
간단한 통계 개념 정리 (0) | 2023.02.14 |
1변량 & 다변량 데이터 및 시각화 방안(with python) (0) | 2023.02.13 |
불편분산은 왜 n-1로 나누지? (0) | 2023.02.12 |