일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- plot_model
- 머신러닝
- 키워드 기반 뉴스 조회
- CIFAR-10
- CNN 실습
- 데이터
- pandas
- 인공지능
- CRISP-DM
- 데이터크롤링
- NewsWhale
- MaxPooling2D
- learning_rate
- AWS 입문자를 위한 강의
- bias
- 데이터분석
- 데이터처리
- Pooling Layer
- Convolution Neural Network
- fashion mnist
- 뉴스웨일
- CNN
- 모델평가
- AI
- 크롤링
- Neural Network
- OneHotEncoding
- explained AI
- 딥러닝
- kt에이블스쿨
- Today
- Total
jjinyeok 성장일지
머신 러닝 #3 - Decision Tree & SVM 2022/08/22~2022/08/29 본문
1. Decision Tree
Decision Tree (의사 결정 나무) 알고리즘은 특정 feature에 대한 의사 결정의 규칙(decision rule)을 통해 나무의 가지가 뻗는 형태로 분류해 나가는 분석 기법이다. 특히나 분석 과정이 직관적이고 이해하기 쉽고 계산 비용이 낮아 빠르게 데이터 연산이 가능하는 장점이 있으며 분석 과정을 실제 눈으로 관측할 수 있는 대표적인 화이트 박스 모델이다.
2. 분할 과정
target y를 기준으로 전체 데이터를 유사한 값을 가진 segment로 분할한다. 어떤 feature X가 target y에 중요한 정보를 담고 있는지를 찾아 그 feature X를 기준으로 segment로 분할하는 과정을 반복하며 트리를 만들어 나간다. 이때 feature X를 선택하는 기준은 어떤 feature가 얼마나 많은 정보를 제공하느냐를 나타내는 Information Gain(정보 증가량)이다.
Information Gain을 구하기 위해 불순도를 사용한다. 불순도란 분류 후 얼마나 잘 분류했는지를 평가하는 지표이다. 지니 계수(Gini Impurity)를 통해 불순도를 계산할 수 있다. 지니 계수의 식은 Gini = 1 - Σ(p)^2이다. p는 하나의 feature에 대한 분류의 성공과 실패 비율을 의미한다. feature X를 통해 다음과 같은 분류를 했다고 가정하자. 다음과 같은 분류에서 feature X(0, 1)을 기준으로 분류를 진행했을 때 target(Positive, Negative)는 다음과 같이 분류된다.
feature X = 0 | feature X = 1 | |
Positive | 5 | 2 |
Negative | 1 | 4 |
이때 feature X = 0으로 분류한 지니 계수는 1 - ((5/6)^2 + (1/6)^2) = 0.28...(5/18)이고 feature X = 1로 분류한 지니 계수는 1 - ((2/6)^2 + (4/6)^2) = 0.44...(4/9)이다. 이때 우리가 알고 싶은 것은 현재 상황에서 어떤 속성이 얼마나 많은 정보를 제공하는가이다. 부모의 불순도로부터 자식의 불순도를 뺀 값이 Information Gain이다.
따라서 X뿐만 아니라 다른 feature들의 불순도를 계산하여 부모의 불순도에서 빼 Information Gain을 구하는 과정을 반복한다. 가장 높은 Information Gain 값을 가지는 feature를 기준으로 자식 노드들을 생성하는 과정을 반복해 Decision Tree를 구성한다. 이때 Decision Tree는 어느 조건에 대해 자식 노드들을 생성하므로 True와 False로 나누어지는 Binary Tree (이진 트리)임에 유의하자.
어떤 데이터 행의 House feature가 400,000이고 Income이 60,000이고 Overage가 130인 경우에 위와 같은 Decision Tree를 통해 예측한 결과는 Stay일 것이다. House feature가 600,000보다 작기 때문에 우측 자식 노드로 이동하고 Overage가 120보다 크기 때문에 좌측 자식 노드로 이동하고 이 노드는 Stay를 가리키기 때문이다.
3. Decision Tree 구현하기
'데이터: 직원 이직 여부 데이터'
'1. 모델 불러오기'
from sklearn.tree import DecisionTreeClassifier
'2. 모델 선언'
dt_model = DecisionTreeClassifier()
'3. 모델 학습'
dt_model.fit(X_train, y_train)
'4. 예측'
pred = dt_model.predict(X_val)
'5. 검증'
print(confusion_matrix(y_val, pred))
# [[262 38]
# [ 38 21]]
print(classification_report(y_val, pred))
# precision recall f1-score support
# 0 0.87 0.87 0.87 300
# 1 0.36 0.36 0.36 59
# accuracy 0.79 359
# macro avg 0.61 0.61 0.61 359
# weighted avg 0.79 0.79 0.79 359
4. Decision Tree : Hyperparameter
Decision Tree 모델은 트리의 크기(Max Depth)에 따라 예측 결과가 달라진다. 트리의 크기를 조정하기 위해 크기의 최대 크기를 지정하는 max_depth라는 Hyperparameter와 leaf 노드의 최소 데이터 건수를 지정하는 min_samples_leaf라는 Hyperparameter를 이용하여 성능을 조절할 수 있다. 당연히 max_depth가 크다면 노드의 개수가 늘어나고 min_samples_leaf가 줄어든다면 노드의 개수가 늘어난다. 노드의 개수가 늘어나면 모델이 복잡해진다. 모델이 복잡해진다면 overfitting(과적합)이 발생할 수 있다. 따라서 적정한 값으로 Hyperparameter 값을 조정하는 과정은 필수적이고 튜닝이 필요하다. 튜닝 방법과 overfitting 해결 방법은 다음 게시글에 정리하도록 하겠다.
5. Decision Tree 모델 시각화하기
'시각화'
from sklearn.tree import plot_tree
plot_tree(dt_model, #모델
feature_names = list(x_train), #Feature 이름, list(x_train)
class_names = ['Stay', 'Leave'] , #Target(Class) 이름
filled=True) # 색상
6. Support Vector Machine (SVM)
알고리즘을 잘 알고 알고리즘을 이용해서 좋은 모델을 만드는 것도 좋지만 알고리즘을 어느정도 이해하고 알고리즘에 대한 기존의 모델링 작업을 통해 비즈니스 문제를 해결하는 것 역시 중요하다. 따라서 에이블스쿨 머신러닝 강의에서는 SVM(Support Vector Machine)에 대한 자세한 수식보다는 전반적인 개괄과 구현에 더 초점을 맞추셨고 나 또한 그렇게 정리하고자 한다.
먼저 용어 정리가 필요하다. Classification 문제를 기준으로 정리하겠다. 먼저 우리는 class를 구분하는 경계선으로 Decision Boundary(결정 경계)를 사용한다. SVM을 통해 구하려는 모델이 바로 Decision Boundary이다. SVM에서 각각의 데이터들은 Vector(벡터)라고 불린다. Vector 중 결정 경계와 가까운 데이터를 Support Vector(서포트 벡터)라고 부른다. Support Vector는 Margin과 Decision Boundary에 영향을 끼친다. Margin(마진)이란 Support Vector와 Decision Boundary 사이의 폭을 의미한다. Margin이 가장 높은 Decision Boundary를 뚫는 것이 SVM의 목표이며 Margin이 클수록 새로운 데이터에 대해 안정적 분류가 가능하나 작다면 성능 자체가 낮을 수 있다는 문제가 있다.
7. Margin과 오류
Margin이 작다면 학습 과정에서 오차를 허용하지 않고 완벽히 분류하는 것이 가능하다. 그러나 테스트 과정에서 Margin이 좁다는 것은 feature가 조금만 벗어나도 잘못 분류될 가능성이 높아짐을 의미한다. 반대로 Margin이 넓다면 오류를 허용할 가능성이 높아진다. 그러나 기존 데이터에서 조금 벗어나더라도 안정적인 분류가 가능하게 된다. 즉 Margin의 크기와 오류에 대한 허용 정도는 Trade Off 관계이다. SVM 최적화의 목적은 Margin은 가능한 넓게 잡으면서도 오류는 가능한 적게 내는 것이다. 이때 우리는 C(비용) Hyperparameter를 사용하여 모델을 최적화할 수 있다.
8. 커널트릭
SVM은 직선 혹은 평면으로 Decision Boundary를 삼아 데이터를 분류하는 선형 Classifier이다. 그러나 현실에서 선형적으로 분류할 수 없는 데이터셋이 더 많다. 따라서 직선 혹은 평면으로 분류하게 된다면 오차는 더욱 커지게 된다. 이때 Kernel Trick(커널 트릭)을 사용해 비선형 데이터 문제를 해결한다. Kernel Trick의 과정을 그림으로 나타내면 다음과 같다.
kernel trick은 여러 종류가 존재하며 kernel이라는 Hyperparameter를 사용해 조절이 가능하다. kernel Hyperparmeter에 poly 값을 통해 다항식을 사용해 데이터를 변형시키는 방법, rbf를 통해 정규분포를 사용하여 데이터를 변환하는 방법, sigmoid 값을 통해 sigmoid 함수를 사용하여 데이터를 변형시키는 방법 등 여러가지가 있지만 kernel Hyperparameter의 default 값은 rbf이며 실무에서도 rbf를 가장 많이 사용한다고 하니 유의하자.
9. Support Vector Machine 구현하기
'데이터: 타이타닉 생존 여부 데이터'
# Scaling : SVM은 Scaling 과정 필요
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_s = scaler.fit_transform(X_train)
X_val_s = scaler.transform(X_val)
'1. 모델 불러오기'
from sklearn.svm import SVC
'2. 모델 선언'
svm_model = SVC()
'3. 모델 학습'
svm_model.fit(X_train_s, y_train)
'4. 예측'
pred = svm_model.predict(X_val_s)
'5. 검증'
print(confusion_matrix(y_val, pred))
# [[436 295]
# [204 565]]
print(classification_report(y_val, pred))
# precision recall f1-score support
# LEAVE 0.68 0.60 0.64 731
# STAY 0.66 0.73 0.69 769
# accuracy 0.67 1500
# macro avg 0.67 0.67 0.66 1500
# weighted avg 0.67 0.67 0.67 1500
10. Support Vector Machine : Hyperparameter & Scaling
SVM 모델은 C와 gamma Hyperparameter를 활용해 모델의 성능을 조절할 수 있다. 먼저 C 값은 비용을 의미하는 Hyperparameter로 오류에 대한 허용 정도를 의미한다. 즉 C 값을 높이면 오류를 허용하지 않으려는 비용이 증가되어 Margin의 크기가 줄어들고 C 값을 낮추면 오류를 허용하지 않으려는 비용이 감소되어 Margin의 크기가 작아진다. 두번째로 gamma는 곡률(반경)의 크기를 의미한다. gamma가 클수록 곡률 반경이 작아져 모델이 복잡해진다. 즉 C와 gamma 모두 클수록 모델이 복잡해져 Overfitting의 가능성이 있고 모두 작다면 모델이 단순해져 Underfitting의 가능성이 있으므로 C와 gamma Hyperparameter를 잘 조절해 성능이 좋은 모델을 만들어야 한다.
또한 SVM 모델은 거리를 기반으로 Decision Boundary를 만드는 모델이다. 따라서 KNN과 마찬가지로 모든 feature에 대한 스케일링이 필요하다.
'[KT AIVLE School]' 카테고리의 다른 글
머신 러닝 #5 - Ensemble 기법 2022/08/22~2022/08/29 (0) | 2022.09.12 |
---|---|
머신 러닝 #4 - 성능 튜닝 2022/08/22~2022/08/29 (0) | 2022.09.11 |
머신 러닝 #2 - KNN & Logistic Regression 2022/08/22~2022/08/29 (0) | 2022.08.29 |
머신러닝 #1 - 모델링 개요 & Linear Regression 2022/08/22~2022/08/29 (0) | 2022.08.22 |
데이터 분석 및 의미 찾기 #3 - 이변량 데이터 분석하기 2022/08/10~2022/08/12 (0) | 2022.08.20 |