Seongho Jang
Ch.18 의사결정나무 본문
의사결정나무 : 의사결정 규칙을 나무 구조로 도식화하여 관심대상이 되는 집단을 몇 개의 소집단으로 분류하거나 예측하는 계량적 분석 방법
Root Node: 모든 자료를 포함하는 의사결정 나무의 출발점
Leaf Node : 최종 결과를 나타내는 마디로 자료들은 더이상 나누어지지 않음
Depth: 뿌리 마디부터 끝 마디까지 중간 마디들의 수
분류 나무: 범주형 목표 변수를 기준으로 마디를 나눔
끝마디에 포함된 자료의 범주가 분류 결과값이 됨
회귀 나무: 연속형 목표 변수를 기준으로 마디를 나눔
끝마디에 포함된 자료의 평균값이 각 끝마디의 회귀값이 됨
의사결정 나무의 알고리즘 : 불순도를 감소시키는 방향으로 분리
= Information Gain이 증가하는 방향으로 분리
불순도 - 범주형 목표 변수 : Gini Reduction, Entropy Reduction, Chi-square test
연속형 목표 변수 : F-test, Reduction of Variance
Gini Impurity와 Entropy 모두 0에 가까울수록 분류가 잘 되어 있는 것이며,
Gini는 최대값이 0.5, Entropy는 최대값이 1이다.
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
전반적으로 문제는 지난 챕터와 똑같고 사용하는 모델만 달랐다.
마지막 문제의 반복문을 사용하는 쿼리는... 아직 더 보고 이해해야겠다.
뒤로 올수록 이론 강의의 양이 늘어나고 실습 강의의 양이 줄어들고 있다.
앞의 통계 파트와 이론 파트를 열심히 공부해서 바탕을 만들어야겠다
'Data Science Lv.2' 카테고리의 다른 글
Ch.8 데이터 전처리(2): 데이터 병합 (0) | 2023.01.08 |
---|---|
Ch.6 - 7 데이터 전처리(1): 결측치, 이상치, 파생변수 생성 (0) | 2023.01.06 |
Ch.17 KNN (0) | 2023.01.02 |
Ch.15 로지스틱 회귀분석 (0) | 2023.01.02 |
Ch.16 나이브 베이즈 분류 (0) | 2023.01.02 |