딥러닝 이미지 영상 비정형데이터
머신러닝 정형데이터=table데이터=엑셀데이터
여러 모델을 돌려 고성능인 것을 찾는 것이 아니다!(특별한 경우를 제외하고)
모델이 바뀌는 것은 작업프로세스상 중요한 것이 아니다!
=> 결국 집중해야 할 것은 데이터!!! 데이터 그 자체에 집중하고 데이터에서 답을 얻자
: 여러 개의 학습기를 생성하고 그 예측을 "결합"함으로써 보다 정확한 예측을 도출하는 기법
: 전통적으로 Voting(보팅), Bagging(배깅), Boosting(부스팅), 스태깅 등으로 나눔
결정방법
-하드보팅: 다수결
-소프트보팅
: 확률의 평균을 취해 높은것 채택
: but 확률의 평균이 동률일 경우 다수결
: 전체 데이터셋에 여러 모델(알고리즘)을 돌려 결정. 다수결의 원칙으로 선택
: 데이터셋을 랜덤하게 샘플링하여 똑같은 모델(알고리즘)을 돌려 결정.
bagging계열에 앙상법 기법은 Decision Tree알고리즘을 사용
샘플링해서 추출하는 방식을 부트스트래핑(bootstrapping)분할 방식(중복 허용)
: 여러 개의 (약한)학습기가 순차적으로 학습. 앞에서 학습한 예측이 틀린 데이터에 대해 다음 학습기에 가중치를 부여해 오류를 개선해 학습 진행
(약한)분류기? 속도가 빠르지만 성능이 떨어지는. 예로 math_depth가 2
인 decision tree
Adaboost
: Decision Tree 기반 순차적 가중치 부여해 최종 결과
GBM(Gradient Boost 그래디언 부스트)
: 가중치를 업데이트할 때 경사하강법(Gradient Descent)이용
(일반적으로 성능이 랜덤 포레스트보다 좋음. But 속도가 아주 느림)
XGBoost(eXtra Gradient Boost)
: 트리 기반의 앙상블 학습에서 가장 각광받는 알고리즘 중 하나로 GBM 기반의 알고리즘. 느린 속도를 다양한 규제로 해결. 특히 병렬 학습 가능. 반복 수행 시마다 교차검증(최적화시 조기 중단)
- 주요 파라미터
LightGBM
: 가장 각광받는 알고리즘 중 하나. 큰 장점은 속도!
(단, 적은 수의 데이터에는 어울리지 않음)
from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier, RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
models= []
models.append(('RandomForestClassifier', RandomForestClassifier()))
models.append(('DecisionTreeClassifier', DecisionTreeClassifier()))
models.append(('AdaBoostClassifier', AdaBoostClassifier()))
models.append(('GradientBoostingClassifier', GradientBoostingClassifier()))
models.append(('LogisticRegression', LogisticRegression()))
# 튜플형태로 models리스트에 넣음
%%time #모델 돌리는데 시간 확인이 가능함
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)
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())
fig = plt.figure(figsize=(14,8))
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()
# 테스트 데이터
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))