| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 게임 개발
- Replication
- CTF
- C++
- widget
- gameplay tag
- Aegis
- MAC
- listen server
- stride
- gameplay ability system
- attribute
- Unreal Engine
- 유니티
- rpc
- 언리얼엔진
- 보안
- 언리얼 엔진
- UI
- local prediction
- unity
- ability task
- animation
- 게임개발
- os
- Multiplay
- gameplay effect
- gas
- linear regression
- photon fusion2
- Today
- Total
Replicated
Classification / 결정 트리, SVM, XGBoost 본문
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 |