배깅과 부스팅 차이
배깅은 데이터가 동시에 분류기에 들어가고 동시에 학습을 해서 결과를 투표
텍스트부스팅은 데이터를 학습하고, 결과를 보고 가중치가 필요한 것들? 다시 모아서 다시 학습하고 순차적으로 진행되는 과정
Adaboost
순차적으로 가중치를 부여해서 최종 결과를 얻음
DecisionTree 기반의 알고리즘
GBM(Gradient Boosting Machine)
AdaBoost 기법과 비슷하지만 가중치를 업데이트할 때 경사하강법을 사용
XGBoost(eXtra Gradient Boost)
GBM에서 PC의 파워를 효율적으로 사용하기 위한 다양한 기법에 채택되어 빠른 속도와 효율을 가짐
LightGBM
XGBoost보다 빠른 속도를 가짐
Wine 데이터로 실습을 해보자
#standardscaler를 적용
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_sc = sc.fit_transform(X)
#데이터 나누기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_sc, y, test_size=0.2, random_state=13)
모든 컬럼의 히스토그램 조사
import matplotlib.pyplot as plt
wine.hist(bins=10, figsize=(15,10))
보통 잘 분포되어 있는 컬럼이 좋을 때가 많다.
quality와 다른 특성이 어떤 관련이 있는지 알아보자
column_names = ['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar',
'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density',
'pH', 'sulphates', 'alcohol']
df_pivot_table = wine.pivot_table(column_names, ['quality'], aggfunc='median')
print(df_pivot_table)

quality에 대한 다른 특성들의 상관관계는? corr로 알아보자(절댓값으로 봐야함)

taste 컬럼 분포

다양한 모델을 한번에 테스트해보자
from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier, RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
#함수명, 함수를 tuple 형으로 리스트 안에 넣음
models = []
models.append(('RandomForestClassifier', RandomForestClassifier()))
models.append(('DecisionTreeClassifier', DecisionTreeClassifier()))
models.append(('AdaBoostClassifier', AdaBoostClassifier()))
models.append(('GradientBoostingClassifier',GradientBoostingClassifier()))
models.append(('LogisticRegression',LogisticRegression()))

#결과를 저장하기 위한 작업
from sklearn.model_selection import KFold, cross_val_score
results = []; names = []
for name, model in models:
kfold = KFold(n_splits=5, random_state=13, shuffle=True) #5겹 폴딩, shuffle : 데이터를 나누기 전에 섞는 옵션
cv_results = cross_val_score(model, X_train, y_train, cv=kfold, scoring='accuracy')
results.append(cv_results)
names.append(name)
print(name, cv_results.mean(), cv_results.std())

cross-validation 결과를 확인하기 - boxplot

fig = plt.figure(figsize=(14,8))
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()
wine 데이터는 랜덤포레스트 성능이 제일 좋다
데이터마다 어떤 알고리즘의 성능이 좋은 지는 다 다르다.
#테스트 데이터에 대한 평가 결과
from sklearn.metrics import accuracy_score
for name, model in models:
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(name, accuracy_score(y_test, pred))

테스트 데이터도 랜덤포레스트 성능이 제일 좋다
아이리스 데이터로 실습해보자
from sklearn.datasets import load_iris
iris = load_iris()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, stratify=iris.target)
#kNN 학습 : 진짜 학습하는게 아니라 그냥 절차상 fit 하는
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
#accuracy
from sklearn.metrics import accuracy_score
pred = knn.predict(X_test)
print(accuracy_score(y_test, pred))
0.9666666666666667

HAR 데이터를 읽어오자

#필요 모듈 import
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) #오래걸림
일반적으로 GBM 성능 자체는 랜덤 포레스트보다는 좋다고 알려져있다
그러나 속도가 아주 느리다
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))

설치
conda install xgboost
!pip install xgboost
주요 파라미터
• nthread : CPU의 실행 스레드 개수를 조정. 디폴트는 CPU의 전체 스레드를 사용하는 것
• eta : GBM 학습률
• n_estimators
• max_depth
조기종료 파라미터
XGBoost에서 에러가 발생할 때,
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(y_train)
y_test = le.fit_transform(y_test)
이 코드를 실행시키고 진행하면 됨
그리고 fit 시킬때, X_train이 아닌 X_train.values를 넣어줘야 함
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)
확실히 GBM에 비해 빠르다
조기 종료 조건을 넣어보자
evals = [(X_test.values, y_test)]
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)


설치
conda install lightgbm
!pip install lightgbm
from lightgbm import LGBMClassifier
start_time = time.time()
lgbm = LGBMClassifier(n_estimators=400)
lgbm.fit(X_train.values, y_train, early_stopping_rounds=100, eval_set=evals)
print('Fit time : ', time.time() - start_time)

속도가 아주 빠르다