Replicated

Classification / 결정 트리, SVM, XGBoost 본문

학부/딥러닝

Classification / 결정 트리, SVM, XGBoost

라구넹 2025. 10. 13. 01:38

Decision Tree

- 큰 문제를 작은 문제들의 조각으로 나누어 해결하는 기법

- 인간의 의사결정 과정과 유사

- 의사 결정 또는 예측 결과의 근거가 명확히 제시되어야 하는 경우 많이 이용됨

 

피쳐 가지고 조건 건다고 생각하면 됨

 

Decision Tree에서 고려할 점

1. 트리의 노드를 선택할 때 데이터셋에서 어떤 속성부터 선택할 것인가

- 루트 노드에 어떤 속성이..?

- Feature evaluation 필요 (불순도(impurity))

2. 트리를 split 할 때 언제 중단할 것인가

- 계속 뻗어나가면 모든 인스턴스 100% 식별 .. -> 과적합

- 가지치기(puning) 필요

 

장점

- 모든 문제에 적합

- 결측치, 범주형 속성, 수치 속성을 처리하기에 용이

- 여러 속성 중 중요한 속성들만을 사용하여 예측

- 매우 많은 수 또는 상대적으로 적은 훈련 데이터로도 모델 구축 가능

- 수학적 배경이 없어도 해석 가능

- 단순한 이론적 근거에 비해 높은 효율성

 

단점

- 모델이 쉽게 과대적합, 과소적합화

- 축에 평행한 구분선을 사용해서 일부 관계를 모델화하는데 문제가 있음

- 훈련 데이터에 대한 약간의 변경이 결정 논리에 큰 변화

- 큰 트리는 이해하기 어렵고 직관적이지 않음

 

진보된 결정 트리 알고리즘

- ID3 (Iterative Dichtomiser 3)

- C4.5

- C5.0

- CART (Classification And Regression Tree)

- CHAID (CHI-squared Automatic Interaction Detector), 이 알고리즘은 분류 트리를 계산할 때 다단계 분할을 수행

- MARS (Multivariate Adaptive Regression Splines), 더 많은 수치 데이터를 처리하기 위해 결정 트리 사용

- 조건부 추론 트리 (Conditional Inference Trees)

    - 과적합을 피하기 위해 여러 테스트에 대해 보정 분할 기준으로 비 파라미터 테스트를 사용하는 통계 기반의 방법

    - 편견 예측 선택 결과와 가지치기가 필요하지 않음

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import pandas as pd

df = pd.read_csv('/content/gdrive/MyDrive/Data/liver.csv')
print(df.head())
print(df.columns) # column names
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

train_X, test_X, train_y, test_y = train_test_split(df_X, df_y, test_size=0.3, random_state=1234)
model = DecisionTreeClassifier(random_state=1234)
model.fit(train_X, train_y)

print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))

사용 예시

결과를 보면 과적합이다

 

pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

혼동 행렬

(실제값이 행, 예측값이 열임)

 

model = DecisionTreeClassifier(max_depth=4, random_state=1234)
model.fit(train_X, train_y)

print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))

트리 뎁스 줄이기

 

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plot_tree(model,
fontsize=8,
feature_names=df_X.columns.to_list(),
class_names=True)

plt.show()

이렇게 그릴 수도 있음

 

* Decision Tree의 하이퍼 파라미터

criterion

- 가지를 분리할 때 어떤 기준으로 정보 획득량을 계산하고 가지를 분리할 것인지 정하는 파라미터

- gini : entropy보다 연산 속도는 빠르지만 한 쪽으로 편향된 결과를 낼 수 있고, 기본값임

- entropy: gini에 비해 조금 더 균형잡힌 모델

 

max_depth

- 최대 깊이 제한, 기본 값이 None이며 None일 때는 모든 잎이 min_sample_split보다 작거나 불순도가 0일 때까지 확장됨

- 사전 가지치기, 과적합 방지

 

min_samples_split

- 노드에서 가지를 분리할 때 필요한 최소 샘플 개수 제한, 주어진 값의 타입에 따라 다른 기능

- int: 주어진 값 그대로 사용

- float: 0~1 사이의 값을 줄 수 있으며, ceil(전체 데이터 수 * min_sample_split)의 값을 사용

 

min_samples_leaf

- 한 노드에서 가지고 있어야 할 최소 sample 개수 제한, 주어진 값의 타입에 따라 다른 기능

- int: 주어진 값 그대로 사용

- float: 0~1 사이의 값을 줄 수 있으며, ceil(전체 데이터 수 * min_samples_leaf)의 값을 사용

 

max_features

- Decision Tree Model을 만들 때 사용할 수 있는 변수 개수 제한

- int: 주어진 값 그대로 사용

- float: int( max_features * 총 변수 개수 )

- sqrt일 경우, sqrt(변수의 개수)를 사용

- log2일 경우, log2(변수의개수)를 사용

- None일 경우, 총 변수 개수를 사용

 

class_weight

- 클래스에 가중치 부여 가능, dict, list of dict, 또는 "balanced" 형태

- {class_label: weight}

- None인 경우 모든 클래스의 가중치는 1

- 다중 출력 문제의 경우, y의 각 열 순서에 맞게 딕셔너리의 리스트 형태로 제공 가능


 

SVM (Support Vector Machine)

- 분류 알고리즘 중 하나

- 오리지널은 클래스 2개 짜리에만 쓸 수 있는데, 멀티 클래스로 확장됨

- 선형 분류기

1. 마진을 최대화하는, 클래스 사이의 경계를 가장 잘 나누는 하이퍼 플래인을 찾는다
2. 데이터가 선형적으로 나눠지지 않으면, 상위 공간으로 이동 (커널 함수)

 

