특성 자동 선택

  • 유용한 특성만 선택하고 나머지는 줄이는 방향이 좋음
  • 특성 선택 방법 : 일변량 통계, 모델 기반 선택, 반복적 선택

 

1. 일변량 특성선택 

타겟과 변수간의 통계적 의미를 기반으로 유의미한 변수 선택

 

  • chi2: 카이제곱 검정 통계값
  • f_classif: 분산분석(ANOVA) F검정 통계값
  • mutual_info_classif: 상호정보량(mutual information)

 

단일 변수 선택법은 각각의 독립변수를 하나만 사용한 예측모형의 성능을 이용하여 가장 분류성능 혹은 상관관계가 높은 변수만 선택하는 방법이다. 사이킷런 패키지의 feature_selection 서브패키지는 다음 성능지표를 제공한다.

하지만 단일 변수의 성능이 높은 특징만 모았을 때 전체 성능이 반드시 향상된다는 보장은 없다.

아래 일변량 변수선택 예제이다. 

 

from sklearn.feature_selection import SelectPercentile

# SelectPercentile을 사용하여 특성의 50%를 선택하는 모델 생성
select = SelectPercentile(percentile=50)

# 특성 선택
select.fit(X_train, y_train)
X_train_selected = select.transform(X_train)

 

 

feature_selection 서브패키지는 성능이 좋은 변수만 사용하는 전처리기인 SelectKBest 클래스도 제공한다. 

from sklearn.feature_selection import chi2, SelectKBest


%%time

selector1 = SelectKBest(chi2, k=14330)
X_train1 = selector1.fit_transform(X_train, y_train)
X_test1 = selector1.transform(X_test)

model = BernoulliNB()
model.fit(X_train1, y_train)
print("train accuracy:{:5.3f}".format(accuracy_score(y_train, model.predict(X_train1))))
print("test accuracy :{:5.3f}".format(accuracy_score(y_test, model.predict(X_test1))))

2. 모델 기반 특성선택

 

  • 지도 학습 머신러닝 모델을 사용하여 특성의 중요도를 평가, 가장 중요한 것만 선택 (최종학습과는 무관함, 모델이 같을 필요 없음)
  • 해당 모델은 각 특성의 중요도를 측정하여 순서로 매길 수 있어야 함
  • 결정트리 기반의 모델들은 각 특성의 중요도를 featureimportances에 저장하므로 이를 활용할 수 있음
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier

# (지도 학습 모델로 계산된) 중요도가 지정한 임계치보다 큰 모든 특성 선택하는 모델제작
# 절반 가량의 특성이 선택될수 있도록 중간값을 임계치로 사용
select1 = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=0),
                         threshold='median')

# 특성 선택
select1.fit(X_train, y_train)
X_train_selected1 = select1.transform(X_train)

 

3. 반복적 특성선택

 

  • 특성을 하나도 선택하지 않은 상태로 시작해 어떤 종료 조건을 도달할 때까지 하나씩 추가하는 방법
  • 모든 특성을 가지고 시작해 어떤 종료 조건이 될 때까지 하나씩 제거하는 방법
  • 두 가지 방법 중 하나를 활용해 특성을 결정한다.

 

from sklearn.feature_selection import RFE

# 특성 선택
select2 = RFE(RandomForestClassifier(n_estimators=100, random_state=0),
             n_features_to_select=40)

# 특성 선택
select2.fit(X_train, y_train)
X_train_selected2 = select2.transform(X_train)

 

 

reference: https://inuplace.tistory.com/618

 

[scikit-learn 라이브러리] 특성 자동 선택

특성 자동 선택 특성이 너무 많아지면 모델이 복잡해지고 과대적합 가능성이 올라간다. 따라서 유용한 특성만 선택하고 나머지는 무시해서 특성의 수는 줄이는 것이 좋다. 특성 선택 방법 : 일

inuplace.tistory.com

https://datascienceschool.net/03%20machine%20learning/14.03%20%ED%8A%B9%EC%A7%95%20%EC%84%A0%ED%83%9D.html

 

특징 선택 — 데이터 사이언스 스쿨

.ipynb .pdf to have style consistency -->

datascienceschool.net

https://dyddl1993.tistory.com/18

 

변수 선택 기법(Feature Selection Method)

변수 선택 기법(Feature Selection Method) 모델을 돌릴 때 쓸모 없는 변수들을 제거함으로써 모델의 속도 개선, 오버피팅 방지 등의 효과를 얻기 위해 사용하는 방법. Feature Selection의 3가지 방법 1. Wrappe

