[프로젝트로 배우는 데이터사이언스] pima_classification_baseline
2024. 6. 27. 00:29ㆍMOOC
의사결정 나무
의사 결정 트리의 장점은 다음과 같다:
- 이해하고 해석하기 쉽다. 나무를 시각화할 수 있다.
- 데이터 준비가 거의 필요하지 않다. 정규화, 더미 변수를 만들 필요가 없고, 빈 값을 제거할 필요도 없다. 일부 트리 및 알고리즘 조합은 결측값을 지원한다.
- 트리 사용 비용(즉, 데이터 예측 비용)은 트리를 학습하는 데 사용되는 데이터 포인트의 수와 같다.
- 숫자 및 범주 데이터를 모두 처리할 수 있다. 다만 scikit-learn 구현은 범주형 변수를 지원하지 않는다.
- 다중 출력 문제를 처리할 수 있다.
- 화이트 박스 모델을 사용한다. 주어진 상황을 모델에서 관찰할 수 있으며, 조건에 대한 설명은 부울 논리로 쉽게 설명할 수 있다.
- 통계적 검정을 이용하여 모델을 검증할 수 있어 모델의 신뢰성을 설명할 수 있다.
- 가정이 다소 위반되더라도 잘 수행된다.
의사 결정 트리의 단점은 다음과 같다:
- 학습자가 지나치게 복잡한 트리를 만들어 데이터를 잘 일반화하지 못할 수 있다. 이를 과적합이라고 한다. 가지 치기, 리프 노드에서 필요한 최소 샘플 수 설정, 트리의 최대 깊이를 설정하는 등의 메커니즘이 이 문제를 피하는 데 필요하다.
- 의사 결정 트리는 작은 변동으로 인해 불안정할 수 있다. 데이터로 인해 완전히 다른 트리가 생성될 수 있다. 이는 앙상블 기법을 사용하여 완화할 수 있다.
- 의사 결정 트리의 예측은 매끄럽지 않고 조각별 상수 근사치로, 외삽에 능숙하지 않다.
- 최적 의사결정 트리를 학습하는 문제는 최적성의 여러 측면에서 어려운 문제로, 실용적인 알고리즘은 휴리스틱 알고리즘에 기반한다. 이러한 알고리즘은 전역적으로 최적의 의사 결정 트리를 보장하지 않으며, 앙상블 학습을 통해 여러 트리를 훈련하여 이 문제를 완화할 수 있다.
- XOR, 패리티, 멀티플렉서 문제와 같은 개념을 배우기 어려운 경우가 있다.
- 일부 클래스가 지배적인 경우 편향된 트리를 만들 수 있어, 데이터 세트의 균형을 맞추는 것이 중요하다.
데이터 구성
- Pregnancies : 임신 횟수
- Glucose : 2시간 동안의 경구 포도당 내성 검사에서 혈장 포도당 농도
- BloodPressure : 이완기 혈압 (mm Hg)
- SkinThickness : 삼두근 피부 주름 두께 (mm), 체지방을 추정하는데 사용되는 값
- Insulin : 2시간 혈청 인슐린 (mu U / ml)
- BMI : 체질량 지수 (체중kg / 키(m)^2)
- DiabetesPedigreeFunction : 당뇨병 혈통 기능
- Age : 나이
- Outcome : 768개 중에 268개의 결과 클래스 변수(0 또는 1)는 1이고 나머지는 0입니다.
필요한 라이브러리 로드
In [7]:
# 데이터 분석을 위한 pandas, 수치계산을 위한 numpy
# 시각화를 위한 seaborn, matplotlib.pyplot 을 로드합니다.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
데이터셋 로드
In [8]:
df = pd.read_csv("C:/Users/82106/Desktop/데이터 분석 프로젝트 2/당뇨병 머신러닝/데이터/archive/diabetes.csv")
df.shape
Out[8]:
(768, 9)
학습, 예측 데이터셋 나누기
In [9]:
# 8:2 의 비율로 구하기 위해 전체 데이터의 행에서 80% 위치에 해당되는 값을 구해서 split_count 라는 변수에 담습니다.
split_count = int(df.shape[0] * 0.8)
split_count
Out[9]:
614
In [10]:
# train, test로 슬라이싱을 통해 데이터를 나눕니다.
train = df[:split_count].copy()
train.shape
Out[10]:
(614, 9)
In [11]:
test = df[split_count:].copy()
test.shape
Out[11]:
(154, 9)
학습, 예측에 사용할 컬럼
In [12]:
# feature_names 라는 변수에 학습과 예측에 사용할 컬럼명을 가져옵니다.
feature_names = train.columns[:-1].tolist()
feature_names
Out[12]:
['Pregnancies',
'Glucose',
'BloodPressure',
'SkinThickness',
'Insulin',
'BMI',
'DiabetesPedigreeFunction',
'Age']
정답값이자 예측해야 될 값
In [13]:
# label_name 이라는 변수에 예측할 컬럼의 이름을 담습니다.
label_name = train.columns[-1]
label_name
Out[13]:
'Outcome'
학습, 예측 데이터셋 만들기
In [14]:
# 학습 세트 만들기 예) 시험의 기출문제
X_train = train[feature_names]
print(X_train.shape)
X_train.head()
(614, 8)
Out[14]:
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAge01234
6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 |
1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 |
8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 |
1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 |
0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 |
In [15]:
# 정답 값을 만들어 줍니다. 예) 기출문제의 정답
y_train = train[label_name]
print(y_train.shape)
y_train.head()
(614,)
Out[15]:
0 1
1 0
2 1
3 0
4 1
Name: Outcome, dtype: int64
In [16]:
# 예측에 사용할 데이터세트를 만듭니다. 예) 실전 시험 문제
X_test = test[feature_names]
print(X_test.shape)
X_test.head()
(154, 8)
Out[16]:
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAge614615616617618
11 | 138 | 74 | 26 | 144 | 36.1 | 0.557 | 50 |
3 | 106 | 72 | 0 | 0 | 25.8 | 0.207 | 27 |
6 | 117 | 96 | 0 | 0 | 28.7 | 0.157 | 30 |
2 | 68 | 62 | 13 | 15 | 20.1 | 0.257 | 23 |
9 | 112 | 82 | 24 | 0 | 28.2 | 1.282 | 50 |
In [29]:
feature_names
Out[29]:
['Pregnancies',
'Glucose',
'BloodPressure',
'SkinThickness',
'Insulin',
'BMI',
'DiabetesPedigreeFunction',
'Age']
In [17]:
# 예측의 정답값 예) 실전 시험 문제의 정답
y_test = test[label_name]
print(y_test.shape)
y_test.head()
(154,)
Out[17]:
614 1
615 0
616 0
617 0
618 1
Name: Outcome, dtype: int64
머신러닝 알고리즘 가져오기
In [18]:
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(random_state=42)
model
Out[18]:
DecisionTreeClassifier(random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
학습(훈련)
- 시험을 볼 때 기출문제(X_train)와 정답(y_train)을 보고 공부하는 과정과 유사합니다.
In [19]:
model.fit(X_train, y_train)
Out[19]:
DecisionTreeClassifier(random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
예측
- 실전 시험문제(X_test)라고 보면 됩니다. 우리가 정답을 직접 예측합니다.
In [20]:
y_predict = model.predict(X_test)
y_predict[:5]
Out[20]:
array([1, 0, 1, 0, 1], dtype=int64)
트리 알고리즘 분석하기
- 의사결정나무를 시각화 합니다.
In [21]:
from sklearn.tree import plot_tree
plt.figure(figsize=(20, 20))
tree = plot_tree(model,
feature_names=feature_names,
filled=True,
fontsize=10)
# graphviz 를 통해 시각화 합니다.
# graphviz 는 별도의 설치가 필요합니다.
# graphviz 와 파이썬에서 graphviz 를 사용할 수 있게 해주는 도구 2가지를 설치해 주셔야 합니다.
# import graphviz
# from sklearn.tree import export_graphviz
# dot_tree = export_graphviz(model,
# feature_names = feature_names,
# filled=True)
# graphviz.Source(dot_tree)
In [23]:
# 피처의 중요도를 추출하기
model.feature_importances_
Out[23]:
array([0.05944171, 0.30368248, 0.13140431, 0.04020035, 0.09010707,
0.15739296, 0.12077948, 0.09699165])
In [24]:
# 피처의 중요도 시각화 하기
sns.barplot(x=model.feature_importances_, y=feature_names)
정확도(Accuracy) 측정하기
In [25]:
# 실제값 - 예측값을 빼주면 같은 값은 0으로 나오게 됩니다.
# 여기에서 절대값을 씌운 값이 1인 값이 다르게 예측한 값이 됩니다.
diff_count = abs(y_test - y_predict).sum()
diff_count
Out[25]:
44
In [26]:
# 예측의 정확도를 구합니다. 100점 만점 중에 몇 점을 맞았는지 구한다고 보면 됩니다.
(len(y_test) - diff_count) / len(y_test) * 100
Out[26]:
71.42857142857143
In [27]:
# 위에서 처럼 직접 구할 수도 있지만 미리 구현된 알고리즘을 가져와 사용합니다.
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict) * 100
Out[27]:
71.42857142857143
In [28]:
# model 의 score 로 점수를 계산합니다.
model.score(X_test, y_test) * 100
Out[28]:
71.42857142857143
'MOOC' 카테고리의 다른 글
[프로젝트로 배우는 데이터사이언스]pima_diabetes_preprocessed (1) | 2024.06.28 |
---|---|
[프로젝트로 배우는 데이터사이언스]pima_diabetes_eda (0) | 2024.06.27 |
PyTorch 프로젝트 구조 이해하기 (0) | 2024.06.06 |
[파이토치로 만드는 딥러닝 이론3] 모델 저장하기 (1) | 2024.06.03 |
[파이토치로 만드는 딥러닝 이론2] PyTorch Dataset 실습 (2) | 2024.06.03 |