Machine Learning in Action ch.7.4 & 7.5 AdaBoost

7.4 전체 AdaBoost 알고리즘 구현하기

전에 구현했던 의사결정 스텀프를 가지고 AdaBoost 알고리즘을 구현할 것이다.

def adaBoostTrainDS(dataArr,classLabels,numIt=40):
    weakClassArr = []
    m = shape(dataArr)[0]
    D = mat(ones((m,1))/m)   #init D to all equal
    aggClassEst = mat(zeros((m,1)))
    for i in range(numIt):
        bestStump,error,classEst = buildStump(dataArr,classLabels,D)#build Stump
        #print "D:",D.T
        alpha = float(0.5*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in max(error,eps) to account for error=0
        bestStump['alpha'] = alpha 
        weakClassArr.append(bestStump)                  #store Stump Params in Array
        #print "classEst: ",classEst.T
        expon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messy
        D = multiply(D,exp(expon))                              #Calc New D for next iteration
        D = D/D.sum()
        #calc training error of all classifiers, if this is 0 quit for loop early (use break)
        aggClassEst += alpha*classEst
        #print "aggClassEst: ",aggClassEst.T
        aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))
        errorRate = aggErrors.sum()/m
        print "total error: ",errorRate
        if errorRate == 0.0: break
    return weakClassArr,aggClassEst


위의 알고리즘은 입력 데이터 집합, 분류항목 표시, 그리고 반복 횟수를 나타내는 매개변수를 받아 실행된다.

위 함수는 의사 결정 스텀프들로 구축되었지만, 이 부분에 다른 분류기를 사용할 수 있도록 쉽게 변경할 수 있으며, 어떠한 분류기든 동작할 수 있다.

7.5 검사 : AdaBoost로 분류하기

이제 우리는 훈련함수에 있는 약한 분류기가 학습하도록 처리하고
학습된 분류기에 사례를 적용해야한다.

약한 분류기의 결과는 각각에 해당하는 알파에 의해 가중치가 부여된다.
모든 약한 분류기로부터가중치가 부여된 결과들은 모두 함께 더해지고
가중치가 부여된 마지막 합계의 부호를 처리한다.

def adaClassify(datToClass,classifierArr):
    dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDS
    m = shape(dataMatrix)[0]
    aggClassEst = mat(zeros((m,1)))
    for i in range(len(classifierArr)):
        classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],\
                                 classifierArr[i]['thresh'],\
                                 classifierArr[i]['ineq'])#call stump classify
        aggClassEst += classifierArr[i]['alpha']*classEst
        print aggClassEst
    return sign(aggClassEst)

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리