그동안 혼자 책보고 공부하면서 노션에 적었던 글을 옮겨 적으면서 복습하려고 적는 글입니다.

Chapter 4

predict_proba 함수는 분류 모델에서 주로 사용되는 함수 중 하나로, 모델이 각 클래스에 속할 확률(확률 예측)을 계산하는 데 사용

로지스틱 회귀

  • 이름은 회귀이지만 분류 모델.
  • 선형회귀와 동일하게 선형 방정식을 학습
  • a, b, c, d, e는 가중치 혹은 계수
  • z는 어떤 값도 가능하지만 확률이 되려면 0~1사이 값이 되어야함. → 시그모이드 함수(or 로지스틱 함수)
  • 사이킷런에서는LogisticRegression 클래스가 준비되어 있음.

    • z값은 decision_function()함수로 출력 가능

      이 z값을 시그모이드 함수에 통과시키면 확률을 얻을 수 있음 → scipy 라이브러리의 sigmoid 함수인 expit()

  • LogisticRegression 클래스는 기본적으로 반복적인 알고리즘을 사용. max_iter 매개변수에서 반복 횟수를 지정하며 기본값은 100

    • LogisticRegression 은 기본적으로 릿지회귀와 같이 계수의 제곱을 규제(L2 규제), 매개변수는 C

다중분류

  • 다중분류의 경우에는 softmax함수를 사용해 7개의 z값을 확률로 변환

확률적 경사 하강법

  • 확률적이란 말은 ‘무작위하게’ 혹은 ‘랜덤하게’의 기술적인 표현
  • ‘경사’는 기울기, ‘하강법’은 내려가는 방법
  • 훈련세트에서 램덤하게 하나의 샘플을 고르는 것 → 확률적 경사 하강법
    • 확률적 경사 하강법에서 훈련 세트를 한 번 모두 사용하는 과정을 에포크라고 부름
    • 1개씩 말고 무작위로 몇 개의 샘플을 선택해서 여러개의 샘플을 사용해 경사 하강법을 수행하는 방식을 미니배치 경사 하강법
    • 극단적으로 한번의 경사로를 따라 이동하기 위해 전체 샘플을 사용하는 것 → 배치 경사 하강법

손실함수

비용함수(cost function)는 손실 함수의 다른 말

로지스틱 손실 함수

  • 양성 클래스(타깃 = 1)일 때, 손실은 -log로 계산
  • 확률이 1에서 멀어질 수록 손실은 아주 큰 양수가 됨.
  • 음성 클래스(타깃 = 0)일 때, 손실은 -log(1-예측확률)로 계산

→ 이 손실 함수를 로지스틱 손실 함수 or 이진 크로스엔트로피 손실 함수

  • 다중 분류에서 사용하는 손실 함수 → 크로스엔트로피 손실 함수

cf) 그럼, 분류말고 회귀에는 어떤 손실 함수를 사용? → 평균 제곱 오차(MSE)를 많이 사용

  • Cross Entropy는 작을수록 모델의 성능이 좋다는 것을 나타냄. Cross Entropy는 분류 모델의 손실 함수 중 하나로, 모델이 예측한 확률 분포와 실제 레이블의 확률 분포 간의 차이를 측정

SGDClassifier

  • 객체를 만들지 않고 훈련한 모델 sc를 이어서 훈련할 경우 partial_fit()메서드를 사용

    에포크와 과대/과소적합

    • 에포크 횟수가 적으면 모델이 훈련 세트를 덜 학습함. → 과소적합의 위험
    • 에포크 횟수가 충분히 많으면 훈련 세트를 완전히 학습(훈련 세트에 아주 잘 맞는 모델이 만들어짐) → 과대적합의 위험

    과대적합이 시작하기 전에 훈련을 멈추는 것을 조기 종료라고 함.

    • SGDClassifier는 일정 에포크 동안 성능이 향상되지 않으면 더 훈련하지 않고 자동으로 멈춤.
    • tol 매개변수에서 향상될 최소값을 지정. 위 코드는 tol 매개변수를 None으로 지정하여 자동으로 멈추지 않고 max_iter = 100만큼 무조건 반복하도록 함.

