Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Seongho Jang

Ch.18 의사결정나무 본문

Data Science Lv.2

Ch.18 의사결정나무

seonghojang 2023. 1. 3. 23:14

의사결정나무 : 의사결정 규칙을 나무 구조로 도식화하여 관심대상이 되는 집단을 몇 개의 소집단으로 분류하거나 예측하는 계량적 분석 방법

 

Root Node: 모든 자료를 포함하는 의사결정 나무의 출발점

Leaf Node : 최종 결과를 나타내는 마디로 자료들은 더이상 나누어지지 않음

Depth: 뿌리 마디부터 끝 마디까지 중간 마디들의 수

https://ratsgo.github.io/machine%20learning/2017/03/26/tree/

분류 나무: 범주형 목표 변수를 기준으로 마디를 나눔

                 끝마디에 포함된 자료의 범주가 분류 결과값이 됨

회귀 나무: 연속형 목표 변수를 기준으로 마디를 나눔

                 끝마디에 포함된 자료의 평균값이 각 끝마디의 회귀값이 됨

 

 

의사결정 나무의 알고리즘 : 불순도를 감소시키는 방향으로 분리

                                             = Information Gain이 증가하는 방향으로 분리

불순도  -  범주형 목표 변수 : Gini Reduction, Entropy Reduction, Chi-square test

                연속형 목표 변수 : F-test, Reduction of Variance

Gini Impurity와 Entropy 모두 0에 가까울수록 분류가 잘 되어 있는 것이며,

Gini는 최대값이 0.5, Entropy는 최대값이 1이다.

https://www.quora.com/Are-gini-index-entropy-or-classification-error-measures-causing-any-difference-on-Decision-Tree-classification

Gini는 각 class에 속할 확률의 제곱의 합을 1에서 뺀 것이다 정도로만 정리...

 

Information Gain은 앞 노드의 엔트로피(또는 지니 계수)에서 다음 노드의 엔트로피를 뺸 것,

즉 분류를 통해서 엔트로피가 얼마나 감소했는지를 측정하는 계수이다.

분류 후 여러 노드가 생겼을 경우 각 노드의 엔트로피를 가중평균하여 계산한다.

 

출처: 의사결정나무(Decision Tree) · ratsgo's blog

        [데이터분석] 정보 이득(Information Gain) 이해하기(feat. 엔트로피) (tistory.com)

        

 

DecisionTreeClassifier / DecisionTreeRegressor

from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor

 

문제 1

당뇨병 발병 여부를 예측하기 위하여 의사결정나무를 사용하고자 한다. 이 때 혈당, 혈압, 임신 횟수를 기반으로 예측했을 때 예측 정확도는?

df = pd.read_csv("diabetes.csv")
from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, train_size = 0.8, random_state = 123)

model = DecisionTreeClassifier(random_state = 123).fit(X = df_train.loc[:, ["Glucose", "BloodPressure", "Pregnancies"]],
                                                       y = df_train["Outcome"])
pred = model.predict(df_test.loc[:, ["Glucose", "BloodPressure", "Pregnancies"]])

from sklearn.metrics import accuracy_score
accuracy_score(y_pred = pred, y_true = df_test["Outcome"])

 

문제 2

환자의 BMI를 예측하기 위하여 회귀나무를 사용하고자 한다. 이 때 혈당, 혈압, 피부 두께를 독립변수로 했을 경우 RMSE는 얼마인가?

df = pd.read_csv("diabetes.csv")
df_train, df_test = train_test_split(df, train_size = 0.8, random_state = 123)
model = DecisionTreeRegressor(random_state = 123).fit(X = df_train.loc[:, ["Glucose", "BloodPressure", "SkinThickness"]],
                                                       y = df_train["BMI"])
pred = model.predict(df_test.loc[:, ["Glucose", "BloodPressure", "SkinThickness"]])

mean_squared_error(y_pred = pred, y_true = df_test["BMI"]) ** 0.5

 

문제 3

분류나무의 파라미터를 바꿔가면서 성능 평가를 하려고 한다. 

당뇨 발병 여부를 종속변수로 하고 혈당, 혈압, 임신 횟수, BMI, 나이를 독립변수로 하고 Depth를 3에서 6까지 변화시킬 때 그 결과로 틀린 것은?

df = pd.read_csv("diabetes.csv")
df_train, df_test = train_test_split(df, train_size = 0.7, random_state = 345)

cols = ["Glucose", "BloodPressure", "Pregnancies", "BMI", "Age"]

depth_list = [3, 4, 5, 6]
accs = []
for depth in depth_list:
    model = DecisionTreeClassifier(max_depth = depth, random_state = 345)
    model.fit(X = df_train.loc[:, cols],
              y = df_train["Outcome"])
    pred = model.predict(df_test.loc[:, cols])
    accs = accs + [accuracy_score(y_pred = pred, 
                                  y_true = df_test["Outcome"])]

df_score = pd.DataFrame({"depth": depth_list,
                         "accs": accs})
df_score["accs"] = df_score["accs"].round(2)
df_score

 

 

전반적으로 문제는 지난 챕터와 똑같고 사용하는 모델만 달랐다.

마지막 문제의 반복문을 사용하는 쿼리는... 아직 더 보고 이해해야겠다.

뒤로 올수록 이론 강의의 양이 늘어나고 실습 강의의 양이 줄어들고 있다. 

앞의 통계 파트와 이론 파트를 열심히 공부해서 바탕을 만들어야겠다