[AI] 검증 결과(과적합과 일반화), Decision_Tree : Scikit-Learn

Ik·2022년 7월 17일
0

Data

목록 보기
6/34

검증

검증 결과

  • 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,      # 학습된 DecisionTree 모델(필수)
                                 out_file=None,   # 시각화된 것을 파일로 저장하기 위한 경로
                                 feature_names=Feature,   # feature 이름(컬럼명) 리스트 
                                 class_names=target,   # Label의 class를 지정하면 각 노드에 다수 class가 무엇인지 출력
                                 rounded=True, 
                                 filled=True))  # 각 노드의 배경색 시각화 -> 다수 클래스별로 색을 맞춰서 배경을 시각화
    • 특정 Feature에 따른 Classification 상황을 알 수 있다
      • gini : 불순도율
        • 0~0.5로 표현
        • class가 섞여있는 정도를 나타내며, 0에 가까울수록 하나의 클래스가 된다
      • samples : 총 데이터 수
        vlaue : class별 데이터 개수, label의 개수라 생각하면 된다
  • Hyper Parameter
    • max_depth : 트리의 최대 깊이
      • leaf node : 마지막 노드
    • max_leaf_nodes : 리프노드 개수
    • min_samples_leaf : leaf 노드가 되기위한 최소 샘플수
    • min_samples_split : 나누는 최소 샘플수

Hyper Parameter Tunning

 from sklearn.model_selection import GridSearchCV
 # 여기서는 Dicision Tree 알고리즘의 hyper parameter 사용
 	# 모델에 따른 hyper parameter를 dic형태로 입력해주면 된다
     	# key를 매개변수 이름, value를 후보리스트로
 param_grid = {'max_depth':[None, 1, 2, 3, 4, 5],
           'max_leaf_nodes':[3,5,7,9]
          }   # 정의되지 않은 나머지 하이퍼파라미터는 default 값 사용
 grid_search = GridSearchCV(model,   # 모델
                        param_grid=param_grid,  # 하이퍼파리미터 후보
                        scoring='accuracy',     # 평가 지표, list형태로 다양한 평가지표 넣을 수 있다
                        # refit = 'accuracy   # list형태인 경우는 다음 매개변수로 refit= 이용해 순위의 기준이 될 평가 지표 결정해줌
                        cv=5,                   # cross validation의 fold 갯수
                        n_jobs=-1)    # 사용할 CPU코어 개수(default:-1, CPU 전부사용)
 # 학습
 grid_search.fit(Feature, Label)
 grid_search.best_params_   # 가장 좋은 parameter 조합
 grid_search.best_estimator_  # 가장 좋은 parameter로 학습된 모델
 grid_search.feature_importances_  # 각 Feature가 데이터를 추론하는데 얼마나 중요한지(영향도) 조회
 ```
from sklearn.model_selection import RandomizedSearchCV
# param_grid, parameter dic 형태는 Grid Search와 동일
n_iter_search = 50   # 랜덤하게 선택할 갯수
# scoring 생략 - 분류: accuracy(기본), 회귀: r**2(결정계수, r square)
random_search = RandomizedSearchCV(tree,    # 모델
                                param_distributions=param_grid,   # 파라미터 조합
                                n_iter=n_iter_search,   # 200개의 조합 중 랜덤하게 50개만 선택해서 확인
                                cv=4,   # cross validation의 fold 개수
                                n_jobs=-1)    # cpu 프로세스 몇개에서 병렬로 학습할지 개수 지정
# 학습
random_search.fit(Feature, Label)   
random_search.cv_results_   # 전체 parameger 조합
random_search.best_score_   # 가장 좋은 평가 결과
random_search.best_params_  # 가장 좋은 parameter 조합
random_search.best_estimator_  # 가장 좋은 parameter로 학습된 model

0개의 댓글