HAR 데이터로 해보는 GBM, XGBoost, LightGBM
Post
Cancel

# HAR 데이터로 해보는 GBM, XGBoost, LightGBM

## 1. GBM - Gradient Boosting Machine

### 1.1 GBM

• 부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습 예측하면서 잘못 예측한 데이터에 가중치를 부여해서 오류를 개선해 나가는 방식
• GBM은 가중치를 업데이트할때 경사 하강법을 사용하는것이 큰 차이

### 1.2 HAR 데이터로 실습

```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import pandas as pd import matplotlib.pyplot as plt url = 'https://raw.githubusercontent.com/hmkim312/datas/main/HAR/features.txt' feature_name_df = pd.read_csv(url, sep = '\s+', header = None, names = ['column_index','column_name']) feature_name = feature_name_df.iloc[:,1].values.tolist() X_train = pd.read_csv('https://raw.githubusercontent.com/hmkim312/datas/main/HAR/X_train.txt', sep = '\s+', header = None) X_test = pd.read_csv('https://raw.githubusercontent.com/hmkim312/datas/main/HAR/X_test.txt', sep = '\s+', header = None) y_train = pd.read_csv('https://raw.githubusercontent.com/hmkim312/datas/main/HAR/y_train.txt', sep = '\s+', header = None, names = ['action']) y_test = pd.read_csv('https://raw.githubusercontent.com/hmkim312/datas/main/HAR/y_test.txt', sep = '\s+', header = None, names = ['action']) X_train.shape, X_test.shape, y_train.shape, y_test.shape X_train.columns = feature_name X_test.columns = feature_name X_train.head() ```
00.288585-0.020294-0.132905-0.995279-0.983111-0.913526-0.995112-0.983185-0.923527-0.934724...-0.074323-0.298676-0.710304-0.1127540.030400-0.464761-0.018446-0.8412470.179941-0.058627
10.278419-0.016411-0.123520-0.998245-0.975300-0.960322-0.998807-0.974914-0.957686-0.943068...0.158075-0.595051-0.8614990.053477-0.007435-0.7326260.703511-0.8447880.180289-0.054317
20.279653-0.019467-0.113462-0.995380-0.967187-0.978944-0.996520-0.963668-0.977469-0.938692...0.414503-0.390748-0.760104-0.1185590.1778990.1006990.808529-0.8489330.180637-0.049118
30.279174-0.026201-0.123283-0.996091-0.983403-0.990675-0.997099-0.982750-0.989302-0.938692...0.404573-0.117290-0.482845-0.036788-0.0128920.640011-0.485366-0.8486490.181935-0.047663
40.276629-0.016570-0.115362-0.998139-0.980817-0.990482-0.998321-0.979672-0.990441-0.942469...0.087753-0.351471-0.6992050.1233200.1225420.693578-0.615971-0.8478650.185151-0.043892

5 rows × 561 columns

### 1.3 GBM import 후 실행

```1 2 3 4 5 6 7 8 9 10 11 12 13 14 from sklearn.ensemble import GradientBoostingClassifier from sklearn.metrics import accuracy_score import time import warnings warnings.filterwarnings('ignore') 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) ```
```1 2 ACC : 0.9389209365456397 Fit time : 481.2106680870056 ```
• GBM은 시간이 오래걸림. 확인하기 위해 time으로 확인해봄 (481초 나옴)
• 일반적으로 GBM은 랜덤포레스트보다 좋다고 알려져있음
• ACC는 0.938로 괜찮은편

### 1.4 GridSearch로 하이퍼파라미터 튜닝을 해보면?

```1 2 3 4 5 6 7 8 9 10 11 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) ```
```1 2 3 4 5 6 7 8 9 Fitting 2 folds for each of 4 candidates, totalling 8 fits [Parallel(n_jobs=-1)]: Using backend LokyBackend with 16 concurrent workers. [Parallel(n_jobs=-1)]: Done 4 out of 8 | elapsed: 4.5min remaining: 4.5min [Parallel(n_jobs=-1)]: Done 8 out of 8 | elapsed: 20.4min finished Fit time : 3626.6389248371124 ```
• learning_rate : 경사하강법 (Gradient Descent)에서 최저점을 찾아가기 위한 과정으로 너무크면 진동현상이 발생하고, 너무작으면 속도가 느려지며, local mininum에 빠질수 있음
• 그리고 최대 단점인 오래걸림 3600초..

### 1.5 Best 스코어와 파라미터는?

```1 grid.best_params_ ```
```1 {'learning_rate': 0.1, 'n_estimators': 500} ```
```1 grid.best_score_ ```
```1 0.9009793253536453 ```

