亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python實(shí)現(xiàn)連續(xù)變量最優(yōu)分箱詳解--CART算法

 更新時間:2019年11月22日 10:10:28   作者:賈杰森  
今天小編就為大家分享一篇python實(shí)現(xiàn)連續(xù)變量最優(yōu)分箱詳解--CART算法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

關(guān)于變量分箱主要分為兩大類:有監(jiān)督型和無監(jiān)督型

對應(yīng)的分箱方法:

A. 無監(jiān)督:(1) 等寬 (2) 等頻 (3) 聚類

B. 有監(jiān)督:(1) 卡方分箱法(ChiMerge) (2) ID3、C4.5、CART等單變量決策樹算法 (3) 信用評分建模的IV最大化分箱 等

本篇使用python,基于CART算法對連續(xù)變量進(jìn)行最優(yōu)分箱

由于CART是決策樹分類算法,所以相當(dāng)于是單變量決策樹分類。

簡單介紹下理論:

CART是二叉樹,每次僅進(jìn)行二元分類,對于連續(xù)性變量,方法是依次計(jì)算相鄰兩元素值的中位數(shù),將數(shù)據(jù)集一分為二,計(jì)算該點(diǎn)作為切割點(diǎn)時的基尼值較分割前的基尼值下降程度,每次切分時,選擇基尼下降程度最大的點(diǎn)為最優(yōu)切分點(diǎn),再將切分后的數(shù)據(jù)集按同樣原則切分,直至終止條件為止。

關(guān)于CART分類的終止條件:視實(shí)際情況而定,我的案例設(shè)置為 a.每個葉子節(jié)點(diǎn)的樣本量>=總樣本量的5% b.內(nèi)部節(jié)點(diǎn)再劃分所需的最小樣本數(shù)>=總樣本量的10%

python代碼實(shí)現(xiàn):

import pandas as pd
import numpy as np
 
#讀取數(shù)據(jù)集,至少包含變量和target兩列
sample_set = pd.read_excel('/數(shù)據(jù)樣本.xlsx')
 
