[프로젝트로 배우는 데이터사이언스] 의사결정나무로 간단한 분류 예측 모델 만들기

✔ Supervised larning

  • 정답이 있는 데이터
  • 분류와 회귀로 나눌 수 있음 (Classification / Regression)
  • ex) 고객의 구매 패턴에 따라 구매를 한다 / 안한다로 나눌 수 있는 데이터가 있다면 새로운 고객이 들어왔을 때 그 고객이 구매를 할 것이다 / 안 할 것이다 를 예측할 수 있음


💎 DecisionTreeClassifier

  • 특정 조건에 따라 왼쪽과 오른쪽으로 트리를 타고 내려가며 분류를 진행
# 모델 피팅
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)

# 클래스 예측 >> output array([1])
clf.predict([[2., 2.]])
# 클래스 확률 예측 >> output array([[0., 1.]])
clf.predict_proba([[2., 2.]])

💎 의사결정나무로 당뇨병 데이터 분류 예측 모델 만들기

🔼 데이터 구성

  • 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입니다.

🔼 데이터셋 만들기

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
pd.read_csv('diabetes.csv')
# 데이터가 모두 숫자이기 때문에 전처리 생략

# 학습, 예측 데이터셋 나누기 (8:2의 비율로 나누어 담기)
train = df[:614].copy()
test = df[614:].copy()

# feature_names 변수에 학습과 예측에 사용할 컬럼명 가져오기
feature_names = train.columns[:-1].tolist()

# label_name 변수에 예측할 컬럼 담기
label_name = train.columns[-1]
# 학습 세트 만들기
X_train = train[feature_names]
print(X_train.shape)
X_train.head()

# 정답 값
y_train = train[label_name]
print(y_train.shape)
y_train.head()

# 예측에 사용할 데이터 세트 만들기
X_test = test[feature_names]
print(X_test.shape)
X_test.head()

# 예측의 정답값
y_test = test[label_name]
print(y_test.shape)
y_test.head()

🔼 의사결정나무로 학습과 예측하기

# 머신러닝 알고리즘 가져오기
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()

# 학습
model.fit(X_train, y_train)

# 예측
y_predict = model.predict(X_test)
y_predict

🔼 예측한 모델의 성능 측정 및 분석

# 의사결정나무 시각화
from sklearn.tree import plot_tree
plt.figure(figsize=(20, 20))
tree = plot_tree(model,
		feature_names=feature_names,
                filled=True,
                fontsize=10)

# feature의 중요도 추출
model.feature_importances_

# feature의 중요도 수치 시각화
sns.barplot(x=model.feature_importances_, y=feature_names)

# 실제값 - 예측값에 절대값을 씌운 값이 1이면 틀린 예측 >> output 42
diff_count = abs(y_test - y_predict).sum()

# 예측의 정확도 >> output 72%
(len(y_test) - diff_count) / len(y_test) * 100

# 사이킷런을 이용해 예측의 정확도 구하기 >> output 72%
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict)

# model의 score함수를 이용해 정확도 구하기 >> output 72%
model.score(X_test, y_test) * 100

좋은 웹페이지 즐겨찾기