dyddl1993.tistory.com

 

https://light-tree.tistory.com/8

 

파이썬(python) importlib, __import__(), getattr 을 사용하는 입력으로 동적 import

개발을 진행하다 import를 사용자의 입력에 따라 동적으로 사용하고 싶은 경우가 생겼습니다. 파이썬에서 동적 import 하는 방법을 공부했고, 정리하고자 합니다. * 모듈(module)은 클래스, 함수, 변수

light-tree.tistory.com

 

https://jh-bk.tistory.com/29

 

'Python > 기초' 카테고리의 다른 글

함수, 클래스, 모듈, 패키지 간단 개념  (0) 2023.06.06
Pandas 사용 함수  (0) 2022.04.22
각 type별 함수 사용  (0) 2022.04.19
파이썬 나아가기  (0) 2019.09.05
Python 프로그램 입출력하기  (0) 2019.09.05

python
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

train_data = lgb.Dataset(X_train, label=y_train)

parameters = {
    'objective': 'multiclass',
    'num_class': 3,
    'metric': 'multi_logloss',
    'boosting_type': 'gbdt',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9
}

lgb_model = lgb.train(parameters,
                      train_data,
                      valid_sets=[train_data],
                      num_boost_round=100,
                      early_stopping_rounds=10)

y_pred = lgb_model.predict(X_test)
y_pred = [list(x).index(max(x)) for x in y_pred]

accuracy = accuracy_score(y_test, y_pred)

print(f"Accuracy: {accuracy}")

'데이터분석 > 머신러닝' 카테고리의 다른 글

일반화된 분산팽창지수(Generalized VIF)  (0) 2023.09.13
Multiclassification imbalance problem improvement  (0) 2023.08.02
LGBM 이해  (0) 2023.06.18
엔트로피  (0) 2023.06.16
TPE 알고리즘  (0) 2023.06.12

Light GBM 

light gradient boosting model의 장점은 말 그대로  속도가 빠르며, GPU 계산을 지원하는 것입니다. 

Leaf-wise model(아래로 tree를 확장하는 구조, 다른 tree 모델은 수평적으로 확장)이며 max loss 를 가지는 리프노드를 계속적으로 분활하여 생성한다. => 틀린 부분에 가중치를 더해 학습한다. 

 

LGBM 생성방식
일반 boosting 생성 방식

부스팅

부스팅은 기존에 있는 예측기를 조금씩 발전시켜서 여러 트리를 합하여 의사결정하는 방식이다.

두가지 방식이 있는데, 

1. adaboost: 중요한 데이터에 weight를 주는 방식 

2. GBDT: 딥러닝의 loss function처럼 오차를 훈련시켜 gradient를 활용해 모델을 개선하는 방식 (XGboost, LGBM이 이런 방식)

 

Gradient Boosting Decision Tree

decision tree를 만들때,  gradient boosting을 활용한다. 

손실함수를 가장 큰폭으로 줄일 수 있는 부분에서 leaf를 나눈다. 

 

GOSS(Gradient Based One-Side Sampling)

 

GBDT에서는 기울기(Gradient)로 학습을  한다. 각 데이터 별로 기울기가 작으면 훈련 오차가 작다는 것을 의미하므로, 이는 학습이 잘 되었다는 뜻이다.

  • 큰 Gradient(훈련이 잘 안된)를 갖는 데이터 개체들은 원하는 만큼 남겨두고(예를 들어, 30%, a = 0.3), 작은 Gradient를 갖는 데이터 개체들에서는 무작위 샘플링을 진행한다. 이때 작은 gradient 데이터셋에서 일부를 버림. 그래서 이런 방법은 작은 gradient만 drop하는 one-side sampling 이다. 
  • 하지만 만약 gradient가 적다고 해서 버려버리면, 데이터 분포자체가 왜곡되기 때문에 이 상태에서 훈련하면 정확도가 낮아지게 되는데 따라서 낮은 gradient의 값들(예를 들어, 10%, b= 0.1)은 가져와서 버린 샘플만큼 뻥튀기한다. 1 – a / b 를 곱해서 수를 맞춰준다. 
  • 일단 제일 큰 gradient를 가지는 (절대값으로) 놈부터 랭크를 시킨다. 그리고 큰 gradient를 가지는 애들은 100%를 취하고(예시로는, 전체의 30% 모두 사용), 작은 gradient 애들은 작은 비율만 선택한다. a와 b는 임의 선택.
  • 그리고 분기를 계산할때는 보통은 분산을 계산하게 되는데 아무래도 gradient가 적은 데이터는 샘플링이 되었으므로 적어진 비율만큼 다시 1 – a / b 를 반영해주어 분산을 계산한 후, 정보이득이 제일 큰 쪽으로 분기를 한다.

 