Chapter5

불순도

gini 는 지니 불손도를 의미

지니 불순도 = 1 - (음성 클래스 비율^2 + 양성 클래스 비율^2)

가지치기

  • 결정 트리도 가지치기가 필요. (그렇지 않으면 무작정 끝까지 자라나는 트리가 만들어짐 → 과대적합)
  • 가지치기 하는 방법은 트리의 최대 깊이를 지정.

검증세트

  • 테스트 세트를 사용하지 않으면 모델이 과대적합인지 과소적합인지 판단하기 어렵다.
  • 테스트 세트를 사용하지 않고 이를 측정하는 간단한 방법은 훈련 세트를 또 나눈 것. → 검증세트

교차 검증

cross_validate()

  • 검증 세트를 만드느라 훈련 세트가 줄음. (보통 많은 데이터를 훈련에 사용할수록 좋은 모델이 만들어짐)
  • 그렇다고 검증 세트를 너무 조금 떼어 놓으면 검증 점수가 들쭉날쭉하고 불안정할 것임. → 교차검증
  • 교차검증: 검증 세트를 떼어 내여 평가하는 과정을 여러 번 반복 → 이 점수를 평균하여 최종 검증 점수를 얻음
  • 아래 그림은 3-폴드 교차검증

한 가지 주의할 점은 cross_validate()는 훈련 세트를 섞어 폴드를 나누지 않음. 우리는 train_test_split()함수로 전체 데이터를 섞은 후 훈련 세트를 준비했기 때문에 따로 섞을 필요가 없지만 교차 검증을 할 때 훈련 세트를 섞으려면 분할기를 지정해야함.

사이킷런의 분할기는 교차 검증에서 폴드를 어떻게 나눌지 결정해줌. cross_validate()함수는 기본적으로 회귀 모델일 경우 KFold 분할기를 사용하고 분류 모델일 경우 타깃 클래스를 골고루 나누기 위해 StratifiedKFold를 사용함.

하이퍼파라미터 튜닝

그리드서치 를 사용해 최적의 하이퍼파라미터 튜닝

그리드 서치로 찾은 최적의 매개변수는 bestparams 속성에 저장되어 있음.

매개변수의 값이 수치일 때 값의 범위나 간격을 미리 정하기 어려울 수 있음. 또 너무 많은 매개 변수 조건이 있어 그리드 서치 수행시간이 오래 걸릴 수 있음. → 랜덤 서치 사용

랜덤 서치: 매개변수 값의 목록을 전달하는 것이 아니라 매개변수를 샘플링할 수 있는 확률 분포 객체를 전달.

트리의 앙상블

  • 나무 말고 숲을 봐 → (결정 트리 → 랜덤포레스트)
  • 정형 데이터를 다루는데 가장 뛰어난 성과를 내는 알고리즘 → 앙상블 학습
  • 그럼 비정형 데이터는? → 신경망 알고리즘

랜덤 포레스트

  • 결정 트리를 랜덤하게 만들어 결정 트리의 숲을 만듬
  • 각 결정 트리의 예측을 사용해 최종 예측을 만듬

랜덤 포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤하게 만듬.

이 데이터를 만드는 방법은 우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출해서 만듬

ex) 1,000개 가방에서 100개씩 샘플을 뽑는다면 먼저 1개를 뽑고, 뽑았던 1개를 다시 가방에 넣음. 이란 식으로 계속해서 100개를 가방에서 뽑으면 중복된 샘플을 만들 수 있음 → 부트스트랩 샘플

  • 랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 과대적합을 막아줌, 검증 세트와 테스트 세트에서 안정적인 성능

엑스트라 트리

  • 랜덤 포레스트와 매우 비슷하게 동작. 차이점은 부트스트랩 샘플을 사용x

그래디언트 부스팅

  • 깊이가 얕은 결정 트리를 사용해 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법

히스토그램 기반 그레이디언트 부스팅

  • 입력 특성을 256개의 구간으로 나눔. 따라서 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있음.

XGBoost

LightGBM

0개의 댓글