Machine Learning in Action ch.3.2 Tree (2) & 3.3 Tree

이미지
이제 전에 얻은 단말 노드의 갯수와 단계의 갯수로 트리 전체를 플롯할 수 있다. def getTreeDepth(myTree):     maxDepth = 0     firstStr = myTree.keys()     secondDict = myTree[firstStr]     for key in secondDict.keys():         if type(secondDict[key]).__name__=='dict':#딕셔너리인지 아닌지 검사             thisDepth = 1 + getTreeDepth(secondDict[key])         else:   thisDepth = 1         if thisDepth > maxDepth: maxDepth = thisDepth     return maxDepth def plotMidText(cntrPt, parentPt, txtString):     xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]     yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]     createPlot.ax1.text(xMid, yMid, txtString, va="center", ha="center", rotation=30) def plotTree(myTree, parentPt, nodeTxt):#if the first key tells you what feat was split on     numLeafs = getNumLeafs(myTree)  #this determines...

Machine Learning in Action ch.3.2 Tree

3.2 매스플롯라이브러리 주석으로 파이썬에서 트리 플롯하기 3.2.1 매스플롯라이브러리 주석  매스플롯라이브러리에는 애너테이션이라는 훌륭한 도구를 포함하고 있다. 이 애너테이션은 그려진 플롯 내에 있는 데이터 점들을 설명할 수 있도록 주석을 추가하는 도구이다. 우리는 주석을 이용하여 트리를 플롯하는 데 사용할 것이다. 우리는 텍스트 상자에 색을 칠할 수도 있고 우리가 좋아하는 형태로 변경할 수도 있다. 텍스트 주석을 가진 트리 노드를 플롯하는 함수를 만들어보자. decisionNode = dict(boxstyle="sawtooth", fc="0.8") leafNode = dict(boxstyle="round4", fc="0.8") arrow_args = dict(arrowstyle=" def plotNode(nodeTxt, centerPt, parentPt, nodeType):     createPlot.ax1.annotate(nodeTxt, xy=parentPt,  xycoords='axes fraction',              xytext=centerPt, textcoords='axes fraction',              va="center", ha="center", bbox=nodeType, arrowprops=arrow_args ) def createPlot(inTree):     fig = plt.figure(1, facecolor='white')     fig.clf()     axprops = dict(xticks=[], yticks=[])     createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)   ...

Machine Learning in Action ch.3.1 Tree

이미지
3.1.2 데이터 집합 분할하기 이제 데이터 집합에서 어수선함을 계산하는 측정 방법을 보게 될 것이다. 분류 알고리즘을 작동하기 위해서는 엔트로피를 측정하고 데이터 집합을 분할하며, 분할된 집합의 엔트로피를 측정하고 분할이 올바르게 되었는지 확인해야 한다. def splitDataSet(dataSet, axis, value):     retDataSet=[]     for featVec in dataSet:         if featVec[axis] == value:             reducedFeatVec = featVec[:axis]             reducedFeatVec.extend(reducedFeatVec)             retDataSet.append(reducedFeatVec)     return retDataSet 위 코드에서 .append 와 .extend 는 비슷하지만 완전히 다른 함수이다. 아래의 예제를 보면 이해가 빠를 것이다. 위 분할 함수는 분할하고자 하는 데이터 집합, 분할하고자하는 속성 그리고 반환할 속성의 값을 인자로 갖고 데이터를 분할한다. 이제 데이터 분할 시 가장 좋은 속성을 선택하는 함수를 만들어야한다. def chooseBestFeatureToSplit(dataSet):     numFeatures = len(dataSet[0]) -1     baseEntopy = clacShannonEnt(dataSet)     bestInfoGain = 0.0; bestFeature = -1     for ...

python in machine learning (list, dict, tuple)

공부를 하다보니 파이썬의 리스트, 튜플, 딕셔너리의 정의나 용도의 혼란이 오기 시작했다. 그래서 정리하려 한다. 1. 리스트  a = [1,2,3,4] 리스트를 만들 때는 위에서 보는 것과 같이 대괄호([ ])로 감싸주고 안에 들어갈 값들은 쉼표로 구분해준다. 리스트는 아무것도 포한하지 않는 빈 리스트일 수도 있고. 리스트 자체를 그 요소로 가질 수도 있다. 즉, 리스트 내에는 어떠한 자료형도 포함시킬 수 있다. 리스트 인덱싱 기본적인 것은 c 언어와 동일하다. 하지만 만약 a= [1,2,3,[4,5,6]] 처럼 리스트 안의 리스트를 갖는 리스트가 존재할 때, a[3] 의 값은 [4,5,6]이다. a[3][1] 의 값은 5 이다. 데이터 핸들링 할 때 많이 쓰이는 것이 a[-1] 이다. a[-1]은 배열의 마지막 값을 가진다. 리스트 슬라이싱 a= "12345" 일 때, a[:2]의 값은 '12'이다. 파이썬은 문자열이 배열 안에 들어가면 자동적으로 슬라이싱된다. a=[1,2,3,4,5] 일 때, a[:]는 12345 모두 출력된다. 슬라이싱에는 : 와 문자열 다루는 법이 c언어와 다르다. 리스트를 더하고 반복하기 a= [1,2,3] 일 때, a*3 의 값은 a=[3,6,9] 가 아니라 a = [1,2,3,1,2,3,1,2,3] 의 값인 반복을 뜻한다. 더하기는 c언어와 같다. 리스트 관련 함수들 append sort reverse index insert remove pop : 히스트의 맨 마지막 요소를 돌려주고 그 요소는 삭제한다. count extend 2. 튜플 리스트는 [] 지만 튜플은 () 이다. 리스트는 그 값을 생성, 삭제,수정이 가능하지만 튜플은 그 값을 변화시킬 수 없다. 덧셈과 곱셈은 되는데, 뺄셈과 나눗셈은 사용할 수 없고(unsupported operand types), list처럼 i...

Machine Learning in Action ch.3 Tree

이미지
의사결정 트리는 스무고개와 비슷하다고 한다. 20개의 질문에서 예/아니오로 답해 결론적으로 질문자가 생각하는 답을 추측하는 것이다. 의사결정 트리의 장점 중 가장 좋은 것은 분류 결과를 사람이 쉽게 이해할 수 있다는 것이다. 마지막으로 우리는 분류기를 만들기 위해 재귀를 사용할 것이며, 매스플롯라이브러리를 사용하여 데이터를 표현할 것이다. 3.1 트리 구조 2학기에 자료구조를 배운 나로서는 더 이상 보고 싶지 않은 트리 구조를 마주하게 됐다... 의사결정 트리를 만들기 위해서는 하나의 최초 의사결정을 만들어야한다. 최초 의사결정은 속성으로 결정된다.  일부 의사결정 트리는 데이터를 바이너리로 분할하지만 여기서는 그렇게 하지 않는다. 4 가지 값을 가지는 속성으로 반할하게 되면 , 데이터는 4가지 방법으로 분할된다. 3.1.1 정보 이득 데이터를 분할하기 전과 후의 변화를 정보 이득이라고 한다.  어떤 속성으로 데이터를 분할할 때 가장 높은 정보 이득을 취할 수 있는지를 모든 속성에 대해 확인하며서 분할할 수 있게 된다. 데이터 집합에 대한 정보 측정 방법을 새넌 엔트로피 또 엔트로피라고 한다. l(xi) = log2p(xi) p(xi)는 xi 라는 분류항목이 선택될 확률이다. 여기서 k 는 분류 항목의 개수이다. 파이썬에서 이것을 계산하는 방법을 알아보도록 하자. from math import log def calcShannonEnt(dataSet):     numEntries = len(dataSet)     labelCounts ={}     for featVec in dataSet:         currentLabel = featVec[-1]         if currentLabel not in...

Machine Learning knn from kaggle Digit Recognizer

knn을 배워서 책의 필기체 검사하는 코드를 토대로 캐글 101 중 필기체 검사를 해보았다. 결국 혼자의 힘으로는 해내지 못했다.. 아직 파이썬 기술이 많이 부족하다는 것을 깨닫고 캐글에 올라와있는 스크립트 중에 knn을 사용하고 있는 스크립트를 갖고 돌려봤다.. 파이썬이랑 그런지 엄청 오래 걸린다.. 또 다른 스크립트들을 보면서 느낀 건 딥러닝이 너무 우세하다는 것이었다.. from numpy import * import pandas as pd from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score train_data = pd.read_csv( "C:/Users/llewyn/Downloads/train.csv" ) test_data = pd.read_csv( "C:/Users/llewyn/Downloads/test.csv" ) print ( "train data shape is : " , train_data.values.shape) print ( "test data shape is : " , test_data.values.shape) trainY = ravel(train_data.values[: 10000 , 0 ]) trainX = train_data.values[: 10000 , 1 :] trainX[trainX > 0 ] = 1 print ( "trainX[0] is :" ) print (trainX[ 0 ].reshape(( 28 , 28 ))) validY = ravel(train_data.values[ 40000 : , 0 ]) validX = train_data.values[ 40000 : , 1 :] validX[validX > 0 ] = 1 print ( "validX[0] is :" )...

Machine Learning in Action ch.2.3 K-NN

이미지
2.3 예제 : 필기체 인식 시스템 2.3.1 준비 : 이미지를 검사 벡터로 변환하기 32 x 32 로 이루어진 바이너리 이미지를 1 x 1024 벡터로 만들어야한다. 이미지를 하나의 벡터로 만드는 img2vector 함수를 보자. def img2vector(filename):     returnVect = zeros((1,1024))     fr = open(filename)     for i in range(32):         lineStr = fr.readline()         for j in range(32):             returnVect[0,32*i+j] = int(lineStr[j])     return returnVect 2.3.2 검사 : 필기체 번호에 kNN 적용하기 우리는 하나의 형태로 변환된 데이터를 가지게 되었으며, 이 데이터를 분류기로 처리할 수 있게 되었다. 책 소스코드에 있는 handwritingClassTest() 함수를 추가한다. def handwritingClassTest():     hwLabels = []     trainingFileList = listdir('trainingDigits')           #load the training set     m = len(trainingFileList)     trainingMat = zeros((m,1024))     for i in range(m):         fileNameStr = training...