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 알고리즘 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.