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
return var_median_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
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:
# 根據分割點劃分資料集,繼續進行劃分
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
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
連續型隨機變數
1.對於乙個連續型隨機變數,它取任何固定值的概率都等於0。因此,對於連續隨機變數,下式成立 f a a f x dx p a f x dx df a da f a f a 可看作隨機變數取值於點a附近的可能性的乙個度量。3.連續型隨機變數的期望e x xf x dx,方差可根據var x e x2 ...
連續變數最優分箱 基於CART演算法
關於變數分箱主要分為兩大類 有監督型和無監督型 對應的分箱方法 a.無監督 1 等寬 2 等頻 3 聚類 b.有監督 1 卡方分箱法 chimerge 2 id3 c4.5 cart等單變數決策樹演算法 3 信用評分建模的iv最大化分箱 等 本篇使用python,基於cart演算法對連續變數進行最優...
連續型隨機變數 概率密度函式
注 本篇的表述大部分來自陳希孺先生著 概率論與數理統計 連續型隨機變數的概率分布不能用像離散型變數那樣去描述。原因在於,這種變數的取值充滿乙個區間,無法一一排出,在應用中求精確到某一點的概率是不可能的。實際上,計算連續型隨機變數的概率一般是求隨機變數在某個區間內取值的概率,而在理論和實用上較方便的方...