지금은마라톤중

멋사 AI스쿨 TIL - (22) 본문

멋쟁이사자처럼/Python

멋사 AI스쿨 TIL - (22)

달리는중 2023. 3. 16. 16:58

2023.03.15

 

 엑스트라 트리 모델 Extra Trees 이란?

더욱 랜덤한 포레스트로 아주 무작위화된 앙상블 러닝 모델이다.

Extra Trees - 임의 분할

Random Forest - 최적 분할

 

from sklearn.ensemble import ExtraTreesRegressor

# Building the model
extra_reg = ExtraTreesRegressor()

# Training the model
extra_reg.fit(X, y)

 

 회귀에서는 정답이 예측과 얼마나 가까운지를 측정!

분류에서 썼던 accuracy는 얼마나 정답을 맞혔는지(y_predict와 y_test의 값이 일치하는 개수)를 평가하기 때문에,

accuracy로 회귀모델을 평가하는 것은 적절하지 않습니다!

 

 r2_score 결정계수

1에 가까울수록 좋다!(종속변인과 독립변인 사이에 상관관계가 높을수록 1에 가까워진다)

 

 

 회귀 모델 평가 지표 :

MAE(Mean Absolute Error)

MSE(Mean Sqaured Error)

RMSE(Root Mean Sqaured Error)

RMSLE(Root Mean Square Log Error)

R-Squared(Coefficient of Determination, 결정계수)

Huber Loss

 

 

 잔차는 측정값에서 예측값을 뺀 값을 의미합니다

 

질문🙋🏻‍♂️: 많이 틀릴 수록 패널티를 주는 공식은 무엇일까요?
틀린값에 대한 절대값만 보고자 한다면 => MAE
많이 틀릴수록 패널틸를 주고자 하면 =>  MSE(제곱을 해주기 때문에 )
틀린값에 대한 편차를 보고자 한다면 => RMSE
적게 틀린 것에 더 패널티를 주고 아주 많이 틀린 것에 좀 더 적게 패널티를 주고자 한다면 => RMSLE

 

 SOTA 모델이란?

'SOTA'는 'State-of-the-art'의 약자로, '현재 최고 수준의 결과'를 가진 모델로, 현재 수준에서 가장 정확도가 높은 모델을 의미합니다.

성능의 차이를 만들어 내는 것은 EDA를 통해 모델에게 힌트를 주기

 

 

 

 astype()으로 문자열로 바꾼 뒤 연-월로 붙여줍니다.

-> 해당 데이터를 feature로 사용하기 위해서는 One Hot 인코딩처럼 숫자화 시켜주어야 합니다.

이때, Ordinal Encoding (순서형 인코딩)을 적용해줄 수 있습니다

 

 

 Ordinal Encoding 이란?

순서가 있는 데이터를 인코딩

- 범주형 자료값이 순서인지 아닌지 고려하지 않고 숫자를 부여하는 Label Encoding과는 다르게 Ordinal 인코딩은 순서형 자료인지를 고려하여 숫자값을 부여합니다.

- 범주가 너무 많아 one hot encoding을 하기 애매한 상황에서 이용하기 좋은 인코딩 방법입니다

 

 리마인드 정규분포 형태로 만들기 : Scaling

* 스케일링의 다양한 방법들

- Normalization

- Standardization (Z-Score)
(값 - 평균) / 분산 
평균이 0, 표준편차가 1이 됨

- Min-Max
(값 - 최소값) / (최대값 - 최소값)
최대값이 1, 최소값이 0으로 바뀌게 됨

- Robust (강건하다는 뜻, 위 두 방법과 달리 이상치 제거에 효과적)
(값 - 중앙값) / IQR
중앙값을 0으로 만듦

-> 스케일링 적용시, 이상치와 데이터 왜곡에 주의!

 

 

 

 Log Transformation

- log를 count값에 적용하게 되면 한쪽에 너무 뾰족하게 있던 분포가 좀 더 완만한 분포가 된다.

- 어떤 쪽으로 너무 치우치거나 뾰족한 데이터가 완만하게 된다.

- 정규분포에 좀 더 가까운 형태로 만들어준다.

- log를 취한 값을 사용하게 되면 이상치에도 영향을 덜 받는다. 지수함수로 log+1값 복원 = log + 1

- 1을 더해주는 이유는 1보다 작은 값에서 음수를 갖기 때문에 가장 작은 값인 1을 더해서 음수가 나오지 않게 처리할 수 있다.

- np.log로 로그를 취했던 값을 다시 원래의 값으로 복원할 수 있다.

- log 값으로 예측한 값을 원래대로 돌려놓는 것

 

 

 

 회귀 모델에서 사용할 수 있는 라벨 스무딩(Label Smoothing) 기법은 다양합니다.

여러 예시를 아래와 같이 소개해 드리겠습니다.