참고: http://machinelearningkorea.com/2019/09/25/lightgbm%EC%9D%98-%ED%95%B5%EC%8B%AC%EC%9D%B4%ED%95%B4/

 

'데이터분석 > 머신러닝' 카테고리의 다른 글

Multiclassification imbalance problem improvement  (0) 2023.08.02
LightGBM multiclassification code  (0) 2023.06.20
엔트로피  (0) 2023.06.16
TPE 알고리즘  (0) 2023.06.12
하이퍼파라매터 튜닝 (경험적)  (0) 2023.06.12

https://study2give.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%86%90%EC%8B%A4%ED%95%A8%EC%88%982-%EC%97%94%ED%8A%B8%EB%A1%9C%ED%94%BCEntropy

'데이터분석 > 머신러닝' 카테고리의 다른 글

LightGBM multiclassification code  (0) 2023.06.20
LGBM 이해  (0) 2023.06.18
TPE 알고리즘  (0) 2023.06.12
하이퍼파라매터 튜닝 (경험적)  (0) 2023.06.12
Hyperband  (0) 2023.05.31

https://hoonst.github.io/2020/11/15/Algorithms-for-Hyperparameter-Optimization/

'데이터분석 > 머신러닝' 카테고리의 다른 글

LGBM 이해  (0) 2023.06.18
엔트로피  (0) 2023.06.16
하이퍼파라매터 튜닝 (경험적)  (0) 2023.06.12
Hyperband  (0) 2023.05.31
베이지안 최적화(Bayesian Optimization)  (0) 2023.05.31

https://velog.io/@suminwooo/%EB%AA%A8%EB%8D%B8-%ED%8A%9C%EB%8B%9D1

'데이터분석 > 머신러닝' 카테고리의 다른 글

엔트로피  (0) 2023.06.16
TPE 알고리즘  (0) 2023.06.12
Hyperband  (0) 2023.05.31
베이지안 최적화(Bayesian Optimization)  (0) 2023.05.31
Feature sore 구축 - Feast  (1) 2023.05.09

https://hyunsitstory.tistory.com/entry/python-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%AA%A8%EB%93%88-%ED%95%A8%EC%88%98-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

'Python > 기초' 카테고리의 다른 글

동적 import가 필요할때 - importlib  (0) 2023.07.04
Pandas 사용 함수  (0) 2022.04.22
각 type별 함수 사용  (0) 2022.04.19
파이썬 나아가기  (0) 2019.09.05
Python 프로그램 입출력하기  (0) 2019.09.05

Bayesian Optimization 방법은 좋은 성능에 비해 느리다는 단점이 있다. 게다가 sequential하게 진행되는 거라 병렬처리도 어렵다.

이를 개선할 수 있는 방법으로 hyperband가 있으며 빠르며 좋은 성능을 보여준다. Hyperband는 Successive HAlving(SHA) 방법을 기반으로 한다.

 

1. SHA(Succesive HAlving Algorithm)

 

Bandit 기반의 하이퍼파라메터 최적화 기법이다. MAB(Multi Armed Bandit)문제를 해결하는데 두가지 방법이 있다. 

한가지는 가장 큰 보상을 찾는 팔을 찾는 법, 다른 하나는 Exploitation-Exploration trade-off를 해결하는 것이다. 

SHA는 전자인 Best Armed Identification에 기반을 두고 있다. 

 

SHA는 주오진 Budget안에서 hyperparamter 조합을 랜덤하게 선택하여 loss를 평가한다. budget을 늘려가면서 성능이 떨어지는 비율을 정해 hyperparameter조합을 제거해나가는 방법이다. 이 방법은 몇개의 hyperparamter로 시작하지, 어떤 구간에서 줄여나갈지를 정해줘야한다. 이를 개선한것이 hyperband알고리즘이다. 

 

 

2. hyperband 알고리즘

 

 

https://pod3275.github.io/paper/2019/05/23/Hyperband.html

 

Hyperband; A Novel Bandit-Based Approach to Hyperparameter Optimization 정리

Hyperband; A Novel Bandit-Based Approach to Hyperparameter Optimization 정리 저자 : Lisha Li, Kevin Jamieson, Giulia DeSalvo,Afshin Rostamizadeh, Ameet Talwalka...

pod3275.github.io

https://simpling.tistory.com/52

 

다양한 Hyperparameter Optimization 방법 리뷰

