連續變數最優分箱 基於CART演算法

2021-08-29 14:18:22 字數 4761 閱讀 9746

關於變數分箱主要分為兩大類:有監督型和無監督型

對應的分箱方法:

a. 無監督:(1) 等寬 (2) 等頻 (3) 聚類

b. 有監督:(1) 卡方分箱法(chimerge) (2) id3、c4.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')

defcalc_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]) /

2return var_median_list

var表示需要進行分箱的變數名,返回乙個樣本變數中位數的list

defchoose_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.0for 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值,可以自行新增。

defbining_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:

# 根據分割點劃分資料集,繼續進行劃分

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 *

2and position

notin [

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 *

2and position

notin [

0.0,

1.0]:

bining_data_split(sample_set_right, var, min_sample, split_list)

else:

none

split_list 引數是用來儲存返回的切分點,每次切分後返回的切分點存入該list

在這裡判斷切分點分割的左子樹和右子樹是否滿足「內部節點再劃分所需的最小樣本數》=總樣本量的10%」的條件,如果滿足則進行遞迴呼叫。

defget_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庫的決策樹測試一下單變數分類對結果進行驗證,在分類方法相同,剪枝條件一致的情況下結果是一致的。

風控 連續型變數最優分箱基於CART演算法

import pandas as pd import numpy as np 讀取資料集,至少包含變數和target兩列 sample set pd.read excel 資料樣本.xlsx def calc score median sample set,var 計算相鄰評分的中位數,以便進行決策...

離散變數和連續變數

離散變數是指其數值只能用自然數或整數單位計算的則為離散變數.例如,企業個數,職工人數,裝置台數等,只能按計量單位數計數,這種變數的數值一般用計數方法取得.反之,在一定區間內可以任意取值的變數叫連續變數,其數值是連續不斷的,相鄰兩個數值可作無限分割,即可取無限個數值.例如,生產零件的規格尺寸,人體測量...

連續變數離散化的原因

資料離散化是指將連續的資料進行分段,使其變為一段段離散化的區間。分段的原則有基於等距離 等頻率或優化的方法。資料離散化的原因主要有以下幾點 比如決策樹 樸素貝葉斯等演算法,都是基於離散型的資料展開的。如果要使用該類演算法,必須將離散型的資料進行。有效的離散化能減小演算法的時間和空間開銷,提高系統對樣...