정답 라벨에 노이즈 추가 정답 라벨 값에 작은 노이즈를 추가하여 부드러운 라벨 값을 할당합니다.

예를 들어, 정답 라벨이 100일 때, 이를 95~105 사이의 값으로 조정하여 노이즈를 추가할 수 있습니다.

- 로그 변환

정답 라벨에 로그 변환을 취한 후, 부드러운 라벨 값을 할당합니다.

예를 들어, 정답 라벨이 100일 때, 이를 로그 변환하여 2.0으로 만들고, 이 값에 노이즈를 추가하여 부드러운 라벨 값을 할당할 수 있습니다.

- 표준편차

추가 정답 라벨 값에 대해 표준편차를 더해 부드러운 라벨 값을 할당합니다.

예를 들어, 정답 라벨이 100이고, 표준편차가 10일 때, 110을 부드러운 라벨 값으로 할당할 수 있습니다.

- 확률 분포 변환

정답 라벨을 부드러운 확률 분포로 변환하여 부드러운 라벨 값을 할당합니다.

예를 들어, 정답 라벨이 100이고, 표준편차가 10일 때, 정규 분포를 따르는 확률 분포에서 무작위로 값을 뽑아 부드러운 라벨 값을 할당할 수 있습니다.

이처럼 회귀 모델에서 사용할 수 있는 라벨 스무딩 기법은 다양하며, 문제의 특성에 따라 적절한 방법을 선택하여 사용할 수 있습니다.

 

 

 배깅과 부스팅 차이

배깅모델 : 병렬적으로 트리를 학습

부스팅모델 : 순차적으로 트리를 학습

 

 

 Tree 계열 모델

분류, 회귀 전부 사용 가능

화이트박스 모델 (설명 가능한 인공지능)

안정적, 대규모 데이터에서도 동작

 

질문🙋🏻‍♂️ : epoch는 어떻게 해석해야할까요?
에폭(epoch)은 모델 학습시 전체 데이터를 학습한 횟 수 입니다!
GBM => epoch 를 n_estimators 라고 보면 됩니다. 왜냐하면 학습을 하고 오차를 보완해서 새로운 트리를 만드는 것을 계속 반복하기 때문입니다.
n_estimators 트리의 수이기는 하지만 몇 번 학습할 것인지를 의미하기도 합니다. 왜냐하면 병렬트리를 만드는게 아니라 순차적으로 트리를 만들기 때문입니다.
GBM 에서는 트리를 시각화 할 수 있습니다. 병렬 트리는 너무 많기 때문에 한번에 시각화 하기 어렵지만, 순차적으로 트리를 만들면 몇 번째 트리를 시각화 할지 지정해 주면 트리를 시각화 해볼 수 있습니다.
XGBoost, LightGBM 등에서 트리를 시각화 하는 기능을 제공하고 있습니다

 

 

 

 Ensemble : 여러 트리를 조합하는 방법!

- 배깅 기법 -> 랜덤 포레스트, 엑스트라 트리 모델

병렬적으로 트리를 생성

히스토그램 기반 부스팅 트리를 제외하면, 결측치가 있을 때 동작하지 않으므로 결측치를 채워주거나 제거해야 함

- 부스팅 기법 -> XGBoost, 그래디언트 부스팅

배깅 기법이 여러 트리를 만들어 합쳐 사용했다면,

부스팅 기법은 이전 트리에서 틀렸던 부분에 가중치를 주어 지속적으로(순차적) 학습 오답노트와도 유사

부스팅 기법의 parameter

lerning_rate : 오차가 최소가 되는 지점을 찾을 때, 최적의 가중치를 향해 얼마나 빨리 또는 느리게 이동할지 결정

너무 크면 최소가 되는 지점을 찾지 못하고 지나침. 너무 작으면 속도가 매우 느림

loss : 손실 함수

n_estimators : epoch와 유사

 

 

 경사하강법의 목적

손실(Loss)이 가장 작고, 예측을 잘 하는 모델의 파라미터를 찾는 것에 있습니다

 

 squared loss를 더 많이 사용하는 이유 ?

absolute loss를 사용했을 경우에는 기울기가 각 부호에 따라 부호와 같은 기울기가 나오기 때문에 미분을 했을 때 같은 방향 , 같은 미분값이 나와서 기울기가 큰지, 작은지 비교할 수 없다.

 

 

 Gradient Boosting Machine

- 가중치를 업데이트하는 부스팅에 경사하강법을 추가한 기계학습법을 말한다.

- 샘플의 가중치를 수정하는 대신 이전 모델이 만든 잔여 오차에 대해 새로운 모델을 학습한다.

- 앙상블에 이전까지의 오차를 보정하기위해 샘플의 가중치를 수정할 수 있도록 모델을 순차적으로 추가한다.

 