SVM의 분류함수는..

f(x) = sgn(wx + b)

w: 가중치 벡터

b: 편향

이 두 값은 학습 과정에서 최적화되고, f(x)의 부호에 따라 클래스가 결정됨

 

서포트 벡터(Support Vectors)

- 하이퍼 플래인과 가장 가까이 위치한 샘플

- 결정 경계(마진)을 정의하는데 직접적으로 영향

- 최적화 문제: 놈(norm)과 w의 손실은 허용 오차(soft margin) 내에서 올바른 분류에 의해 최소화됨

 

 

C-Support Vector Classification

- sklearn.svm.SVC

- 가장 일반적인 SVM 분류기로, C는 오차 허용 정도를 조절하는 하이퍼 파라미터

- C가 크면 오차를 거의 허용하지 않고

- C가 작으면 약간의 오차를 허용

- libsvm 기반으로 구현되어 있는데, 느림

- 데이터 셋이 크면 sklearn.svm.LinearSVC, sklearn.linear_model.SGDClassifier 를 이용. 필요하면 sklearn.kernel_approximation.Nystroem transformer로 커널 효과를 근사할 수도 있음

 

from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import pandas as pd
import pydot

df = pd.read_csv('/content/gdrive/MyDrive/Data/liver.csv')
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

train_X, test_X, train_y, test_y = train_test_split(df_X, df_y, test_size=0.3, random_state=1234) 

model = svm.SVC()
model.fit(train_X, train_y)

print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))

pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import pandas as pd
import pydot

df = pd.read_csv('/content/gdrive/MyDrive/Data/liver.csv')
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

train_X, test_X, train_y, test_y = train_test_split(df_X, df_y, test_size=0.3, random_state=1234) 

model = svm.SVC(kernel='poly')
model.fit(train_X, train_y)

print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))

pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

kernel..

 

하이퍼파라미터

C

- 정규화 파라미터, L2 제곱 페널티 사용

- 크면 훈련 데이터에 더 잘 맞추려 하고

- 작으면 더 단순한 모델

 

kernel

- 데이터를 고차원으로 변환하는 함수

- linear : 선형 커널

- poly : 다항식 커널

- rbf : 가우시안 RBF, 기본값이고 가장 많이 사용됨

- sigmoid : 시그모이드 커널

- precomputed : 미리 계산된 커널 행렬을 직접 제공

 

degree

- poly 커널 사용 시 차수 지정, 다른 커널에선 무시됨

 

gamma

- 커널의 곡률 조절, scale, auto 또는 float, 기본값은 scale

- rbf, poly, sigmoid 커널에서만 사용

- scale : γ = 1 / (n_features × X.var())  -> 데이터 분산 고려

- auto : γ = 1 / n_features

- gamma가 크면 결정 경계가 더 복잡 -> 과대적합 위험

- gamma가 작으면 결정 경계가 더 단순 -> 과소적합 위험

 

SVM 장점

- 범주나 수치데이터 모두에 사용 가능

- 노이즈 데이터에 영향을 크게 받지 않고, 과대적합이 잘 일어나지 않음

- 높은 정확도

 

SVM 단점

- 최적의 모델을 찾기 위해 커널과 기타 하이퍼 파라미터 여러 조합 테스트해봐야 함

- 입력 데이터셋이 피쳐랑 샘플이 많으면 훈련 시간이 많이 소요될 수 있음

- 모델의 해석이 불가능하진 않아도 어려움


 

xgboost

- 앙상블의 Boosting 방법

- 고성능, 유연성, 이식성

- 최적화된 분산형(병렬처리) 그래디언트 부스팅 라이브러리

- 병렬 트리 부스팅 제공 (GBDT, GBM)

- sklearn 제공 안함

 

pip install xgboost 해서 설치

 

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

df = pd.read_csv('/content/gdrive/MyDrive/Data/liver.csv')
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

train_X, test_X, train_y, test_y = train_test_split(df_X, df_y, test_size=0.3, random_state=1234)

D_train = xgb.DMatrix(train_X, label=train_y)
D_test = xgb.DMatrix(test_X, label=test_y)

param = {
'eta': 0.2,
'max_depth': 3,
'objective': 'binary:logistic',
'eval_metric': 'error'}
steps = 20 # The number of training iterations
model = xgb.train(param, D_train, steps)
pred = model.predict(D_test)
round_preds = np.round(pred) # real -> [0,1]
accuracy_score(test_y, round_preds)

하이퍼 파라미터

eta: 학습률, 일반적으로 0.01~0.2

max_depth: 트리 깊이 수

objective: 목적 함수 종류

- reg:squarederror ( regression with squared loss )

- reg:squaredlogerror

- binary:logistic (이진분류, 결과가 확률로 나옴)

- multi:softmax (다중 분류)

- multi:softprob (다중 확률)

eval_metric: 평가 지표

- rmse (root mean square error)

- mae (mean absolute error)

- logloss (negative log-likelihood)

- error (이진 분류 에러율, 0.5 스레스홀드)

- merror (멀티클래스 분류 에러율)

- auc (Area under the curve)

seed

'학부 > 딥러닝' 카테고리의 다른 글

인공신경망 개요  (0) 2025.10.18
Feature Selection, Model Stacking  (0) 2025.10.18
Classification / 앙상블, 하이퍼 파라미터 튜닝, K-fold CV, 성능 평가  (0) 2025.10.13
Regression  (0) 2025.10.12
머신 러닝 개념  (0) 2025.10.12