혼공 머신러닝/딥러닝 #5

이번 장도 정말 길었다.. 점점 길어지는 느낌..그래도 절반 왔네.

로지스틱 회귀로 와인 분류

  • 로지스틱 회귀의 문제 : 모델이 학습한 결과를 사람에게 설명하기 어렵다..
    • 0.51 : 도수에 곱하세요
    • 1.67 : 당도에 곱하세요
    • -0.68 : pH에 곱하세요
    • 1.81 : 그리고 더하세요
    • 결과가 0보다 크면 화이트와인일 겁니다(약 77%로?)

결정 트리

  • 로지스틱 회귀는..모델이 왜 저런지 설명이 어렵다.
  • 결정 트리(Decision Tree) 모델은 설명하기 쉽다. + 특성 선택에도 쓸 수 있다 + 스케일 안해도 된다 + 앙상블 학습의 기반이 된다.
  • 질문을 하나씩 던져서 예/아니오를 계속 하는 형식
  • 모델은 어떤 질문을 해야 정확도가 높은지를 학습
  • 예측
    • (분류)질문을 따라 리프까지 왔을 때..그 노드에 많이 있는 클래스로 예측함.
    • (회귀) 리프 노드에 도달한 샘플의 타깃을 평균하여 예측값으로 사용.
  • 분류 – sklearn.DecisionTreeClassifier 클래스
  • 회귀 – sklearn.DecisionTreeRegressor 클래스
  • 트리를 출력할 수 있다.
  • 노드로 구성됨. 루트 ~ 리프
    • 왼쪽이 Yes, 오른쪽이 No 일때 이동하는 곳..
    • value = 타겟의 수(음성 클래스, 양성 클래스)
    • 노드의 배경 색에 의미가 있다!! 특정 클래스 비율이 높아질수록 진해짐.
    • 여기서 학습을 종료하면.. → 모두 양성 클래스로 예측함(리프 노드 둘다 양성 클래스가 많게 분류됨)
  • gini(지니 불순도, Gini impurity)
    • criterion(default=gini) 데이터 분할 기준을 정해줌
    • $지니 불순도 = 1 – (음성 클래스 비율^2 + 양성 클래스 비율^2)$
    • 참고 : https://towardsdatascience.com/gini-impurity-measure-dbd3878ead33
    • 값이 0.5면 불순도가 가장 높은 것 = 분류에 도움이 안됨..
    • 값이 0에 가까우면 분류를 잘 해주는 것. 0 이면 한쪽 클래스만 있는 거니까 최고. (aka 순수 노드)
  • 결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 크도록 트리를 성장 시킨다.
    • 불순도의 차이 = $부모의 불순도 – (왼쪽 노드 샘플 수 / 부모 샘플 수)\times왼쪽 노드 불순도 – (오른쪽 노드 샘플 수 / 부모 샘플 수)\times오른쪽 노드 불순도$
    • 정보 이득(information gain) 이라고도..
  • entropy 불순도 도 있다..
  • 가지치기(pruning)
    • DT를 제한 없이 자라게 만들면..훈련 세트에 과대적합 되기 쉽다.
    • 적당히 일반화 해야함. → 가지치기
    • 쉬운 방법 = 자랄 수 있는 최대 깊이(max_depth)를 지정
    • 다른 방법 : 불순도 분할 기준(min_impurity_decrease)
  • 결정 트리는 특성의 스케일 차이가 영향을 미치지 않는다. 따라서 정규화 안해도 됨.
  • 특성 중요도 : 어떤 특성이 중요한지 알 수 있다. 이걸로 모델을 단순화(특성 가지치기?) 하는데 활용..

교차 검증과 그리드 서치

  • 훈련 세트, 테스트 세트 -> 훈련 세트, 검증 세트, 테스트 세트
    • 테스트 세트로만 평가하다 보면..테스트 세트에 과대적합 되는거 아닐까?
    • 가능한 한 테스트 세트를 사용하지 말자. 마지막에 한 번만 사용하자
  • 보통 20~30% 정도를 테스트, 검증 세트로 사용. 케바케. 훈련 데이터가 엄청 많다면 조금만 써도 된다. 대표성이 더 중요..
  • 훈련 세트로 훈련, 검증 세트로 평가, 매개변수를 바꿔가며 좋은 모델을 고른다.. → 훈련 + 검증 세트로 다시 훈련 → 마지막으로 테스트 세트로 최종 점수 평가. .. 실전에서도 비슷한 성능을 기대할 수 있겠지?

교차 검증

  • 많은 데이터를 훈련에 사용할수록 좋은 모델..
  • 검증 세트를 나누느라 데이터 줄어듬 → 훈련 세트 전체를 부분으로 나누고 돌아가면서 훈련과 검증을 거침 → 그 중 가장 괜찮은 애로 전체 학습.

필수 과

  • 교차 검증을 그림으로 설명하기
  • n 개로 나눴니? n-Fold Cross Validation → n번 학습, 평가
  • 보통 5~10 폴드 사용
  • sklearn.cross_validate()
    • cv(폴드) 수 만큼 나눠서 돌려가며 학습을 실행하고
    • 학습/평가에 걸린 시간과 점수를 반환
    • 최종 점수 = 점수 평균
  • 나누는 방법을 지정 splitter(분할기)
    • 훈련 세트를 잘 섞어놔야 분할했을 때 제대로 학습할 수 있다. 아님 나누기 전에 미리 섞어놓던지
    • StratifiedKFold
  • 참고 : k-겹 교차 검증

