Machine Learning in Action ch.2.2 K-NN (2)

2.2.3 준비 : 수치형 값 정규화하기

서로 다른 범위에 놓여있는 값을 다룰 경우에는 이들을 정규화하는 것이 일반적이다.
정규화 범위는 대개 0에서 1로 정한다.
0에서 1로 모든 것의 크기를 변경하기 위해서는 다음과 같은 공식을 적용해야한다.

mewValue = (oldValue - min) / (max- min)

autoNorm()이라고 하는 새로운 함수는 자동적으로 데이터를 0과 1 사이의 값으로 정규화하는 함수이다.

def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m,1))
    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide
    return normDataSet, ranges, minVals

2.2.4 검사 : 전체 프로그램으로 분류기 검사하기

기계학습에서 한 가지 공통된 작업은 알고리즘의 성능을 평가하는 것이다. 

성능을 평가하는 한 가지 방법은 현재 가지고 있는 데이터의 일부분, 즉 90% 정도를 가지고
분류기의 학습에 사용하는 것이다.

그런 다음 나머지 10%의 데이터를 가지고 분류기를 검사하여, 분류기의 성능이 어느 정도인지 알아본다.

이제 데이트하기 사이트를 위한 분류기 검사 코드를 볼 것이다.

def datingClassTest():
    hoRatio = 0.10      #hold out 10%
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')       #load data setfrom file
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
        if (classifierResult != datingLabels[i]): errorCount += 1.0
    print ("the total error rate is: %f" % (errorCount/float(numTestVecs)))
    print (errorCount)


책에서는 오류율이 2.4%였는데 왜 난 5%인지 잘 모르겠다...

책은 파이썬 2라서 여러가지 함수를 파이썬 3에 맞게 수정하다보니 그렇게 된 듯 하다.


2.2.5 사용 : 모두에게 유용한 시스템 만들기

지금까지 우리의 데이터를 가지고 분류기를 검사했다면 , 이제는 실질적으로 고객을 위해 사람을 분류하는 데 사용해 볼 것이다.

아래의 코드가 고객이 어떤 사람들 찾아 그 사람의 정보를 입력하면 프로그램은 고객이 그 사람을 얼마나 좋아하게 될 것인지 예측하는 코드이다.

def classifyPerson():
    resultList = ['not at all','in small doses','in large doses']
    percentTats = float(input("percentage of time spent playing video games?"))
    ffMiles = float(input("frequent filer miles earmed per year?"))
    iceCream = float(input("liters of ice cream consumed per year?"))
    datingDataMat, datingLabels = file2matrix()
    norMat , ranges, minVals = autoNorm(datingDataMat)
    inArr = array([ffMiles,percentTats, iceCream])
    classifierResult = classify0((inArr - minVals)/ranges , norMat,datingLabels,3)
    print "You will probably like this person : ", resultList[int(classifierResult)-1]

이 책이 파이썬 2 로 쓰여져 있어서 코드 바꾸는데 공부도 되지만 힘들다 ㅠ

위 코드를 실행시키고 아래와 같은 입력 값을 넣어보면 
조금 좋아할 것이라는 예측이 나온다.

코드를 다시 전체적으로 이해 한 번 하고 넘어가야 겠다..



다음에는 필기체 이미지를 인식하는 시스템을 만들어볼 것이다.

출처 : 머신러닝 인 액션 책

댓글

이 블로그의 인기 게시물

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

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

하둡 설치 오류 정리