python 연속 변수 최 적 화 된 상자 분해 실현-CART 알고리즘

변 수 는 주로 두 가지 유형 으로 나 뉜 다.감독 형 과 무 감독 형 이 있다.
대응 하 는 상자 나 누 기 방법:
A.감독 없 음:(1)등 폭(2)등 주파수(3)집합
B.감독:(1)카드 측 분상 법(ChiMerge)(2)ID3,C 4.5,CART 등 단일 변수 결정 트 리 알고리즘(3)신용 평 점 모델 링 의 IV 최대 화 분상 자 등
이 편 은 python 을 사용 하여 CART 알고리즘 을 기반 으로 연속 변 수 를 최 적 으로 나 눕 니 다.
CART 는 결정 트 리 분류 알고리즘 이기 때문에 단일 변수 결정 트 리 분류 에 해당 한다.
간단하게 이론 을 소개 하 다.
CART 는 이 진 트 리 로 매번 에 이원 만 분류 하고 연속 적 인 변수 에 대해 방법 은 인접 한 두 요소 값 의 중위 수 를 순서대로 계산 하 며 데이터 세트 를 2 로 나 누 어 이 점 을 절단 점 으로 계산 할 때 지 니 값 이 분할 전의 지 니 값 보다 떨 어 지 는 정 도 를 계산 하 는 것 이다.매번 절 분 될 때마다 지 니 의 하락 정도 가 가장 큰 점 을 최 적 화 된 절 점 으로 선택한다.절 분 된 데이터 세트 를 종료 조건 까지 같은 원칙 으로 나 누 었 다.
CART 분류의 종료 조건:실제 상황 에 따라 정 하고 제 사례 는 a.각 잎 노드 의 샘플 량>=총 샘플 량 의 5%b.내부 노드 재 구분 에 필요 한 최소 샘플 수>=총 샘플 량 의 10%로 설정 합 니 다.
python 코드 구현:

import pandas as pd
import numpy as np
 
#     ,       target  
sample_set = pd.read_excel('/    .xlsx')
 
def calc_score_median(sample_set, var):
  '''
            ,           
  param sample_set:      
  param var:       
  '''
  var_list = list(np.unique(sample_set[var]))
  var_median_list = []
  for i in range(len(var_list) -1):
    var_median = (var_list[i] + var_list[i+1]) / 2
    var_median_list.append(var_median)
  return var_median_list
var 는 상자 의 변수 이름 을 나 누 어야 한 다 는 것 을 표시 하고 샘플 변수 중 자릿수 list 를 되 돌려 줍 니 다.

def choose_best_split(sample_set, var, min_sample):
  '''
    CART               
       
  param sample_set:      
  param var:       
  param min_sample:            (    )
  '''
  #                   
  score_median_list = calc_score_median(sample_set, var)
  median_len = len(score_median_list)
  sample_cnt = sample_set.shape[0]
  sample1_cnt = sum(sample_set['target'])
  sample0_cnt = sample_cnt- sample1_cnt
  Gini = 1 - np.square(sample1_cnt / sample_cnt) - np.square(sample0_cnt / sample_cnt)
  
  bestGini = 0.0; bestSplit_point = 0.0; bestSplit_position = 0.0
  for i in range(median_len):
    left = sample_set[sample_set[var] < score_median_list[i]]
    right = sample_set[sample_set[var] > score_median_list[i]]
    
    left_cnt = left.shape[0]; right_cnt = right.shape[0]
    left1_cnt = sum(left['target']); right1_cnt = sum(right['target'])
    left0_cnt = left_cnt - left1_cnt; right0_cnt = right_cnt - right1_cnt
    left_ratio = left_cnt / sample_cnt; right_ratio = right_cnt / sample_cnt
    
    if left_cnt < min_sample or right_cnt < min_sample:
      continue
    
    Gini_left = 1 - np.square(left1_cnt / left_cnt) - np.square(left0_cnt / left_cnt)
    Gini_right = 1 - np.square(right1_cnt / right_cnt) - np.square(right0_cnt / right_cnt)
    Gini_temp = Gini - (left_ratio * Gini_left + right_ratio * Gini_right)
    if Gini_temp > bestGini:
      bestGini = Gini_temp; bestSplit_point = score_median_list[i]
      if median_len > 1:
        bestSplit_position = i / (median_len - 1)
      else:
        bestSplit_position = i / median_len
    else:
      continue
        
  Gini = Gini - bestGini
  return bestSplit_point, bestSplit_position
min_sample 매개 변 수 는 최소 잎 노드 의 견본 한도 값 이 고 이 한도 값 보다 작 으 면 절 분 하지 않 습 니 다.앞에서 말 한 바 와 같이 전체 견본 수량의 5%로 설정 합 니 다.
돌아 온 결 과 는 가장 좋 은 분할 점 만 되 돌 아 왔 습 니 다.GINI 값 과 같은 다른 것 을 되 돌려 야 한다 면 스스로 추가 할 수 있 습 니 다.

def bining_data_split(sample_set, var, min_sample, split_list):
  '''
             list
  param sample_set:      
  param var:       
  param min_sample:            (    )
  param split_list:      list
  '''
  split, position = choose_best_split(sample_set, var, min_sample)
  if split != 0.0:
    split_list.append(split)
  #           ,      
  sample_set_left = sample_set[sample_set[var] < split]
  sample_set_right = sample_set[sample_set[var] > split]
  #           2      ,            ,      
  if len(sample_set_left) >= min_sample * 2 and position not in [0.0, 1.0]:
    bining_data_split(sample_set_left, var, min_sample, split_list)
  else:
    None
  #           2      ,             ,      
  if len(sample_set_right) >= min_sample * 2 and position not in [0.0, 1.0]:
    bining_data_split(sample_set_right, var, min_sample, split_list)
  else:
    None
split_list 매개 변 수 는 되 돌아 오 는 절 분 점 을 저장 하 는 데 사 용 됩 니 다.절 분 된 후에 돌아 오 는 절 분 점 은 이 list 에 저 장 됩 니 다.
여기 서 절 분 점 분할 의 왼쪽 나무 와 오른쪽 나무 가'내부 노드 재 구분 에 필요 한 최소 견본 수>=총 견본 수량의 10%'조건 을 만족 시 키 는 지 판단 하고 만족 하면 재 귀적 호출 을 한다.

def get_bestsplit_list(sample_set, var):
  '''
             list
  param sample_set:      
  param var:       
  '''
  #         (    )
  min_df = sample_set.shape[0] * 0.05
  split_list = []
  #              
  bining_data_split(sample_set, var, min_df, split_list)
  return split_list
마지막 으로 다음 함수 호출 을 통합 하여 분할 점 list 를 되 돌려 줍 니 다.
sklearn 라 이브 러 리 의 결정 트 리 를 사용 하여 단일 변수 분 류 를 테스트 하여 결 과 를 검증 할 수 있 습 니 다.분류 방법 이 같 고 가지치기 조건 이 일치 하 는 상황 에서 결 과 는 일치 합 니 다.
이 python 은 연속 변 수 를 최 적 으로 나 누 는 상자 에 대한 상세 한 설명 을 실현 합 니 다.CART 알고리즘 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기