### 1.6 Test Data의 성능확인

```1 accuracy_score(y_test, grid.best_estimator_.predict(X_test)) ```
```1 0.9419748897183576 ```
• 0.94로 괜찮게 나옴(과적합도 아닌것으로보임)

## 2. XGBoost

### 2.1 XGBoost란?

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

### 2.2 설치

• pip install xgboost
• brew install libomp (맥유저)
• XGBoost는 따로 설치를 해야함

### 2.3 주요 파라미터

• nthread : CPU의 실행 스레드 개수를 조정. 디폴트는 CPU의 전체 스레드를 사용하는것
• eta : GBM 학습률
• num_boost_rounds : n_estimators와 같은 파라미터
• max_depth

### 2.4 성능 확인

```1 2 3 4 5 6 7 from xgboost import XGBClassifier start_time = time.time() xgb = XGBClassifier(n_estimators=400 , learning_rate= 0.1, max_depth=3) xgb.fit(X_train.values, y_train) print('Fit time : ', time.time()-start_time) print('Acc : ',accuracy_score(y_test,xgb.predict(X_test.values))) ```
```1 2 Fit time : 40.31653904914856 Acc : 0.9494401085850017 ```
• fit과 predict 할때 .values를 써야함
• ACC는 0.949가 나옴

### 2.5 조기종료조건과 검증데이터 지정

```1 2 3 4 5 6 7 8 9 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) xgb.fit(X_train.values, y_train, early_stopping_rounds = 10, eval_set=evals) print('Fit time : ', time.time() - start_time) print('Acc : ',accuracy_score(y_test,xgb.predict(X_test.values))) ```
```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [0] validation_0-merror:0.17916 Will train until validation_0-merror hasn't improved in 10 rounds. [1] validation_0-merror:0.16288 [2] validation_0-merror:0.15100 [3] validation_0-merror:0.14388 [4] validation_0-merror:0.14252 [5] validation_0-merror:0.13336 ... [115] validation_0-merror:0.05972 [116] validation_0-merror:0.06006 [117] validation_0-merror:0.06006 [118] validation_0-merror:0.06006 [119] validation_0-merror:0.06006 Stopping. Best iteration: [109] validation_0-merror:0.05735 Fit time : 17.90309190750122 Acc : 0.9426535459789617 ```
• early_stopping_rounds 조기 중단을 위한 라운드를 설정, 조기 중단 기능 수행을 위해서는 반드시 eval_set과 eval_metric이 함께 설정되어야 합니다.
• eval_set : 성능평가를 위한 평가용 데이터 세트를 설정
• eval_metric : 평가 세트에 적용할 성능 평가 방법
• (반복마다 eval_set으로 지정된 데이터 세트에서 eval_metric의 지정된 평가 지표로 예측 오류를 측정)
• early_stopping을 하여도 실제 Acc는 큰 차이가 없음 0.949 -> 0.942

## 3. LightGBM

### 3.1 LightGBM

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

### 3.2 설치

• brew install lightgbm
• pip install lightgbm

### 3.3 실행

```1 2 3 4 5 6 7 from lightgbm import LGBMClassifier start_time = time.time() lgbm = LGBMClassifier(n_estimator=400) lgbm.fit(X_train.values, y_train, early_stopping_rounds=100, eval_set=evals) print('Fit time : ', time.time() - start_time) print('Acc : ',accuracy_score(y_test, grid.best_estimator_.predict(X_test.values))) ```
```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [1] valid_0's multi_logloss: 1.4404 Training until validation scores don't improve for 100 rounds [2] valid_0's multi_logloss: 1.21574 [3] valid_0's multi_logloss: 1.04795 [4] valid_0's multi_logloss: 0.913299 [5] valid_0's multi_logloss: 0.812686 [6] valid_0's multi_logloss: 0.725964 [7] valid_0's multi_logloss: 0.652995 [8] valid_0's multi_logloss: 0.591598 ... [95] valid_0's multi_logloss: 0.266265 [96] valid_0's multi_logloss: 0.26572 [97] valid_0's multi_logloss: 0.265671 [98] valid_0's multi_logloss: 0.265732 [99] valid_0's multi_logloss: 0.265704 [100] valid_0's multi_logloss: 0.264742 Did not meet early stopping. Best iteration is: [38] valid_0's multi_logloss: 0.233106 Fit time : 6.173863887786865 Acc : 0.9419748897183576 ```
• 속도가 빠름, 6초. 처음 GBM이랑 비교하면 엄청 차이남
• 성능도 0.94로 그전 GBM모델들과 큰 차이가 안남