회귀-의사 결정 트 리

4353 단어 회귀
1.개술
CART,Classification And Regression Tree,분류 와 회귀 트 리.이 모델 은 Breiman 등 이 1984 년 에 제기 했다.이 모델 에서 결정 트 리 는 이 진 트 리 이 고 각 내부 노드 는 하나의 이원 판단 에 대응 하여'진'으로 판단 하고 왼쪽 나무 로 가 며 그렇지 않 으 면 오른쪽 나무 로 간다.
1.2 GBDT
GBDT,Gradient Boosting Decision tree.경사도 향상 결정 트 리.향상 트 리 의 통합 학습 boosting 사상 을 사용 하여 경사도 하락 의 최적화 방법 을 사용 하여 CART 트 리 를 모델 로 합 니 다.참고[1]참조.
2.사상
분류 결정 트 리 와 유사 하 게 도량 분포 의 무 작위 상황 을 통 해 회귀 트 리 에서 (즉,분산*이 집합 에서 견본 수)로 측정 한다.
공식
argminj,s[∑xi∈R1(j,s)(yi−y¯)2+∑xi∈R2(j,s)(yi−y¯)2](1) (1) arg ⁡ min j , s [ ∑ x i ∈ R 1 ( j , s ) ( y i − y ¯ ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − y ¯ ) 2 ]
그 중에서 s*8712°특징 집합,j*8712°s 특징 에서 의 수치 집합,R1,R2 는 절 분 된 특징 s 와 절 분 된 값 j 절 분 된 두 개의 견본 집 s*8712°s 특징 집합,j*8712°s 특징 에서 의 수치 집합,R 1,R 2 는 절 분 된 특징 s 와 절 분 된 값 j 절 분 된 두 개의 견본 집 이다.
위조 코드
for   i in     :
    for     j in   i     :
            i        j          A B
                x
        if(      

3.코드
"""
     
     chooseBestSplit(),            .
          ,        
tolN=        , tolS=           
                      .
"""
import numpy as np
import pandas as pd

df=pd.read_csv('D:/code-study/py/diy/regression_problem_training_set.csv')
X = df.loc[:, ['feature1','feature2']]
y= np.ravel(df.loc[:, ['label']])

def chooseBestSplit(X,y):
    '''
        split_feature split_value
    :param X:
    :param y:
    :return: split_feature,split_value
    '''
    min_total_error=float('inf')
    #   for  
    for feature in X.columns:
        series_of_feature=X[feature]
        for value in set(series_of_feature):
            X1,y1,X2,y2=split_by_feature_and_value(X,y,feature,value)
            total_error=calc_error(y1)+calc_error(y2)
            if(total_errorreturn split_feature,split_value


def split_by_feature_and_value(X,y,split_feature,split_value):
    '''
      split_feature,split_value,      
    :param X:
    :param y:
    :return:      X1,y1,X2,y2
    '''
    tmp=X.copy()
    tmp['label']=y
    tmp1=tmp[tmp[split_feature]>split_value]
    tmp2=tmp[tmp[split_feature]<=split_value]
    X1=tmp1.drop('label',1) #  axis=1      'label' 
    y1=tmp1['label']

    X2=tmp2.drop('label',1)
    y2=tmp2['label']

    return X1,y1,X2,y2


def calc_error(y):
    '''
    :param y:
    :return:   *    
    '''
    return np.var(y)*len(y);

print(chooseBestSplit(X,y))

코드 변경 참고<>,[미]Peter Harrington,P164.
레 퍼 런 스
my blog,통합 학습-GDDT

좋은 웹페이지 즐겨찾기