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 코드들 바꾸다가 배고파서 안하기로 했다.
댓글
댓글 쓰기