def calc_score_median(sample_set, var):
  '''
  計(jì)算相鄰評分的中位數(shù),以便進(jìn)行決策樹二元切分
  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表示需要進(jìn)行分箱的變量名,返回一個樣本變量中位數(shù)的list

def choose_best_split(sample_set, var, min_sample):
  '''
  使用CART分類決策樹選擇最好的樣本切分點(diǎn)
  返回切分點(diǎn)
  param sample_set: 待切分樣本
  param var: 分割變量名稱
  param min_sample: 待切分樣本的最小樣本量(限制條件)
  '''
  # 根據(jù)樣本評分計(jì)算相鄰不同分?jǐn)?shù)的中間值
  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 參數(shù)為最小葉子節(jié)點(diǎn)的樣本閾值,如果小于該閾值則不進(jìn)行切分,如前面所述設(shè)置為整體樣本量的5%

返回的結(jié)果我這里只返回了最優(yōu)分割點(diǎn),如果需要返回其他的比如GINI值,可以自行添加。

def bining_data_split(sample_set, var, min_sample, split_list):
  '''
  劃分?jǐn)?shù)據(jù)找到最優(yōu)分割點(diǎn)list
  param sample_set: 待切分樣本
  param var: 分割變量名稱
  param min_sample: 待切分樣本的最小樣本量(限制條件)
  param split_list: 最優(yōu)分割點(diǎn)list
  '''
  split, position = choose_best_split(sample_set, var, min_sample)
  if split != 0.0:
    split_list.append(split)
  # 根據(jù)分割點(diǎn)劃分?jǐn)?shù)據(jù)集,繼續(xù)進(jìn)行劃分
  sample_set_left = sample_set[sample_set[var] < split]
  sample_set_right = sample_set[sample_set[var] > split]
  # 如果左子樹樣本量超過2倍最小樣本量,且分割點(diǎn)不是第一個分割點(diǎn),則切分左子樹
  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倍最小樣本量,且分割點(diǎn)不是最后一個分割點(diǎn),則切分右子樹
  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 參數(shù)是用來保存返回的切分點(diǎn),每次切分后返回的切分點(diǎn)存入該list

在這里判斷切分點(diǎn)分割的左子樹和右子樹是否滿足“內(nèi)部節(jié)點(diǎn)再劃分所需的最小樣本數(shù)>=總樣本量的10%”的條件,如果滿足則進(jìn)行遞歸調(diào)用。

def get_bestsplit_list(sample_set, var):
  '''
  根據(jù)分箱得到最優(yōu)分割點(diǎn)list
  param sample_set: 待切分樣本
  param var: 分割變量名稱
  '''
  # 計(jì)算最小樣本閾值(終止條件)
  min_df = sample_set.shape[0] * 0.05
  split_list = []
  # 計(jì)算第一個和最后一個分割點(diǎn)
  bining_data_split(sample_set, var, min_df, split_list)
  return split_list

最后整合以下來個函數(shù)調(diào)用,返回一個分割點(diǎn)list。

可以使用sklearn庫的決策樹測試一下單變量分類對結(jié)果進(jìn)行驗(yàn)證,在分類方法相同,剪枝條件一致的情況下結(jié)果是一致的。

以上這篇python實(shí)現(xiàn)連續(xù)變量最優(yōu)分箱詳解--CART算法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 剖析Python的Twisted框架的核心特性

    剖析Python的Twisted框架的核心特性

    這篇文章主要介紹了剖析Python的Twisted框架的核心特性,包括Twisted框架中reacter與Deferred等的關(guān)鍵用法,需要的朋友可以參考下
    2016-05-05
  • Python數(shù)據(jù)分析之?Pandas?Dataframe合并和去重操作

    Python數(shù)據(jù)分析之?Pandas?Dataframe合并和去重操作

    這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe合并和去重操作,文章基于python的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 10個使用Python必須知道的內(nèi)置函數(shù)

    10個使用Python必須知道的內(nèi)置函數(shù)

    這篇文章小編主要向大家介紹的是10個使用Python必須知道的內(nèi)置函數(shù)reduce()、split()、map()等,更多后置函數(shù)請看下文
    2021-09-09
  • python中關(guān)于tqdm的用法

    python中關(guān)于tqdm的用法

    這篇文章主要介紹了python中關(guān)于tqdm的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python dataframe向下向上填充,fillna和ffill的方法

    python dataframe向下向上填充,fillna和ffill的方法

    今天小編就為大家分享一篇python dataframe向下向上填充,fillna和ffill的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python BentoML構(gòu)建部署和管理機(jī)器學(xué)習(xí)模型技巧掌握

    Python BentoML構(gòu)建部署和管理機(jī)器學(xué)習(xí)模型技巧掌握

    BentoML是一個開源的Python框架,旨在簡化機(jī)器學(xué)習(xí)模型的打包、部署和管理,本文將深入介紹BentoML的功能和用法,提供詳細(xì)的示例代碼和解釋,幫助你更好地理解和應(yīng)用這個強(qiáng)大的工具
    2024-01-01
  • Python3.6連接Oracle數(shù)據(jù)庫的方法詳解

    Python3.6連接Oracle數(shù)據(jù)庫的方法詳解

    這篇文章主要介紹了Python3.6連接Oracle數(shù)據(jù)庫的方法,較為詳細(xì)的分析了cx_Oracle模塊安裝及Python3.6使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • Python pickle類庫介紹(對象序列化和反序列化)

    Python pickle類庫介紹(對象序列化和反序列化)

    這篇文章主要介紹了Python pickle類庫介紹(對象序列化和反序列化),本文講解了pickle庫的作用、pickle的運(yùn)行過程、使用實(shí)例、修改picklable類型的默認(rèn)行為等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Python文件讀寫常見用法總結(jié)

    Python文件讀寫常見用法總結(jié)

    今天小編就為大家分享一篇關(guān)于Python文件讀寫常見用法總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • python使用magic模塊進(jìn)行文件類型識別方法

    python使用magic模塊進(jìn)行文件類型識別方法

    今天小編就為大家分享一篇python使用magic模塊進(jìn)行文件類型識別方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論