하이퍼파라미터 튜닝

  • 하이퍼파라미터는 보통 모델 클래스 생성자의 인자로 있다.
  • 보통은..
    1. 하이퍼파라미터 기본값을 사용해 훈련
    2. 바꿔가며..검증 세트로 평가 또는 교차 검증으로 평가
    3. 최적값 발견
  • 이걸 자동으로 해주는거 : AutoML
  • 여러 매개변수를 동시에 바꿔가며 최적의 값을 찾아야
  • 그리드 서치(Grid Search)
    • GridSearchCV : 하이퍼파라미터 탐색과 교차 검증을 함께
      • 하이퍼파라미터는 dictionary 로 특성 이름, 값의 범위(list, range, ..)를 입력
    • 특성과 **입력값(하이퍼파라미터)**을 정해 준다
  • 결과는 best_estimator_에.. 전체 훈련 세트로 다시 훈련시킨 모델임.
  • best_params_ : 선택된 최적 하이퍼파라미터 값
  • 랜덤 서치(Random Search)
    • 특성과 확률 분포 객체를 정해 준다
    • 확률 분포 객체 : SciPy에 있다..여기만 있나?
    • randint, uniform
    • RandomizedSearchCV

트리의 앙상블

  • 정형(Structured), 비정형 데이터(Un-)
  • 정형 데이터 에서 아주 좋은 알고리즘 → 앙상블 학습(ensemble)
    • 대부분 트리 기반으로..
  • 비정형은 신경망이 대세

랜덤 포레스트

  • 결정 트리를 랜덤하게 만들어 .. 결정 트리의 숲을 만든다
  • 각 결정 트리의 예측을 사용해 최종 예측?
  • 데이터 추출
    • 랜덤하게 샘플 추출, 중복 허용 → 부트스트랩 샘플 → 보통 훈련 세트 크기와 같게 만든다.
  • 노드 분할
    • 전체 특성 중 일부 특성을 랜덤하게 골라서..그 중 최선의 분할을 찾는다
    • 분류 RandomForestClassifier는 전체 특성 갯수의 제곱근 만큼의 특성을 선택
    • 회귀 RandomForestRegressor는 전체 특성 사용
  • 예측
    • 분류 : 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스로..
    • 회귀 : 각 트리의 예측을 평균
  • 특징
    • 과대적합되기 어려움(랜덤한 샘플과 특성 사용)
    • 특성 중요도가 골고루 배분됨(모든 특성을 한번에 다루는게 아니니까)
  • oob_score : 자체적으로 모델을 평가하는 점수
    • RandomForestClassifier(oob_score=True, ..)
    • Out of Bag 샘플 : 훈련 세트 – 부트스트랩 샘플, 남는 애들
    • 검증 세트와 비슷한 역할, 각 트리의 OOB 점수를 평균함.

엑스트라 트리

  • 랜덤 포레스트와 비슷
  • 차이
    • 전체 훈련 세트를 사용(부트스트랩 샘플을 사용하지 않는다)
    • 노드를 분할할 때 무작위로 한다?!
    • 결정 트리에 splitter=’random’으로 한 트리들
  • aka Extremely Randomized Trees
  • 보통 랜덤 포레스트보다 더 많은 트리를 학습시켜야 하지만..노드 분할을 랜덤으로 해서 빠름!
  • 분류 : ExtraTreesClassifier
  • 회귀 : ExtraTreesRegressor

그레이디언트 부스팅

  • Gradient boosting
  • 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블..??
  • GradientBoostingClassifier
    • default max_depth = 3, n_estimators= 100
    • 경사하강법을 사용하여 트리를 앙상블에 추가
    • 분류 : 로지스틱 손실 함수 사용
    • 회귀 : 평균 제곱 오차 함수 사용 MSE
    • 트리의 수 = epoch 로 볼 수 있는건가?
    • param : learning_rate, ..
    • subsample : 훈련에 사용할 데이터 비율, 1.0(전체) 기본값. 1 미만으로 쓰면 확률적 경사 미니배치 경사하강법과 유사해짐..
  • 특징
    • 과대적합에 매우 강함.
    • 순서대로(serial) 해야 되어서 훈련 속도가 느림..

히스토그램 기반 부스팅

  • Histogram-based Gradient Boosting
  • ❓ 부스팅이란 무엇인가
  • 정형 데이터 안에서 인기 짱 알고리즘 이라고..
  • 입력 특성을 256개의 구간으로 나눔?
    • 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수.. 왜지
  • 특징
    • 누락 특성 있어도 전처리 생략할 수 있음(256개 중 일부를 누락 값 채우는 용도로 사용)
  • HistGradientBoostingClassifier
    • max_iter : 부스팅 반복 횟수
  • permutation_importance
    • 특성을 랜덤하게 섞어서 모델의 성능이 변화하는지 관찰하여 특성의 중요도를 계산

그 외의 히스토그램 기반 그레이디언트 부스팅 구현체

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다