0801 실습
사이킷런을 이용한 원핫인코딩
cf. benz 데이터에서는 이례적으로 원핫인코딩을 전부 적용해야 성능이 잘 나옴
- 현실 세계에서는 train을 기준으로 학습이 진행되어야 한다
handle_unknown="ignore"
: test에 있으나 train에 없는 경우에는 train 없는 컬럼에 대해서 원핫인코딩을 진행하지 않고 무시- ohe는 numpy array 형태로 반환이 되는데 인덱스 정보가 없다 => 인덱스 재지정을 해주지 않으면 concat이 제대로 실행되지 않음
from sklearn.preprocessing import OneHotEncoder ohe = OneHotEncoder(handle_unknown="ignore") train_ohe = ohe.fit_transform(train.select_dtypes(exclude="number")) test_ohe = ohe.transform(test.select_dtypes(exclude="number"))
df_train_ohe = pd.DataFrame(train_ohe.toarray(), columns=ohe.get_feature_names_out()) # csv 파일을 불러올 때 index_col="ID" 을 했기 때문에 index 값을 변경해 줍니다. df_train_ohe.index = train.index df_test_ohe = pd.DataFrame(test_ohe.toarray(), columns=ohe.get_feature_names_out()) df_test_ohe.index = test.index
train_num = train.select_dtypes(include="number") df_train = pd.concat([train_num, df_train_ohe], axis=1)
test_num = test.select_dtypes(include='number') df_test = pd.concat([test_num, df_test_ohe], axis=1)
선형 회귀
- Linear Regression
- 종속변수 y와 한개 이상의 독립 변수 x와의 선형 상관 관계를 모델링하는 회귀분석 기법
- 주요 파라미터
- 특징
- 다른 모델들에 비해 간단한 작동원리
- 학습 속도가 매우 빠름
- 조정해줄 파라미터가 적음
- 이상치에 영향을 크게 받음(ex. Anscombe's Quartet)
- 데이터가 수치형 변수로만 이루어져 있을 경우, 데이터의 경향성이 뚜렷할 경우 사용 용이
- 선형 회귀 모델의 단점을 보완한 모델: Rigde, Lasso, ElasticNet
0802 실습
- 원래 모델에 넘파이 배열을 넣어줘야하지만 판다스도 받아주는 거...
Bagging, Boosting, Gradient
Bagging
- 병렬적 진행, 모델마다 독립적인 데이터셋
Bagging은 Bootstrap Aggregation의 약자로, 샘플을 여러 번 뽑아(Bootstrap) 각 모델을 학습시켜 결과물을 집계(Aggregration)하는 방법을 말한다. Bagging의 수집함수는 전형적으로 분류일때는 통계적 최빈값(statistical mode, 즉 hard voting 처럼 가장 많은 예측 결과)이고, 회귀에서는 평균에 대해 계산하게 된다(이는 Soft voting과 유사). 같은 훈련 샘플을 여러 개의 모델에 걸쳐 사용해서 모든 모델이 훈련을 마치면 앙상블은 모든 예측기의 예측을 모아서 새로운 샘플에 대한 예측을 만들게 된다.
Boosting
- 순차적 진행, 이전 모델이 데이터셋을 정해줌(오차에 가중치)
- 이전 오차를 보완해서 순차적으로 만드므로 무작위성이 없음
- 부스팅은 약한 모델을 여러개 연결해서 강한 모델을 만들어 내기 위한 앙상블 방식으로, 부스팅의 아이디어는 앞의 모델들을 보완해 나가면서 일련의 모델들을 학습시켜 나가는 것이다. 부스팅에서 대표적인 모델 중 하나는 에이다로, 에이다 부스트는 앙상블에 이전까지의 오차를 보정하기위해 샘플의 가중치를 수정할 수 있도록 모델을 순차적으로 추가한다.반면에 그래디언트 부스팅은 에이다 부스트와 달리 샘플의 가중치를 수정하는 대신 이전 모델이 만든 잔여 오차에 대해 새로운 모델을 학습시킨다. 최적화된 그래디언트 부스팅 구현으로 가장 유명한 것이 지난번에 강사님께서 수업에서 언급하신 XGBoost이다.
Gradient
- Gradient: 경사(좋은 일 아님), 기울기
- 가중치 업데이트할 때 경사하강법(gradient descent)이 사용된다. 머신러닝에서 예측값과 정답값간의 차이가 손실함수인데 이 크기를 최소화시키는 파라미터를 찾기 위해 경사하강법을 사용한다. 손실함수 그래프에서 값이 가장 낮은 지점으로 경사를 타고 하강한다. 따라서 경사하강법의 목적은 손실함수가 가장 작고, 예측을 잘 하는 모델의 파라미터를 찾는 것이다.
Learning Rate
- learning_rate 는 학습률을 의미하는데 보폭이라고 번역하기도 한다. 보폭이 너무 크면 대충 찾기 때문에 손실함수의 최소값을 지나치고 발산할 수 있다. 성능의 고려 없이 학습률을 높이면 학습시간을 줄일 수 있다.
epoch
- n_estimators 와 같은 개념으로 부스팅 트리에서 n_estimators 는 몇 번째 트리인지를 의미한다. epoch는 단순히 학습 횟수라 이해하면 된다.
오차와 잔차
- 오차(error): 모집단의 회귀식에서 예측된 값 - 실제 관측값
- 잔차(Residual): 표본집단의 회귀식에서 예측된 값 - 실제 관측값
GradientBoostingRegressor
- 앙상블 모델 중 부스팅을 이용한 모델을 구현한 라이브러리입니다.
- 특징
- 랜덤 포레스트와 다르게 무작위성이 없다.
- 매개변수를 잘 조정해야 하고 훈련 시간이 길다.
- 데이터의 스케일에 구애받지 않는다.
- 고차원의 희소한 데이터에 잘 작동하지 않는다.
- https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html
- 주요 파라미터
- loss: 손실합수
{‘squared_error’, ‘absolute_error’, ‘huber’, ‘quantile’}, default=’squared_error’
- learning_rate: 각 트리의 기여도를 제한하는 파라미터, 학습률
- n_estimators: 부스팅 단계를 지정하는 파라미터, 반복횟수
- subsample: 개별 기본 학습자를 맞추는 데 사용할 샘플의 비율
- loss: 손실합수
Q. 손실함수에서 absolute loss 는 지원은 하지만 squared loss 를 더 많이 사용할까요?
A. 기울기가 +, - 방향에 따라 같은 기울기가 나오기 때문에 방향은 알 수 있지만 기울기가 같아서 미분을 했을 때 방향에 따라 같은 미분값이 나와서 기울기가 큰지, 작은지 비교할 수 없습니다. 그래서 squared loss 를 더 많이 사용합니다.
(https://miro.medium.com/max/720/1*JTC4ReFwSeAt3kvTLq1YoA.webp)
**‘huber’, ‘quantile’는 결측치를 처리하는
ExtraTreesRegressor
- 앙상블 모델 중극도로 무작위화(Extremely Randomized Tree)된 모델
- 랜덤포레스트와 트리의 임계값을 정하는 기준이 내부적으로 다르다
- 주요 파라미터는 비슷하게 사옹됨()
- 특징
- 분기 지점을 랜덤하게 선택하므로 랜덤포레스트보다 속도가 더 빠름
- 1과 동일한 이유로 랜덤포레스트보다 더 많은 특성을 고려
- 렌덤포레스트와 동일한 원리를 이용하기 때문에 많은 특징 공유
- 랜덤포레스트와 비교해 성능이 미세하게 우위
- https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html
0803 실습
Q. 왜 부스팅 계열 모델이 설치가 실패하는 경우가 많을까?
A. 부스팅 계열 모델은 다른 언어로 작성되어있는데 파이썬 wrapper API를 제공하고 있다(파이썬의 접착어).구동하려면 다른 언어 환경이 함께 필요한 경우가 많습니다. 기존에 다른 도구를 설치하다가 해당 언어 환경 도구를 설치해 놨던 분들은 비교적 잘 설치가 되지만, 처음 설치할 때는 실패하는 경우가 많습니다.
conda 는 비교적 패키징이 잘 되어 있어서 관련된 환경을 잘 구성해 줍니다. 그래서 되도록이면 conda 로 설치해야 스트레스가 줄어듭니다.
배깅과 부스팅
- 배깅 방식은 부트스트래핑을 해서 트리를 병렬적으로 여러 개 만들기 때문에 오버피팅 문제에 좀 더 적합
- 개별 트리의 낮은 성능이 문제일 때는 이전 트리의 오차를 보완해 가면서 만들기 때문에 부스팅이 좀 더 적합
XGBoost
- GBT에서 병렬 학습을 지원하여 학습 속도가 빨라진 모델
- 엄청나게 많은 파라미터 지원(공식문서 참고)
lightGBM
- Light Gradient Boosting Machine의 약자인 LightGBM 은 원래 Microsoft에서 개발한 머신 러닝을 위한 오픈 소스 분산 그래디언트 부스팅 프레임워크
CatBoost
- CatBoost는 Yandex에서 개발한 오픈 소스 소프트웨어 라이브러리
- 기존 알고리즘과 비교하여 순열 기반 대안을 사용하여 범주형 기능을 해결하려고 시도 하는 그래디언트 부스팅 프레임워크
'멋쟁이사자처럼 AIS7 > 오늘코드' 카테고리의 다른 글
[1128] Confusion Matrix, Resampling, Deep Learning (2) | 2022.11.28 |
---|---|
[1123] 부스팅 3대장과 분류의 평가지표 (0) | 2022.11.23 |
[1115] Feature Engineering(3) - Benz (0) | 2022.11.15 |
[1114] Feature Engineering(2) (0) | 2022.11.14 |
[1109] Feature Engineering (0) | 2022.11.09 |
댓글