이번주는 주로 MLDSS 의 AdaBoost 를 이해하고 구현해보는 데에 시간을 썼다. TSG 에서는 새로운 것을 공부하기보단 정리와 문서작성에 집중했고, 코세라 강의 중 절반-6장-은 머신러닝쪽에서 이미 다루고 있는 Linear model 과 연관된 것이라 대강 보고 넘겼다.
MLDSS: AdaBoost-Machine Learning in Action 7장
앙상블은 더 나은 예측 결과를 얻기 위하여 여러 개의 모델을 사용하는 기법이다. 크게 Supervised learning 에 속하며, 모델을 통한 예측에 사용된다. 책에는 앙상블 학습의 두 분류로 Bagging 과 Boosting 을 설명하고 있다.
상세한 내용은 더 깊게 공부를 해야 알겠지만, 책의 설명과 위키피디아를 바탕으로 내가 이해한 내용을 정리하자면 이렇다:
Bagging
- Resampling with replacement
- D 개의 학습셋에서 중복을 허용하여 D 개의 샘플을 추출하는 시행을 K 번
- K 개의 서로 다른 학습셋으로 모델을 K 개 생성하여 Majority vote
Boosting
- Weak learner 는 랜덤보다 살짝 좋은 정도의 분류기
- 여러개의 Weak learner 를 순서대로 학습시켜 Strong learner 를 만든다
- 결과는 각 Weak learner 결과의 가중치합으로 결정
이 중에서 Boosting의 한 방법인 AdaBoost 가 이번 장의 주요 내용이다.
AdaBoost
Background
- AdaBoost: Adaptive Boosting
- Decision stump: 깊이 1짜리 Decision Tree. 구현 방법에는 여러 가지가 있을 수 있다.
- Training set: M 개의 피처벡터의 벡터 (그러니까, 행렬)
- D: 길이 M 의 가중치 벡터로, 총 합은 1.0 이다. 초기값은 모든 값이 1/M 이다.
- $\alpha$: Weak learner 의 가중치.
- N: 사용할 Weak learner 의 개수
Training
간단하게 단계만 짚어보자면,
- D 벡터 초기화
- WeightedError 게산에 D를 사용하여 Weak learner(Decision stump) 를 학습
- $\alpha$ 를 계산
- D 벡터를 갱신: 올바르게 분류한 데이터->감소, 잘못 분류한 데이터->증가
- (Weak learner, $\alpha$) 를 저장
이상을 N 번 반복
적당히 말로 설명하자면, 이전 모델이 잘못 분류한 데이터에 가중치를 높인 후 다음 모델을 학습한다. 각 모델의 가중치는 올바르게 분류한 데이터가 많을수록 높다.
$\alpha$, D 갱신하는 식은 위키피디아나 책을 찾아보면 있다.
Classify
학습에서 우리가 얻은 것은 길이 N 의 (Model, $\alpha$) 리스트-learners-이다. 분류는 쉽다. 각 모델 예측값의 weighted sum 을 구하면 된다.
sum([alpha*model.predict(x) for (model, alpha) in learners])
이 값이 0보다 큰가 작은가-binary classifier라면-를 보면 된다.
Number of estimators
Estimator(weak-learner) 수는 얼마가 적당할까? 많을수록 좋을까? Estimator 개수에 따른 Training error, Test error 변화(책의 Table 7.1)을 그래프로 그려보면 아래와 같다. 너무 많아지면 overfitting 이 발생하는 것을 알 수 있다. 적정 개수는 알아서 잘 찾아야 한다. 아래에선 대충 $10^1$~$10^2$ 사이 50 정도로 보인다.
Classification Imbalance
Precision/Recall
분류기의 성능을 단순히 CorrectlyClassified/Total 로만 측정하는 것이 부적절한 경우가 있다.
분류기의 결과는 True value, Predicted value 에 따라서 위의 4개 경우로 나뉘는데 똑같이 올바르게 분류된 경우라도 True positive, True negative 의 중요도가 다른 경우가 있다. 똑같이 False positive, False negative 의 경우도 마찬가지이다. 여기서 두 가지 값을 정의하는데, 각각
- Precision: $\frac{T P}{T P + F P}$, 답한 것 중에 얼마나 맞았는가
- Recall: $\frac{T P}{T P + F N}$, 진짜 답 중에 몇개나 맞추었는가
이다. 각각을 최대화하는 것은 어렵지 않지만 둘 모두를 높게 유지하는 것은 쉽지 않다. 적절한 trade off 포인트를 찾아야 한다. 이를 위해서 F1Score나 아래에서 설명할 ROC 와 같은 개념들을 사용한다.
ROC: Receiver Operating Characteristic
분류기의 성능을 나타내는 지표 중 하나이다. X 축을 False Positive Rate, Y 축을 True Positive Rate 로 놓고 Threshold 를 변화시켜가며 그리는 그래프이다.
- Not a scalar value! 단일 값이 아니라 그래프 이다.
- 분류기의 결과가 아니라 중간 계산값이 임계값(Threshold)에 따라 어떤 결과를 만드는가를 평가한다.
- 이 그래프를 적분한 값-그러니까 넓이-을 AUC 라고 한다. 0.5~1.0 사이의 값이며, 1.0 에 가까울수록 좋다.
Scikit-learn
Scikit-learn 에서는 역시 AdaBoost를 import, fit, predict 3단 콤보로 쓸 수 있다.
아래는 참조 링크와 예제 코드이다. ROC, AUC 까지 해 준다.
- http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html
-
from sklearn.ensemble import AdaBoostClassifier from sklearn.metrics import roc_curve, auc clf = AdaBoostClassifier(n_estimators=50) data, label = loadDataSet('machinelearninginaction/Ch07/horseColicTraining2.txt') clf.fit(data, label) print(len(data)) testData, testLabel = loadDataSet('machinelearninginaction/Ch07/horseColicTest2.txt') predicted = adaClassify(testData, classifierArray) fpr, tpr, thresholds = roc_curve(testLabel, clf.predict_proba(testData)[:,1]) plot(fpr, tpr) plot([0,1],[0,1], 'k--') print(len(testData)) print 'AUC: %f' % auc(fpr, tpr)
TSG: TAOCP Vol. 1 MMIX(2014/1Q)
이번주에는 진도를 나가지는 않고 책의 find maximum 코드에 대한 설명을 작성했다. 아직 정리가 더 필요해서 초안을 손보는 중이다.
아직은 비어 있지만 곧 여기에 정리될 예정이다.
Coursera Model Thinking
Ch 5. Thinking Electrons: Modeling people
사람의 선택을 모델링하는 데에 3가지 방법이 있다.
- Rational model: People optimiza.
- Behavior model: Just observe what they do.
- Prospect theory: 이득의 경우 위험을 회피, 손해의 경우 위험을 받아들이는 경향
- Hyperbolic Discouting: 근미래를 할인함
- Status Quo Bias: 현상유지를 더 많이 선택한다.
- [Base Rate Bias]: 숫자 두개를 골라봐 -> 왠지 두번째 숫자에 첫번째가 나올 확률이 높다고 한다
- Rule based model: People follow rules.
- 앞에서 설명했던 Schelling’s Segregation 이 한 예
Ch 6. Categorical and Linear model
ML 에서 다루던 Linear regression 쪽의 단순화 버전 정도 … ? 그냥 스킵해도 될듯
Comments