Networks/데이터 분석 및 AI

SK networks AI Camp- 회귀

코딩하는 Español되기 2024. 8. 30. 18:30

지도 학습 알고리즘

1. 회귀(Regression) : 임의의 어떤 숫자를 예측하는 문제(두 변수 사이의 상관관계를 분석하는 방법))

2. 분류(Classification) : 추측하고자 하는 결과가 이름이나 문자면 분류(샘플을 몇 개의 클래스 중 하나로)

 

회귀

결정계수(R^2) = 1 - { (타깃 - 예측)^2의 합 / (타깃 - 평균)^2의 합 } 

 

과대적합(overitting) : 훈련 세트에만 적합한 모델

 

과소적합(underfitting) : 테스트 점수가 높게 나오는 경우 or 두 점수 모두 낮은 경우

    ● 과소적합 발생 이유 : 데이터의 수가 적은 경우

    ● 과소적합 줄이는 법 : 모델을 복잡하게 만들기

 

선형 회귀 (Linear Regression)

    ● 비교적 간단 & 성능이 뛰어난 편

    ● coef_  속성 : 머신러닝의 기울기 = 계수 | 가중치

 

다항 회귀 (Polynomial Regression)

    ● 다항식을 사용해 특성과 타킷 사이의 관계를 나타낸 선형 회귀

 

다중 회귀 (Multiple Regression)

    ● 여러 개의 특성을 사용한 선형 회귀

    ● 특성의 갯수가 증가하면 선형 모델은 아주 강력해짐

       But 훈련 세트에 과대적합하게 되어 테스트 점수가 떨어짐

        - 그러면 어떻게 과대적합을 줄이냐?

 

○ 규제(Regularization)

    ● 선형 회귀 모델의 경우 : 특성에 곱해지는 계수(기울기) 크기를 작게 만드는 일

        - 어떻게 진행해야 하나?

          1. 정규화(계수 값의 크기를 비슷하게 해 주기) e.g. StandardScaler

          2. 규제 주고 모델 훈련

    ● 릿지(Ridge) 회귀

        - sklearn.linear_model vozlwl dksdp dlTdma

        - alpha 매개변수로 규제의 강도를 조절

          그러면 어떻게 적절한 alpha 값을 찾나요?

           0.001 ~ 100 까지 10배씩 늘리면서 훈련/테스트 그래프 그려보기

          그래프에서 두 그래프가 가장 가깝고 테스트 점수가 가장 높은 부분을 alpha값으로 선정

        - sag : 확률적 평균 경사 하강법 알고리즘(특성과 샘플 수가 많을 때 성능이 빠르고 좋음)

    ● 라쏘(Lasso) 회귀

        - 릿지를 라쏘로 바꿔주기만 하면 라쏘랑 똑같이 진행하면 됨

        - 릿지와 차이 : 계수 값을 아예 0으로 만들 수도 있음(= 중요한 변수 선택이 가능하다)

        - max_iter : 알고리즘 수행 반복 횟수 지정

    ● 릿지와 라쏘의 사용 구분

        - 릿지 : 모든 변수를 유지하고 싶을 때 사용하고 다중공선성이 존재하는 데이터에 유용

                     * 다중공선성 : 독립변수들 간의 상관관계가 높을 때

        - 라쏘 : 많은 특성 중 중요한 특성을 선택할 때

 

○ 엘라스틱넷(Elastic net) : 릿지와 라쏘 회귀를 혼합한 방법

    ● 코드 예시

from sklearn.linear_model import Ridge, Lasso, ElasticNet

# 릿지 회귀
ridge = Ridge(alpha=1.0)

# 라쏘 회귀
lasso = Lasso(alpha=0.1)

# 엘라스틱넷
elasticnet = ElasticNet(alpha=0.1, l1_ratio=0.5)  # l1_ratio는 L1과 L2 패널티의 비율 조정

[분류]

로지스틱 회귀

: 이름은 회귀이지만 분류 모델, 선형 회귀와 동일하게 선형 방정식 학습

○ 방정식

    ● z는 어떤 값도 가능하지만 확률이 되려면 0 ~ 1로 바꿔줘야 함

        - 그러면 어떻게 바꿔줘야 하나? 시그모이드 함수 or 로지스틱 함수를 사용

 

