Machine Learning in Action ch.5.3 Logistic Regression

5.3 예제 : 말의 배앓이 치사율 평가하기

이번 예제에는 배앓이하는 말이 죽을 것인지 살 것인지를 예측하는 문제로 로지스틱 회귀를 사용한다. 속성이 28개인 368개의 사례로 되어있다.

말의 생사를 예측하기 위해 로지스틱 회귀와 확률 기울기 상승을 사용할 것이다.


5.3.1 준비 : 데이터에서 누락된 값 다루기

데이터 내에 누락된 값이 있다는 것은 큰 문제이다.

여기에 몇 가지 선택 사항이 있다. 

1) 사용 가능한 모든 데이터에서 속성의 평균값을 사용한다.
2) 알려지지 않은 값은 -1과 같은 특별한 값으로 채운다.
3) 사례를 무시한다.
4) 유사한 아이템들로부터의 평균값을 사용한다.
5) 값을 예측하기 위해 다른 기계 학습 알고리즘을 사용한다.

전처리 동안에는 리스트 내에 두 가지를 처리하고록 했다.

첫째, 알 수 없는 값을 실질적인 수로 대체. Numpy 배열은 누락된 값은 처리할 수 없다.

두번째, 검사 데이터에 분류 항목 표시가 누락되어 있는 경우, 무시한다.
하지만 kNN은 무시가 불가능하다. 로지스틱 회귀는 가능.

5.3.2 검사 : 로지스틱 회귀로 분류하기

로지스틱 회귀를 가지고 사례를 분류하기 위해 많은 것을 할 필요는 없다. 
이전에 최적화된 가중치로 곱해진 검사 벡터를 시그모이드로 계산하는 것이 전부다.
만약에 시그모이드 함수가 0.5보다 큰 값을 제공해준다면 분류 항목은 1이고 아니면 0이다.

말의 배앓이 예측을 실습하기 위해 함수들을 만든다.

def classifyVector(inX, weights):
    prob = sigmoid(sum(inX*weights))
    if prob > 0.5: return 1.0
    else: return 0.0

def colicTest():
    frTrain = open('horseColicTraining.txt'); frTest = open('horseColicTest.txt')
    trainingSet = []; trainingLabels = []
    for line in frTrain.readlines():
        currLine = line.strip().split('\t')
        lineArr =[]
        for i in range(21):
            lineArr.append(float(currLine[i]))
        trainingSet.append(lineArr)
        trainingLabels.append(float(currLine[21]))
    trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)
    errorCount = 0; numTestVec = 0.0
    for line in frTest.readlines():
        numTestVec += 1.0
        currLine = line.strip().split('\t')
        lineArr =[]
        for i in range(21):
            lineArr.append(float(currLine[i]))
        if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):
            errorCount += 1
    errorRate = (float(errorCount)/numTestVec)
    print "the error rate of this test is: %f" % errorRate
    return errorRate

def multiTest():
    numTests = 10; errorSum=0.0
    for k in range(numTests):
        errorSum += colicTest()
    print "after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests))
        
1번째 함수는 가중치와 입력 벡터를 가지고 시그모이드 계산한다.
2번째 함수는 검사 집합과 훈련 집합을 열어 데이터를 제대로 된 형식으로 만든다.
3번째 함수는 10번 실행하여 평균을 계산한다.

책에서는 오류율이 35%나온다.
나는 파이썬 버젼2 코드들 바꾸다가 배고파서 안하기로 했다.


댓글

이 블로그의 인기 게시물

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

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

하둡 설치 오류 정리