질문🙋🏻‍♂️: learning late를 더 크게 넣었는데 결과가 더 좋게 나온 이유가 있을까요 ??
학습을 더 빠르게 하고 해당 데이터에서는 learning_rate 가 기본값보다 큰 것이 더 잘 학습을 하는것으로 보여집니다
learning_rate의 보폭이 너무 크면 대충 탐색하기 때문에 최소점을 지나쳐 발산을 하기도 한다는 점을 주의해야 합니다!

 

 

랜덤서치 : 격자 탐색(그리드 서치)으로는 찾지 못하는 랜덤한 위치에 있는 좋은 파라미터를 찾음

 

 

 하이퍼 파라미터란 ?

- 모델링할 때 사용자가 직접 세팅해주는 값

- learning rate나 서포트 벡터 머신에서의 C, sigma 값, KNN에서의 k값 등등

- 머신러닝 모델을 쓸 때 사용자가 세팅하는 값

- 정해진 최적의 값이 없지만. 휴리스틱한 방법이나 경험 법칙(rules of thumb)에 의해 결정하는 경우가 많다.

- 자동으로 하이퍼 파라미터를 선택해주는 라이브러리를 사용하기도 한다.

 

 하이퍼 파라미터를 최적화하는 방법

- 자체적으로 Cross Validation도 진행하여 가장 검증된 하이퍼 파라미터 값을 얻을 수 있다

 

 

 GridSearchCV 란?

GridSearchCV 는 교차 검증 점수를 기반으로 머신러닝 모델의 최적의 파라미터를 검색합니다 !

하이퍼파라미터를 순차적으로 입력해 학습을 하고 측정을 하면서 가장 좋은 파라미터를 알려줍니다 !

parameter 종류 파라미터 변수 선언과 입력 예시

 parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}

estimator(string) : classifier, regressor, pipeline

param_grid(dict) : 사용될 파라미터명, 값 을 dict 형태로

scoring(string) : 예측 성능을 측정할 평가 방법 지정

cv(int) : 교차 검증을 위해 분할되는 학습/테스트 세트의 개수 지정

refit(bool) : true인 경우 최적의 하이퍼 파라미터를 찾은 후 입력된 개체를 해당 하이퍼 파라미터로 재학습

 

질문🙋🏻‍♂️: parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]} 에서 kernel에 list 말고 tuple로 넣은 이유가 있나요 ?
변경하지 않을 값이라면 튜플이 약간 더 빠릅니다. 둘다 사용해도 상관은 없습니다.

 

 

● 트리 학습 후 오차를 측정

gradient를 이용 -> 오차가 최소가 되는 지점을 찾는다!

lerning_rate : 오차가 최소가 되는 지점을 찾을 때, 최적의 가중치를 향해 얼마나 빨리 또는 느리게 이동할지 결정 (보폭)

learning rate 가 너무 크면? => 발산

learning rate 가 너무 작으면? => 느림

 

 

 GridSearch 에서 RMSE 로 평가하는 이유?

정답에 이미 로그를 취해주었기 때문에 RMSLE가 아닌 RMSE 로 평가합니다

 

질문🙋🏻‍♂️: cross_val_predict에서 verbose를 1로 할 때와 2로 할 때의 출력에 어떤 차이가 있나요?
일반적으로 함수 인자로 verbose가 있으면 함수 수행시 발생하는 상세한 정보들을 표준 출력으로 자세히 내보낼 것인가를 나타냅니다.
보통 0 은 출력하지 않고, 1은 자세히, 2는 함축적인 정보만 출력하는 형태로 되어 있습니다.

 

질문🙋🏻‍♂️: label_name에 log1p를 하고 loss=RMSE 로 best estimator를 구하는 것과 label_name은 그대로 놓고 loss=RMSLE 로 best estimator를 구하는 것 두 개가 다른건가요?
이미 정답에 로그가 적용되어 있기 때문에 RMSLE로 측정하면 로그를 두 번 취하게 됩니다.
RMSLE 로 측정하려면 예측값에 다시 expm1 을 하고 RMSLE로 측정해야 합니다. 
하지만 여기에서는 로그를 적용한 값으로 예측한 값을 그대로 사용해서 RMSE 로 평가하면 곧 RMSLE 로 평가하는 것과 같은 공식을 사용하는 것입니다.

 

'멋쟁이사자처럼 > Python' 카테고리의 다른 글

멋사 AI스쿨 TIL - (24)  (0) 2023.03.23
멋사 AI스쿨 TIL - (23)  (0) 2023.03.23
멋사 AI스쿨 TIL - (21)  (0) 2023.03.15
멋사 AI스쿨 TIL - (20)  (0) 2023.03.15
멋사 AI스쿨 TIL - (19)  (0) 2023.03.09
Comments