基于基尼指数的决策树特征选择算法(CART)及其python实现

基于基尼指数的决策树特征选择算法(CART)及其python实现

基尼指数

与信息增益和增益率类似,基尼指数是另外一种度量指标,由CART决策树使用,其定义如下:
在这里插入图片描述
对于二类分类问题,若样本属于正类的概率为 p,则基尼指数为:
在这里插入图片描述
对于给定的样本集合D,其基尼指数定义为:
在这里插入图片描述
其中Ck是D中属于第k类的样本子集。
如果样本集合D被某个特征A是否取某个值分成两个样本集合D1和D2,则在特征A的条件下,集合D的基尼指数定义为:
在这里插入图片描述
基尼指数Gini(D)反应的是集合D的不确定程度,跟熵的含义相似。Gini(D,A)反应的是经过特征A划分后集合D的不确定程度。所以决策树分裂选取Feature的时候,要选择使基尼指数最小的Feature,但注意信息增益则是选择最大值,这个值得选取是相反的。
下图表示二分类问题中基尼指数Gini(P)、熵的一半1/2H(P)和分类误差率的关系,横坐标表示概率p,纵坐标表示损失,可以看出基尼指数和熵的一半的曲线很接近,都了一近似的代表分类误差率。
在这里插入图片描述

算法的python实现

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 14 17:36:57 2019

@author: Auser
"""

from numpy import *
import numpy as np
import pandas as pd
from math import log
import operator
 
#计算数据集的基尼指数
def calcGini(dataSet_train):
    labelCounts={
   }
    #给所有可能分类创建字典
    for featVec in dataSet_train:
        currentLabel=featVec[-1]#训练数据的类别列
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel]=0
        labelCounts[currentLabel]+=1
    Gini=1.0
    #以2为底数计算香农熵
    for key in labelCounts:
        prob = float(labelCounts[key])/len(dataSet_train)
        Gini-=prob*prob
    return Gini
 
  
 
def split_data(dataSet_train,feature_index,value):#按照选出的最优的特征的特征值将训练集进行分裂,并将使用过的特征进行删除
    '''
    划分数据集,特征为离散的
    feature_index:用于划分特征的列数,例如“年龄”
    value:划分后的属性值:例如“青少年”
    '''
    data_split=[]#划分后的数据集
    for feature in dataSet_train:#遍历训练集
        if feature[feature_index]==value:#如果训练集的特征索引的值等于划分后的属性值
            reFeature=feature[:feature_index]#删除使用过的特征
            reFeature=list(reFeature)
            reFeature.extend(feature[feature_index+1:])
            data_split
  • 5
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值