contents
summary
의사결정나무 이론
☑️ 의사결정나무(Decision Tree, DT)
의사결정규칙을 나무 구조로 나타내어 전체 자료를 몇 개의 소집단으로 분류하거나 예측을 수행하는 분석 방법입니다.
타이타닉의 예시
명칭
루트 노드(Root Node): 의사결정나무의 시작점. 최초의 분할조건
리프 노드(Leaf Node): 루트 노드로부터 파생된 중간 혹은 최종 노드
분류기준(criteria): sex는 여성인 경우 0, 남성인 경우 1로 인코딩. 여성인 경우 좌측 노드로, 남성인 경우 우측 노드로 분류
불순도(impurity)🙂
샘플(samples): 해당 노드의 샘플 개수(891개의 관측치)
값(value): Y변수에 대한 배열. 549명이 죽었고(Y = 0), 342명이 살았음(Y = 1)
클래스(class)
☑️ 의사결정나무 정리
sklearn.tree.DecisionTreeClassifier
sklearn.tree.DecisionTreeRegressor
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier,plot_tree
titaninc_df = pd.read_csv('train.csv')
titaninc_df.info()
['Pclass','Sex','Age','Fare','Embarked']
#Pclass: LabelEncoder
#Sex: LabelEncoder
#Age: 결측치-> 평균으로 대치하고
le = LabelEncoder()
titaninc_df['Sex'] = le.fit_transform(titaninc_df['Sex'])
le2 = LabelEncoder()
titaninc_df['Pclass'] = le2.fit_transform(titaninc_df['Pclass'])
age_mean = titaninc_df['Age'].mean()
titaninc_df['Age'] = titaninc_df['Age'].fillna(age_mean)
le3 = LabelEncoder()
titaninc_df['Embarked'] = titaninc_df['Embarked'].fillna('S')
titaninc_df['Embarked'] = le3.fit_transform(titaninc_df['Embarked'])
X = titaninc_df[X_features]
y = titaninc_df['Survived']
model_dt = DecisionTreeClassifier() #random_state=42로 고정가능; 결과 뽑을때마다 모양이 달라짐
model_dt.fit(X,y)
plt.figure(figsize = (10,5))
plot_tree(model_dt, feature_names=X_features, class_names=['Not Survived','Survived'], filled= True)
plt.show()
sklearn.ensemble.RandomForestClassifer
sklearn.ensemble.RandomForestRegressor
➕실습
# 로지스틱회귀, 의사결정나무, 랜덤포레스트
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score,f1_score
model_lor = LogisticRegression()
model_dt = DecisionTreeClassifier(random_state=42)
model_rf = RandomForestClassifier(random_state=42)
model_lor.fit(X,y)
model_dt.fit(X,y)
model_rf.fit(X,y)
y_lor_pred = model_lor.predict(X)
y_dt_pred = model_dt.predict(X)
y_rf_pred = model_rf.predict(X)
def get_score(model_name, y_true, y_pred):
acc = accuracy_score(y_true, y_pred).round(3)
f1 = f1_score(y_true,y_pred).round(3)
print(model_name, 'acc 스코어는: ',acc, 'f1_score는: ', f1)
get_score('lor',y,y_lor_pred)
get_score('dt ',y,y_dt_pred)
get_score('rf ',y,y_rf_pred)
lor acc 스코어는: 0.79 f1_score는: 0.723
dt acc 스코어는: 0.98 f1_score는: 0.973
rf acc 스코어는: 0.98 f1_score는: 0.973
X_features
['Pclass', 'Sex', 'Age', 'Fare', 'Embarked']
model_rf.feature_importances_
array([0.0991363 , 0.27159751, 0.28905477, 0.30707067, 0.03314074])
*어떤 변수가 더 중요한지에 대해 알려주는 수치.'Fare'가 가장 중요도가 높은 것으로 보인다.
이때 모델의 하이퍼 파라미터 변수를 바꾸면서 좋은 평가 지표가 나올 때까지 실험하고 원리를 밝혀내는 것이 바로 데이터 사이언스의 기반이고 과학이라는 단어가 붙은 이유.
☑️ 거리의 개념
📌2차원 그래프에서 두 점의 거리를 설정하는 것은 쉬워보인다. 바로 직선의 거리를 구하면 됨. 우리는 두 점의 좌표가 주어지면 피타고라스의 정리로 거리를 구할 수 있다. 어려운 말로 유클리드 거리(Euclidean Distance)라고 한다. 그 외에도 맨해튼 거리 등 다양한 거리의 계산 방법이 있다.
☑️ KNN 모델의 정리
sklearn.neighbors.KNeighborsClassifier
sklearn.neighbors.KNeighborsRegressor
sklearn.ensemble.GradientBoostingClassifier
sklearn.ensemble.GradientBoostingRegressor
xgboost.XGBRegressor
xgboost.XGBRegressor
lightgbm.LGBMClassifier
lightgbm.LGBMRegressor
➕실습
# !pip install xgboost
# !pip install lightgbm
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
model_knn = KNeighborsClassifier()
model_gbm = GradientBoostingClassifier(random_state= 42)
model_xgb = XGBClassifier(random_state= 42)
model_lgb = LGBMClassifier(random_state= 42)
model_knn.fit(X,y)
model_gbm.fit(X,y)
model_xgb.fit(X,y)
model_lgb.fit(X,y)
y_knn_pred = model_knn.predict(X)
y_gbm_pred = model_gbm.predict(X)
y_xgb_pred = model_xgb.predict(X)
y_lgb_pred = model_lgb.predict(X)
get_score('lor',y,y_lor_pred)
get_score('dt ',y,y_dt_pred)
get_score('rf ',y,y_rf_pred)
get_score('knn',y,y_knn_pred)
get_score('gbm ',y,y_gbm_pred)
get_score('xgb ',y,y_xgb_pred)
get_score('lgb ',y,y_lgb_pred)
lor acc 스코어는: 0.79 f1_score는: 0.723
dt acc 스코어는: 0.98 f1_score는: 0.973
rf acc 스코어는: 0.98 f1_score는: 0.973
knn acc 스코어는: 0.808 f1_score는: 0.732
gbm acc 스코어는: 0.889 f1_score는: 0.845
xgb acc 스코어는: 0.962 f1_score는: 0.949
lgb acc 스코어는: 0.945 f1_score는: 0.927
key points
지금 나온 점수들은 데이터의 크기가 크지 않고 변수를 많이 넣지 않기때문에 수치가 비교적으로 크지 않다. 더 큰 데이터나 더 많은 변수를 넣어보는것을 추천!
그리고 랜덤포레스트나 앙상블이라 사실 결과가 크게 차이가 나지않기 때문에 상황에 맞는 방법으로 진행하는 것이 중요하다.
각각의 방법에는 장점과 단점이 있으니 이론적 개념을 확실히 알아두고 어떤분석을 사용할지를 선택해야한다.