○ 시그모이드 함수

z = a * (weight) + b * (Length) + c * (Diagonal) + .... + f

 

    ● 로지스틱 회귀로 이진 분류 수행(True | False; 불리언 인덱싱) 

    ● 로지스틱 회귀로 다중 분류 수행

        - LogisticRegression 클래스 : 기본적으로 릿지 회귀와 같이 계수 제곱을 규제(L2 규제)

        - 다중 분류의 경우 z 값이 n 개가 나오고 n개의 z값을 확률로 변환이 필요함

           어떻게? 소프트맥스 함수(Softmax function)

 

○ 소프트맥스 함수 : 여러 개의 선형 방정식의 출력값을 0 ~ 1 사이로 압축하고 전체 합이 1이 되도록 지수 함수를 사용

 

○ 확률적 경사 하강법(Stochastic Gradient Descent)

    ● 훈련 세트에서 랜덤 하게 하나의 샘플을 선택해 손실 함수의 경사를 따라 최적의 모델을 찾는 알고리즘

    ● 점진적 학습 방법의 대표적인 알고리즘

       * 점진적 학습법 : 훈련한 모델을 안 버리고 새로운 데이터에 대해서만 조금씩 훈련

    ● 훈련 세트에서 랜덤하게 하나의 샘플을 선택하여 가파른 경사를 조금 내려가는 방법을 전체 샘플을 사용할 때까지

       만약 산(= 손실함수)을 내려오지 못하면? 다시 처음부터 랜덤하게 하나의 샘플을 선택하여 이어서 경사 내려감

       만족할만한 위치에 도달할 때까지 에포크를 반복

       * 에포크(epoch) : 확률적 경사 하강법에서 훈련 세트를 한 번 모두 사용하는 과정 

       * 손실 함수 : 머신러닝 알고리즘이 얼마나 엉터리인지 측정하는 기준

    ● 종류

      - 미니배치 경사 하강법 : 여러 개의 샘플을 사용해 경사하강법을 진행

      - 배치 경사 하강법 : 한 번 경사로를 따라 이동하기 위해 전체 샘플을 사용하는 것

    ● 신경망 알고리즘에서 확률적 경사 하강법이나 미니 배치 경사 하강법을 사용

 

○ 로지스틱 손실 함수(Logistic loss function; 이진 크로스엔트로피 손실 함수)

    ● 다중분류에서 사용하는 손실함수

    ● 양성클래스(타깃 = 1) 일 때 손실 = -log(예측확률)

    ● 음성클래스(타깃 = 0) 일 때 손실 = -log(1- 예측확률)

 

○ SDGClassifier : 확률적 경사 하강법을 사용한 분류 모델

    ● scikit-learn 패키지 안의 모듈

 

○ 에포크와 과대/과소적합

    ● 적은 에포크 = 훈련 횟수가 적음 → 과소적합된 모델일 가능성이 큼

    ● 많은 에포크 = 훈련 횟수가 많음 → 과대적합된 모델일 가능성이 큼

 

○ 힌지손실(hinge loss)

    ● hinge : loss 매개변수의 기본 값

    ● 서포트 벡터 머신(Support vector machine)의 알고리즘을 위한 손실 함수

 

○ 결정 트리 모델(Decision Tree)

    ● 질문을 하나씩 던져 정답을 맞혀가며 학습하는 알고리즘(비교적 예측 과정 이해가 쉬움)

    ● 불순도(impurity) : 최적의 질문을 찾기 위한 기준 

       * 지니 불순도, 엔트로피 불순도

    ● 가지치기 : 트리의 최대 깊이를 지정해 주는 것

    ● 장점 : 표준화 전처리를 따로 해줄 필요가 없음 why? 특성값의 스케일은 결정 트리

                  어떤 특성이 가장 유효한지 특성 중요도를 계산해 줌

 

○ 교차 검증 

    ● 검증 세트 : 전체 = 훈련 60% + 검증 20% + 테스트 20%

    ● 검증 세트를 생성한다고 훈련 세트가 감소

    ● 교차 검증을 통해 안정적인 검증 점수와 더 많은 데이터를 훈련

    ● 모든 폴드에 대해 검증 점수를 얻어 평균하는 방법을 사용

    ● Scikit-learn에서 cross_validate() 함수의 폴드 나누기

        - 회귀 모델 : KFold 분할기 사용

        - 분류 모델 : StratifiedKFold 사용

