python連続変数最適ボックス詳細を実現--CARTアルゴリズム


今日はpythonが連続変数を実現するための最適なボックス分けの詳細を共有します.CARTアルゴリズムは、良い参考価値があり、皆さんに役立つことを望んでいます.一緒に編集者について見てみましょう.変数の箱分けについては主に2つの種類に分けられます.監督型と無監督型です.
対応する箱分け方法:
A.監督なし:(1)等幅(2)等周波数(3)クラスタリング
B.監督あり:(1)カード分割箱法(ChiMerge)(2)ID 3、C 4.5、CART等の単変数決定木アルゴリズム(3)信用採点モデリングのIV最大化ボックス等
本編ではpythonを用いてCARTアルゴリズムに基づいて連続変数を最適化する
CARTは決定木分類アルゴリズムであるため,単変数決定木分類に相当する.
簡単に理論を紹介します.
CARTは二叉木であり、毎回二元分類のみを行い、連続性変数については、隣接する二元素値の中位数を順次計算し、データセットを二分割し、この点を切断点として計算する際のキニー値が分割前のキニー値より低下程度、毎回切断する際にキニー低下程度が最も大きい点を最適切断点とし、さらに、終了条件まで、分割後のデータセットを同じ原則で分割します.
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

あなたの大学を読む时に独学pythonを选んで、仕事をしてコンピュータの基础の悪い损をしたことを発见して、学歴はだめです
仕方ないことは、あさってに補うしかないので、コードの外で自分の逆襲の道を開いて、pythonの核心知識を絶えず勉強して、深く
コンピュータの基础知识を勉强して、整理して、私达のPythonの学习のボタンqun:2509333691に置いて、もしあなたも平凡ではありませんならば
ああ、私と一绪にコードの外で、成长し続けましょう!
実はここには技術だけでなく、技術以外のものもあります.例えば、
どうして1人の精緻なプログラマーをして、“キックアス”ではありませんて、プログラマー自身は高貴な1種の存在で、まさかではありませんか?[クリックして参加
]あなた自身になりたい高尚な人になりたい、がんばれ!本文は公衆番号に由来します:csdn 2299、公衆番号のプログラマー学府に注目することができることが好きです