검증
검증 결과
- Generalization : 일반화
- 모델이 새로운 데이터셋(Test set)에 대하여 정확히 예측
- Train set과 Test set의 결과 유사
- Overfitting : 과대적합
- Train set에 평가 좋지만 Test set에 대한 일반성 떨어지는 상태
- 데이터 양에 비해서 모델이 너무 복잡한 경우
- 데이터의 양을 늘리기에는 현실적으로 역부족
- 모델을 조금 더 단순하게 만들어 개선
- Underfitting : 과소적합
- Train set과 Test set 모두에서 성능이 좋지 않은 상태
- 데이터 양에 비해서 모델이 너무 단순해 충분히 학습하지 못한 경우
- 좀 더 복잡한 모델 사용해 개선
- 복잡하게 만들 수 없다면 새로 만들어야 한다
검증 변수
- Hyper Parameter
- 모델의 성능에 영향을 끼치는 파라미터 값으로 모델 생성시 사람이 직접 지정해 주는 값
- Parameter
Hyper Parameter Tunning
- 모델의 성능을 높일 수 있는 Hyper Parameter를 찾는 작업
- 시도해볼 하이퍼파라미터들을 지정하면 모든 조합에 대해 교차검증 후 제일 좋은 성능을 내는 하이퍼파라미터 조합을 찾아준다
- 적은 수의 조합의 경우는 괜찮지만 시도할 하이퍼파라미터와 값들이 많아지면 너무 많은 시간이 걸린다
- 종류
- Grid Search
- 시도해볼 하이퍼파라미터들을 지정하면 모든 조합에 대해 교차검증 후 제일 좋은 성능을 내는 하이퍼파라미터 조합을 찾아준다
- 적은 수의 조합의 경우는 괜찮지만 시도할 하이퍼파라미터와 값들이 많아지면 너무 많은 시간이 걸린다
- Random Search
- GridSeach와 동일한 방식으로 사용
- Grid Search 전체 조합 중에서 정한 갯수만큼을 random하게 선택
- 약 60회로 Grid Search와 비슷하게 도출 가능
Decision Tree
Decision Tree?
- 계속해서 데이터를 추론하며 결과를 분기해 나가는 알고리즘
- 하위 노드는 YES/NO로 두 개로 분기 된다
- 순도(purity)/불순도(impurity)
- 데이터가 섞인 정도를 타나내며 순도가 높을수록 한 가지의 class로 값이 많다
- 과대 적합 발생하기 쉽다
- 불순도가 0이 될 때 까지 분기해 나간 경우
- 하위 노드가 너무 많은 경우
- 가지치기(Pruning)을 이용해 개선
- 하위 노드가 더 이상 생성되지 않도록 하는 작업
- 구성
- Root Node : 시작 node
- Decision Node : 중간 node
- Leaf Node(Terminal Node) : 마지막 node
- 데이터 전처리
- 범주형인 quality에 대해 Label Encoding 처리
Hyper Parameter
- graphviz : 트리 구조 시각화
from sklearn.tree import export_graphviz
from graphviz import Source
graph = Source(export_graphviz(model,
out_file=None,
feature_names=Feature,
class_names=target,
rounded=True,
filled=True))
- 특정 Feature에 따른 Classification 상황을 알 수 있다
- gini : 불순도율
- 0~0.5로 표현
- class가 섞여있는 정도를 나타내며, 0에 가까울수록 하나의 클래스가 된다
- samples : 총 데이터 수
vlaue : class별 데이터 개수, label의 개수라 생각하면 된다
- Hyper Parameter
- max_depth : 트리의 최대 깊이
- max_leaf_nodes : 리프노드 개수
- min_samples_leaf : leaf 노드가 되기위한 최소 샘플수
- min_samples_split : 나누는 최소 샘플수
Hyper Parameter Tunning
Grid Search
from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth':[None, 1, 2, 3, 4, 5],
'max_leaf_nodes':[3,5,7,9]
}
grid_search = GridSearchCV(model,
param_grid=param_grid,
scoring='accuracy',
cv=5,
n_jobs=-1)
grid_search.fit(Feature, Label)
grid_search.best_params_
grid_search.best_estimator_
grid_search.feature_importances_
```
Random Search
from sklearn.model_selection import RandomizedSearchCV
n_iter_search = 50
random_search = RandomizedSearchCV(tree,
param_distributions=param_grid,
n_iter=n_iter_search,
cv=4,
n_jobs=-1)
random_search.fit(Feature, Label)
random_search.cv_results_
random_search.best_score_
random_search.best_params_
random_search.best_estimator_