# cross_validate
scores = cross_validate(dt, train_input, train_target)
print(np.mean(scores['test_score']))

# StratifiedKFold

from sklearn.model_selection import StratifiedKFold

scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))

 

○ 하이퍼파라미터 튜닝 : 사용자 지정 파라미터

    ● 매개변수가 많아지면 하나하나 정해주기 힘들다.

    ● AutoML : 하이퍼파라미터 튜닝을 자동으로 수행하는 기술

   GridSearchCV : 사이킷런 의 클래스로 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행

       * n_jobs 매개변수 : CPU 코어 수를 지정

       - 과정 : 탐색할 매개변수 지정 → 훈련 세트에서 그리드 서치 수행

                     → 최상의 평균 검증 점수가 나오는 매개변 수 조합 찾기 → 전체 훈련 세트를 사용해 최종 모델 훈련 

from sklearn.model_selection import GridSearchCV

params = {'min_impurity' : [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}

gs = GridSearchCV(DecisionTreeClassifier(random_state = 42), params, n_jobs= -1)

         - 최상의 매개변수 조합 확인 및 교차 검증 점수 확인

gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=1)
gs.fit(train_input, train_target)

# 매개변수 조합확인
print(ge.best_params_)

# 교차검증 점수 확인
print(np.max(ge.cv_results_['mean_test_score']))

    ● 랜덤 서치(Random Search)

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

        수동으로 매개변수를 바꾸는 것이 아니라 그리디 서치나 랜덤 서치를 이용하여 바꾸는 것이 편함

 

○ 앙상블 학습(ensemble learning)

    ● 랜덤 포레스트(Random Forest) : 각 결정 트리를 랜덤 하게 만들어 각 결정 트리의 예측을 사용해 최종을 만듦

        - 각 트리를 훈련하기 위한 데이터를 만드는 방법

        - 부트스트랩 사용 : 전체 데이터 중에 한 개를 선택하고 다시 전체 데이터 중에 1개를 선택(즉, 중복이 가능)

                                       전체 특성 개수의 제곱근만큼의 특성을 선택

                * If 4개의 특성 존재 then 노드마다 2개를 랜덤 하게 선택

                * But 회귀 모델(RandomForestRegressor)은 전체 특성을 사용

 

    ● 엑스트라 트리(Extra Trees) : 랜덤 포레스트와 비슷하게 동작

                                                      부트스트랩 샘플을 사용하지 않는 대신 랜덤 하게 노드 분할(과대적합 감소)

       - splitter='random' : 엑스트라 트리가 사용하는 결정 트리

       - ExtraTreesClassifier

       - 랜덤하게 노드를 분할하기 때문에 무작위성이 강함. 하지만 더 많은 결정 트리를 훈련해야 하는 단점이 존재

       - 회귀버전 : ExtraTreesRegressor 클래스

 

    ● 그레디언트 부스팅(Gradient Boosting) : 깊이가 얕은 결정 트리를 사용하여 트리의 오차를 보완하는 방법

       - GradientBoostingClassifier

       - 과대적합에 강하고 일반적으로 높은 일반화 성능 기대 가능

       - 경사 하강법을 사용하여 트리를 앙상블에 추가(손실함수를 최소화하는 앙상블 방법)

       - 분류 : 로지스틱 손실 함수 사용 / 회귀 : 평균 제곱 오차 함수 사용

       - n_jobs 매개변수가 없음

 

    ● 히스토그램 기반 그레디언트 부스팅(Histogram-based Gradient Boosting)

       : 정형 데이터를 다루는 머신러닝 알고리즘 중 가장 인기가 높은 알고리즘

       - 대표적인 라이브러리 : XGBoost, LightGBM(MS 제작)

       - 입력 특성을 256개의 구간으로 나눔 So, 최적의 분할을 매우 빠르게 찾을 수 있음

       - 트리 개수 지정하는데 (n_estimators) 대신 부스팅 반복 횟수 지정(max_iter) 사용