Machine Learning in Action ch.9.1 & 9.2 Regression Tree

9.1 지역적으로 복잡한 데이터 모델링하기

분류에 쓰이는 의사결정 트리는 ID3라는 알고리즘을 사용했다. 
ID3는 데이터 분할하는 데에 가장 좋은 속성을 선택한다. 
그리고 그 속성이 갖고 있는 값의 갯수대로 분할하여 트리를 구축해낸다. 

그러나 ID3 알고리즘에는 연속적인 속성을 직접적으로 제어할 수 없다는 제약이 있다. 
이진 분할을 사용하면 연속적인 속성들을 제어하도록 트리 구축 알고리즘을 쉽게 적용할 수 있다. 
즉, 선택된 속성에 대한 분할 기준이 되는 값을 설정하여 이 값보다 큰 값과 작은 값으로 연속적인 속성을 두가지 값으로 이진 분할하는 것이다. 

CART 알고리즘은 이진 분할 구축과 연속적인 변화를 제어하는 알고리즘이다.


9.2 연속적이고 이산적인 속성으로 트리 구축하기

분류에 쓰인 의사결정 트리와 마찬가지고 딕셔너리를 이용해 트리를 구축할 것이다. 

우리는 두 가지 유형의 트리를 생성할 것이다. 
1번째는 회귀 트리로, 트리 각 노드에 단일한 값을 가진다.
2번째는 모델 트리로, 이는 각 단말 노드에 선형 방정식을 갖는다.

아래의 코드는 두 가지 유형의 트리에 모두 쓰이는 코드이다.

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    dataMat = []                #assume last column is target value
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = map(float,curLine) #map all elements to float()
        dataMat.append(fltLine)
    return dataMat

def binSplitDataSet(dataSet, feature, value):
    mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0]
    mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0]
    return mat0,mat1

def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering
    feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split
    if feat == None: return val #if the splitting hit a stop condition return val
    retTree = {}
    retTree['spInd'] = feat
    retTree['spVal'] = val
    lSet, rSet = binSplitDataSet(dataSet, feat, val)
    retTree['left'] = createTree(lSet, leafType, errType, ops)
    retTree['right'] = createTree(rSet, leafType, errType, ops)
    return retTree  

댓글

이 블로그의 인기 게시물

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

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

하둡 설치 오류 정리