의사결정나무 (Decision Tree, DT)
- 의사결정규칙을 나무 구조로 나타내어, 전체 자료를 n개의 소집단으로 분류하거나 예측을 수행하는 분석 방법
1. 루트노드 root node : DT 시작점, 1차 분류조건
2. 리프노드 leaf node : 루트로부터 파생된 노드
3. 분류기준 criteria : 루트노드에서의 분류조건, 아래 예시에서는 여성0 남성1로 인코딩 후 0.5 기준으로 분류
4. 불순도 impurity : gini 계수로 측정 (0-1), 낮을수록 분류가 잘 된 것, 리프로 갈수록 낮아짐.
0 = 완벽한 순도 = 모든 샘플이 하나의 클래스
1 = 완벽한 불순도 = 노드 샘플이 균등하게 분포됨.
5. 샘플 samples : 해당 노드의 샘플 개수
6. 값 values : Y변수에 대한 배열, 아래 예시에서는 사망(0) 549, 생존(1) 342
7. 클래스 class : 가장 많은 샘플을 차지하는 클래스
타이타닉 성별 기준의 Decision Tree
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier, plot_tree
# 데이터 전처리
X_features = ['Pclass','Sex','Age','Fare','Embarked']
# Pclass: LabelEncoder
# Sex: LabelEncoder
# Age: 결측치 평균으로 대치
le = LabelEncoder()
titanic_df['Sex'] = le.fit_transform(titanic_df['Sex'])
le2 = LabelEncoder()
titanic_df['Pclass'] = le2.fit_transform(titanic_df['Pclass'])
age_mean = titanic_df['Age'].mean()
titanic_df['Age'] = titanic_df['Age'].fillna(age_mean)
le3 = LabelEncoder()
titanic_df['Embarked'] = titanic_df['Embarked'].fillna('S')
titanic_df['Embarked'] = le3.fit_transform(titanic_df['Embarked'])
X = titanic_df[X_features]
y = titanic_df['Survived']
# 의사결정나무
model_dt = DecisionTreeClassifier(max_depth=1) # 리프노드 1개만 생성
model_dt = DecisionTreeClassifier(random_state=42) # 랜덤하게 생성
model_dt.fit(X,y)
plt.figure(figsize=(10,7))
plot_tree(model_dt, feature_names=X_features, class_names=('Not Survived', 'Survived'), filled=True) plt.show()
max_depth를 정해주지 않으면 끊임 없이 자람. 아래 그림 예시
랜덤포레스트 Random Forest
DT의 과적합과 불안정성 문제를 해결하기 위해 만들어진 분류법으로 나무 여러 개로 숲을 만든 것
DT의 장점은 수용하고 단점은 보완했기 때문에 성능이 뛰어나고 자주 쓰임
장점
- Bagging* 과정으로 과적합 피함
- 이상치에 견고하며, 데이터 스케일링이 불필요하다.
- 변수 중요도 추출이 가능해 모델 해석에 중요한 특징 파악 가능하다.
단점
- 컴퓨터 리소스 비용 큼
- 앙상블 작용으로 해석이 어려움
라이브러리
- sklearn.ensemble.RandomForestClassifer
- sklearn.ensemble.RandomForestRegressor
데이터 샘플은 배깅(Bagging)의 원리로 생성됨.
원래 데이터에서 무작위로 뽑아서 새로운 군집을 만든다고 보면됨.
로지스틱회귀 vs 의사결정나무 vs 랜덤포레스트
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)
f1 = f1_score(y_true, y_pred)
print(model_name, 'acc_score:', 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)
print(X_features)
model_rf.feature_importances_
최근접 이웃 K-Nearest Neighbor (KNN)
주변데이터에 대해 거리 기준으로 가장 많은 데이터가 알고 싶은 데이터라고 예측하는 방법
장점
- 이해하기 쉽고 직관적이다
- 모집단의 가정이나 형태를 고려하지 않음
- 회귀/분류 모두 적용 가능
단점
- 차원 수가 많을수록 계산량 많아짐
- 거리 기반 알고리즘이어서(단위 영향 많이 받음) 피처의 표준화 필수
라이브러리
- sklearn.neighbors.KNeighborsClassifier
- sklearn.neighbors.KMNeighborsRegressor
파라미터란 ?
머신러닝 모델이 학습 과정에서 추천하는 내부 변수, 자동으로 결정되는 값 (ex: 선형회귀에서 가중치, 편향)
하이퍼 파라미터란?
데이터 사이언티스트가 기계학습 모델 훈련을 관리하는데 사용하는 외부 구성변수로 모델 학습과정이나 구조에 영향을 미침.
하이퍼 파라미터 변수를 바꾸면서 좋은 평가가 나올때까지 실험하고 그 원리를 밝혀내는 것이 데이터 사이언스의 기반
부스팅 알고리즘
여러 개의 약한 학습기 weak learner를 순차적으로 학습하면서 잘못 예측한 데이터에 가중치를 부여해 오류를 개선하는 분석법
아래 사진의 경우 1개의 선(learner)로 구별되지 않는 경우가 있기 때문에 여러 learner를 합친 ensemble을 통해 성능을 올리는 방법.
전체 모델링 비교
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_xbg = XGBClassifier(random_state=42)
model_lgb = LGBMClassifier(random_state=42)
model_knn.fit(X,y)
model_gbm.fit(X,y)
model_xbg.fit(X,y)
model_lgb.fit(X,y)
y_knn_pred = model_knn.predict(X)
y_gbm_pred = model_gbm.predict(X)
y_xbg_pred = model_xbg.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_lor_pred) # 스케일링 안해서 낮게 나옴
get_score('gbm',y,y_dt_pred)
get_score('xbg',y,y_rf_pred) # 부스팅모델은 데이터가 너무 작아서 과적합 일어날 수 있음 get_score('lgb',y,y_rf_pred)
'TIL > 머신러닝' 카테고리의 다른 글
머신러닝| 딥러닝 (0) | 2024.08.22 |
---|---|
비지도학습 K-Means Clustering 군집화 (0) | 2024.08.20 |
데이터분석 예측 모델링 실습 (0) | 2024.08.19 |
데이터 프로세스 : 데이터 전처리, EDA (0) | 2024.08.16 |
머신러닝 - 다중 로지스틱회귀 실습 (0) | 2024.08.13 |