ML - 13. GBM - Gradient Boosting Machine

jaam._.mini·2024년 1월 31일
0

[이번에 사용한 데이터] : HAR_dataset

import pandas as pd
url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/HAR_dataset/features.txt'

# '\s+' 공백, header 그대로, 컬럼 이름 names
feature_name_df = pd.read_csv(url, sep='\s+', header=None, names=['columns_index','columns_name'])

# 밸류만 가지고 feature_name 추출 -> 즉, 앞으로 561개의 이름만 저장하게 됨
feature_name = feature_name_df.iloc[:, 1].values.tolist()

X_train_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/HAR_dataset/train/X_train.txt'
X_test_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/HAR_dataset/test/X_test.txt'
X_train = pd.read_csv(X_train_url, sep='\s+', header=None)
X_test = pd.read_csv(X_test_url, sep='\s+', header=None)

X_train.columns = feature_name
X_test.columns = feature_name

y_train_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/HAR_dataset/train/y_train.txt'
y_test_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/HAR_dataset/test/y_test.txt'
y_train = pd.read_csv(y_train_url, sep='\s+', header=None, names=['action'])
y_test = pd.read_csv(y_test_url, sep='\s+', header=None, names=['action'])

GBM


GBM - Gradient Boosting Machine

  • 부스팅 알고리즘은 여러 개의 약한 학습기(week learner)를 순차적으로 학습-예측하면서
    잘못 예측한 데이터에 가중치를 부여해서 오류를 개선해가는 방식
  • GBM은 가중치를 업데이트할 때 경사 하강법(Gradient Descent)을 이용하는 것이 큰 차이
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score
import time
import warnings

warnings.filterwarnings('ignore')
# GradientBoostingClassifier
start_time = time.time()

gb_clf = GradientBoostingClassifier(random_state=13)
gb_clf.fit(X_train, y_train)
gb_pred = gb_clf.predict(X_test)

print('ACC : ', accuracy_score(y_test, gb_pred))
print('Fit time : ', time.time() - start_time)

다른 분들은 40분만에 결과를 볼 수 있었다고 했는데..
난 저녁 약속을 다녀와도 계속 running 중이라 멈출 수 밖에 없었다....🙄

# GridSearch로 조금 더 찾아보자~
from sklearn.model_selection import GridSearchCV

params = {
    'n_estimators' : [100,500],    'learning_rate' : [0.05, 0.1]
}

start_time = time.time()
grid = GridSearchCV(gb_clf, param_grid=params, cv=2, verbose=1, n_jobs=-1)
grid.fit(X_train, y_train)
print('Fit time : ', time.time() - start_time)
# test 성능
accuracy_score(y_test, grid.best_estimator_.predict(X_test))
# test 성능
accuracy_score(y_test, grid.best_estimator_.predict(X_test))

XGBoost


  • XGBoost는 트리 기반의 앙상블 학습에서 가장 각광받는 알고리즘 중 하나
  • GBM 기반의 알고리즘인데, GBM의 느린 속도를 다양한 규제를 통해 해결
  • 특히 병렬 학습이 가능하도록 설계됨
  • XGBoost는 반복 수행 시마다 내부적으로 학습데이터와 검증데이터를 교차검증을 수행
  • 교차검증을 통해 최적화되면 반복을 중단하는 조기 중단 기능을 가지고 있음

파라미터 종류 - nthread : CPU의 실행 스레드 개수를 조정. 디폴트는 CPU의 전체 스레드를 사용하는 것 - eta : GBM 학습률 - num_boost_rounds : n_estimators와 같은 파라미터 - max_depth
!pip install xgboost
from xgboost import XGBClassifier

start_time = time.time()
xgb = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)

# numpy array 값을 받아들이기 때문에, values 값만 넣어야 한다.
xgb.fit(X_train.values, y_train)
print('Fit time : ', time.time() - start_time)

# 289.586 나옴
accuracy_score(y_test, grid.best_estimator_.predict(X_test.values))
#0.9392 나옴
# 조기 종료 설정 (early_stopping_round)

from xgboost import XGBClassifier

evals = [(X_test.values, y_test)]

start_time = time.time()
xgb = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)

# numpy array 값을 받아들이기 때문에, values 값만 넣어야 한다.
# early_stopping_rounds=10 : 같은 성능으로 10번 이상 비슷한 값이 나오면 종료 해라
xgb.fit(X_train.values, y_train, early_stopping_rounds=10, eval_set=evals)
print('Fit time : ', time.time() - start_time)

LightGBM


  • LightGBM은 XGBoost와 함께 부스팅 계열에서 가장 각광받는 알고리즘
  • LGBM의 큰 장점은 속도
  • 단, 적은 수의 데이터에는 어울리지 않음 (일반적으로 10000건 이상의 데이터가 필요하다고 함)
  • GPU 버전도 존재함
!pip install lightgbm
start_time = time.time()
from lightgbm import LGBMClassifier
import time

evals = [(X_test.values, y_test)]

start_time = time.time()
lgbm = LGBMClassifier(n_estimators=400)
lgbm.fit(X_train.values, y_train,eval_set=evals)
print('Fit time : ', time.time() - start_time)
profile
비전공자의 데이터 공부법

0개의 댓글