학습 목표
- 선형회귀와 로지스틱 회귀 외에 자주 쓰는 알고리즘 학습
의사결정나무 이론
의사결정나무(Decision Tree)
- 의사결정규칙을 나무 구조로 나타내어 전체 자료를 몇 개의 소집단으로 분류하거나 예측을 수행하는 분석 방법
- 명칭
- 루트 노드: 시작점, 최초의 분할조건
- 리프 노드: 중간 혹은 최종 노드
- 분류 기준(criteria)
- 불순도 (impurity): 불순도 측정 방법 중 하나인 지니 계수는 0과 1사이 값으로 0이 완벽한 순도(샘플이 하나의 클래스로 구성), 1은 완전한 불순도(샘플에 각 클래스가 균등하게 분포)
- 리프노드로 갈수록 불순도가 작아지는 방향으로 나무가 자람
- 샘플: 해당 노드의 샘플 개수
- 클래스: 가장 많은 샘플 차지하는 클래스를 표현
- 장점
- 쉽고 해석하기 용이
- 다중분류와 회귀에 모두 적용 가능
- 이상치게 견고하며 데이터 스케일링이 불필요
- 단점
- 나무가 성장을 너무 많이하면 과적합 발생 가능성 존재
- 훈련데이터에 민감하게 반응하여 작은 변화 또는 노이즈에도 나무의 구조가 크게 달라짐
- 라이브러리
- sklearn.tree.DecisionTreeClassifier
- sklearn.tree.DecisionTreeRegressor
간단한 실습
- 성장을 너무 많이하면 과적합 발생 가능성 존재 ➡️ max_depth로 최대 깊이 지정
- 실행마다 결과가 달라지는 불안정성이 존재 ➡️ random_state = 42로 값 고정
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier, plot_tree
X_feature = ['pclass', 'sex', 'age']
# pclass: LabelEncoder
# sex: LabelEncoder
# age: 결측치 => 평균
le = LabelEncoder()
df['sex'] = le.fit_transform(df['sex'])
le2 = LabelEncoder()
df['pclass'] = le2.fit_transform(df['pclass'])
age_mean = df['age'].mean()
df['age'] = df['age'].fillna(age_mean)
X = df[X_feature]
y = df['survived']
# 과적합 방지위해 깊이 제한
model_dt = DecisionTreeClassifier(max_depth=3, random_state=42)
model_dt.fit(X, y)
plt.figure(figsize=(10,5))
plot_tree(model_dt, feature_names=X_feature, class_names=['Not Survived', 'Survived'], filled=True)
plt.show()
랜덤 포레스트 이론
랜덤 포레스트
- 의사결정 나무는 과적합과 불안정성에 대한 문제가 대두
- 이를 해결하기 위해 나무를 여러 개 만들어 숲을 만드는 아이디어
배깅(Bagging)의 원리
- 언제나 머신러닝은 데이터 부족이 문제
- 이를 해결하기 위한 Bootstrapping + Aggregating 방법론
- Bootstrapping: 데이터를 복원 추출해서 유사하지만 다른 데이터 집단을 생성
- Aggregation: 데이터의 예측, 분류 결과를 합치는 것
- Ensemble: 여러 개의 모델을 만들어 결과를 합치는 것
Tree를 Forest로 만들기
- 여러 개의 데이터 샘플에서 각자 의사결정트리를 만들어 다수결 법칙에 따라 결론을 냄
- 이로써 의사결정모델이 훈련 데이터에 민간한 점을 극복
랜덤 포레스트 정리
- 장점
- Bagging 과정을 통해 과적합을 피할 수 있음
- 이상치에 견고하며 데이터 스케일링이 불필요
- 변수 중요도를 추출하여 모델 해석에 중요한 특징 파악 가능
- 단점
- 컴퓨터 리소스 비용이 큼
- 앙상블 적용으로 해석이 어려움
- Python 패키지
- sklearn.ensemble.RandomForestClassifier
- 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)
f1 = f1_score(y_true, y_pred)
print(f"{model_name} acc 스코어: {acc:.3f} f1 스코어: {f1:.3f}")
get_score('lor', y, y_lor_pred)
get_score('dt', y, y_dt_pred)
get_score('rf', y, y_rf_pred)
랜덤 포레스트는 각 변수의 중요 확인 가능
최근접 이웃
최근접 이웃 알고리즘
- K-Nearest Neighbor(KNN)이란 주변의 데이터를 보고 내가 알고 싶은 데이터를 예측하는 방식
- 주변 데이터 K개를 선정 후에 거리 기준으로 가장 많은 것으로 예측하는 것이 KNN의 원리
- 그렇다면 K를 정하는 기준과 거리는 어떻게 측정할까
하이퍼 파라미터 개념
- 파라미터: 머신러닝 모델이 학습 과정에서 추정하는 내부 변수이며 자동으로 결정되는 값
- 하이퍼 파라미터: 사람이 기계 학습 모델 훈련을 관리하는데 사용하는 외부 구성변수이며 모델 학습과정이나 구조에 영향을 미침
- 모델의 하이퍼 파라미터를 바꾸면서 좋은 평가 지표가 나올 때까지 실행하고 원리를 밝혀내는 것이 데이터 사이언스의 기반
거리의 개념
- 유클리드 거리 공식
- 피타고라스
- 표준화가 필수
- 거리 기반의 알고리즘이기 때문에 단위의 영향을 크게 받음
- 따라서 피처에 대한 표준화가 반드시 수반되어야 함
KNN 모델 정리
- 장점
- 이해하기 쉽고 직관적
- 모집단의 가정이나 형태를 고려하지 않음
- 회귀, 분류 모두 가능
- 단점
- 차원 수가 많을 수록 계산량이 증가
- 피처의 표준화가 필요
- Python 라이브러리
- sklearn.neighbors.KNeighborsClassifier
- sklearn.neighbors.KNeighborsRegressor
부스팅 알고리즘
부스팅 알고리즘 수행 방법
- 여러 개의 약한 학습기를 순차적으로 학습하면서 잘못 예측한 데이터에 가중치를 부여하여 오류를 개선해나가는 방식
부스팅 알고리즘 종류
- Gradient Boosting Model
- 특징
- 가중치 업데이트를 경사하강법을 통해 진행
- Python 라이브러리
- sklearn.ensemble.GradientBoostingClassifier
- sklearn.ensemble.GradientBoostingRegressor
- 특징
- XGBoost
- 특징
- 트리 기반 앙상블 기법, 가장 각광받으며 Kaggle의 상위 알고리즘
- 병렬학습이 가능해 속도가 빠름
- Python 라이브러리
- xgboost.XGBClassifier
- xgboost.XGBRegressor
- 특징
- LightGBM
- 특징
- XGBoost와 함께 가장 각광받는 알고리즘
- XGBoost보다 학습시간이 짧고 메모리 사용량이 작음
- 작은 데이터(10000 이하)의 경우 과적합 발생
- Python 라이브러리
- lightgbm.LGBMClassifier
- lightgbm.LGBMRegressor
- 특징
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('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)
성능을 더 올리고 싶다면 X에 변수를 추가
'AI > 머신러닝' 카테고리의 다른 글
시계열 다루기 1일차 (0) | 2025.02.26 |
---|---|
머신러닝의 이해와 라이브러리 활용 심화 3주차(군집화, RFM) (0) | 2025.02.14 |
머신러닝의 이해와 라이브러리 활용 심화 1주차(EDA, 전처리, 인코딩, 스케일링, 데이터분리, 교차검증, GridSearch) (0) | 2025.02.13 |
수업[2.4](군집, DBSCAN, PCA) (0) | 2025.02.04 |
수업[2.3](데이터프레임, 데이터분포, 하이퍼파라미터, 교차검증, 군집화) (0) | 2025.02.03 |