Machine Learning 알고리즘들은 강력한 성능을 보여주고 있다. 하지만 데이터가 커지면서 좋은 HyperParameter(HP)를 찾는 것은 점점 비용이 많이 드는 어려운 문제가 되었다. 보통 찾아야 하는 HP는 여러

simpling.tistory.com

https://repositorio.pucrs.br/dspace/bitstream/10923/15244/2/Bandit_Based_Automated_Machine_Learning.pdf

 

Hyperparamter optimization

 

학습을 수행하기 전 hyperparameter설정을 하는데 이때 최적값을 탐색하는 문제해결법을 지칭한다. 

방법으로는 Manual, Grid, Random Search와 Bayesian optimization이 있다. 

 

1. Manual Search

일반적으로 하이퍼파라메터 탐색시 잘 알려진 노하우를 기반하여 hyperparameter를 설정하고 검증데이터셋(validation set)의 측정 결과를 성능으로 기록한다.

여러 시도 중 가장 높은 성능을 준 하이퍼파라메터를 선택했을 것이고 이런 방법을 Manual Search라고 한다. 

단점은 찾은 최적의 hyperparameter 값이 ‘실제로도’ 최적이라는 사실을 보장하기가 상대적으로 어렵다는 단점이 있고 또한, 여러 종류의 hyperparameter를 탐색할때 서로간의 상호영향관계를 나타내는 파라메터들도 존재하기 때문에 둘 ㅣ상의 파라메터를 탐색시 직관을 이용하기 어렵고 문제가 더욱 복잡해질 수 있는 단점이 있다. 

 

2. Grid Search

특정 구간 내의 후보 hyperparameter 값의 일정한 interval을 두고 이들 각각에 대하여 측정한 성능 결과를 기록한 뒤, 가장 높은 성능을 발휘했던 hyperparameter 값을 선정하는 방법이다. 

모든 경우의 수에 대해 평가 결과가 가장 좋은 hyperparameter세트를 찾는 방법이다. 

전역적인 탐색이 가능하다는 장점이 있지만, hyperparameter개수를 여러종류 가져가면 시간이 기하급수적으로 증가하는 단점이 있다. 

 

3. Random Search

 

탐색 대상 구간 내의 후보 hyperparameter 값들을 랜덤 샘플링(sampling)을 통해 선정한다는 점이 다릅니다.

탐색 대상 구간 내 후보 hyperparameter 값들을 랜덤 샘플링해서 선정하는 방법이다.

Grid Search에 비해 불필요한 반복 수행 횟수를 대폭 줄이면서, 동시에 정해진 간격(grid) 사이에 위치한 값들에 대해 동일한 확률로 탐색이 가능하며 최적의 hyperparameter 값을 더 빨리 찾는 장점이 있다. 

랜덤하게 선택하여 학습한 뒤 가장 좋은 parameter를 고를 수 있지만 여전히 불필요한 탐색을 반복하기도 한다. 

왜냐하면 다음에 시도할 hyperparameter 값을 선정하는데 이전 정보를 반영하지 않기 때문이다. 이를 개선한 것으로 전체적인 탐색을 가능하게 하며 사전지식까지 반영할 수 있는 Bayesian Optimization이 있다. 

 

4. Bayesian Optimization 

입력값 x 를 받은 목적함수 f(x)를 만들어 f(x)를 최대로 만드는 최적해를 찾는 것을 목적으로 한다. 

목적함수와 하이퍼파라메터 쌍을 대상으로 대체 모델을 만들고 하이퍼파라메터를 업데이트 해가면서 최적의 조합을 탐색한다. 

필요한 요소

- surrogate model은 여러 (x, f(x))로 확률적인 추정을 수행하는 모델이 필요하다. 

-  Acquisition Function은 확률적 추정 결과를 바탕으로 최적 입력값을 찾는데 있어 가장 유용할만한 다음 입력값을 추천해주는 함수이다. 

 

Expected Improvement(EI)는 Exploitation과 Exploration을 둘다 일정수준 포함하도록 설계한 것이고 이떄 많이 쓰이는게 Acquisition function이다. 

 

출처: https://wooono.tistory.com/102

'데이터분석 > 머신러닝' 카테고리의 다른 글

하이퍼파라매터 튜닝 (경험적)  (0) 2023.06.12
Hyperband  (0) 2023.05.31
Feature sore 구축 - Feast  (1) 2023.05.09
Successive Halving Algorithm(SHA) 이해  (0) 2023.05.02
Multi-Armed Bandit(MAB)  (0) 2023.05.02

+ Recent posts