决策树3:基尼指数--Gini index(CART)

news/2024/12/23 1:45:03/

原理:

在这里插入图片描述既能做分类,又能做回归。
分类:基尼值作为节点分类依据。
回归:最小方差作为节点的依据。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述节点越不纯,基尼值越大,熵值越大
在这里插入图片描述在这里插入图片描述方差越小越好。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述总体的基尼值:0.343
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述## 代码实践

#整个c4.5决策树的所有算法:
import numpy as np
import operatordef creatDataSet():"""outlook-> 0:sunny | 1:overcast | 2:raintemperature-> 0:hot | 1:mild | 2:coolhumidity-> 0:high | 1:normalwindy-> 0:false | 1:true"""dataSet = np.array([[0, 0, 0, 0, 'N'],[0, 0, 0, 1, 'N'],[1, 0, 0, 0, 'Y'],[2, 1, 0, 0, 'Y'],[2, 2, 1, 0, 'Y'],[2, 2, 1, 1, 'N'],[1, 2, 1, 1, 'Y']])labels = np.array(['outlook', 'temperature', 'humidity', 'windy'])return dataSet, labelsdef createTestSet():"""outlook-> 0:sunny | 1:overcast | 2:raintemperature-> 0:hot | 1:mild | 2:coolhumidity-> 0:high | 1:normalwindy-> 0:false | 1:true"""testSet = np.array([[0, 1, 0, 0],[0, 2, 1, 0],[2, 1, 1, 0],[0, 1, 1, 1],[1, 1, 0, 1],[1, 0, 1, 0],[2, 1, 0, 1]])return testSetdef dataset_entropy(dataset):"""计算数据集的信息熵"""classLabel=dataset[:,-1]labelCount={}for i in range(classLabel.size):label=classLabel[i]labelCount[label]=labelCount.get(label,0)+1     #将所有的类别都计算出来了#熵值(第一步)cnt=0for k,v in labelCount.items():cnt += -v/classLabel.size*np.log2(v/classLabel.size)return cnt#接下来切分,然后算最优属性
def splitDataSet(dataset,featureIndex,value):subdataset=[]#迭代所有的样本for example in dataset:if example[featureIndex]==value:subdataset.append(example)return np.delete(subdataset,featureIndex,axis=1)def classLabelPi(dataset):#多叉树classLabel=dataset[:,-1]labelCount={}for i in range(classLabel.size):label=classLabel[i]labelCount[label]=labelCount.get(label,0)+1valueList=list(labelCount.values())sum=np.sum(valueList)pi=0for i in valueList:pi+=(i/sum)**2return pidef chooseBestFeature(dataset,labels):"""选择最优特征,但是特征是不包括名称的。如何选择最优特征:增益率最小"""#特征的个数featureNum=labels.sizebaseEntropy=dataset_entropy(dataset)#设置最大增益值maxRatio,bestFeatureIndex=0,None#样本总数n=dataset.shape[0] #最小基尼值 minGini=1for i in range(featureNum):#指定特征的条件熵featureEntropy=0gini=0#返回所有子集featureList=dataset[:,i]featureValues=set(featureList)for value in featureValues:subDataSet=splitDataSet(dataset,i,value) pi=subDataSet.shape[0]/n gini+=pi*(1-classLabelPi(subDataSet))  if minGini > gini:minGini=ginibestFeatureIndex=ireturn bestFeatureIndex #最佳增益def mayorClass(classList):labelCount={}for i in range(classList.size):label=classList[i]labelCount[label]=labelCount.get(label,0)+1sortedLabel=sorted(labelCount.items(),key=operator.itemgetter(1),reverse=True)return sortedLabel[0][0]def createTree(dataset,labels):"""参考hunt算法那张图片"""classList=dataset[:,-1]if len(set(dataset[:,-1]))==1:return dataset[:,-1][0] #返回类别if labels.size==0 or len(dataset[0])==1:  #条件熵最少的一定是类别最多的#条件熵算不下去的时候,return mayorClass(classList)bestFeatureIndex=chooseBestFeature(dataset,labels)bestFeature=labels[bestFeatureIndex]dtree={bestFeature:{}}  #用代码表示这棵树featureList=dataset[:,bestFeatureIndex]featureValues=set(featureList)for value in featureValues:subdataset=splitDataSet(dataset,bestFeatureIndex,value)sublabels=np.delete(labels,bestFeatureIndex)dtree[bestFeature][value]=createTree(subdataset,sublabels) #将原始的labels干掉一列return dtreedef predict(tree,labels,testData):#分类,预测rootName=list(tree.keys())[0]rootValue=tree[rootName]featureIndex =list(labels).index(rootName)classLabel=None for key in rootValue.keys():if testData[featureIndex]==int(key):if type(rootValue[key]).__name__=="dict":classLabel=predict(rootValue[key],labels,testData)    #递归else:classLabel=rootValue[key]return classLabeldef predictAll(tree,labels,testSet):classLabels=[]for i in testSet:classLabels.append(predict(tree,labels,i))return classLabelsif __name__ == "__main__":dataset,labels=creatDataSet()# print(dataset_entropy(dataset)# s=splitDataSet(dataset,0)# for item in s:#     print(item)tree=createTree(dataset,labels)testSet=createTestSet()print(predictAll(tree,labels,testSet))
····························································
输出:
['N', 'N', 'Y', 'N', 'Y', 'Y', 'N']

补充:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记住公式!!!


http://www.ppmy.cn/news/772460.html

相关文章

Stata:各类集中度指数估算-广义基尼Gini系数

全文阅读:https://www.lianxh.cn/news/a6c027a470e91.html 作者: 杜孟凡 (湖南大学)邮箱: dumengfan0707163.com 目录 1. 背景介绍2. 集中度指数 2.1 理论部分2.2 推断与估计3. conindex 命令语法与实例 3.1 命令语法3.2 Stata 实例4. 结语5…

2023年计算机科学与信息技术国际会议(ECCSIT 2023) | Ei Scopus双检索

会议简介 Brief Introduction 2023年计算机科学与信息技术国际会议(ECCSIT 2023) 会议时间:2023年12月15日-17日 召开地点:中国北海 大会官网:www.eccsit.org 2023年计算机科学与信息技术国际会议(ECCSIT 2023)由西南交通大学、西南财经大学、…

import “github.com/gin-gonic/gin“ 爆红

4、代码 package main ​ import "github.com/gin-gonic/gin" ​ func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run() // listen and serve on 0.0.0.0:8080 (fo…

Gini coefficient直观的解释与实现

引言 大家在机器学习中经常会看到基尼系数的词汇,有时候在做比赛的时候,有些赛题的Scoring Metric就是基尼系数。我们去Google或者Baidu,得到的都是些不甚满意的经济学相关的解释。那么在机器学习、数据挖掘领域,基尼系数在实际的…

基尼不纯度(Gini impurity)

决策树是一种简单的机器学习方法。决策树经过训练之后,看起来像是以树状形式排列的一系列if-then语句。一旦我们有了决策树,只要沿着树的路径一直向下,正确回答每一个问题,最终就会得到答案。沿着最终的叶节点向上回溯&#xff0c…

【模型 区分度】神秘的KS值和GINI系数

有效性指标中的区分能力指标: KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估, 指标衡量的是好坏样本累计分部之间的差值。 好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。 KS的计算步骤…

Gini和AUC的关系(Gini=2AUC-1真的成立吗?)

在做信用评分卡研究时,除了用KS/AUC指标,还经常见到基尼系数(gini coefficient)。 gini系数通常被用来判断收入分配公平程度。   图.洛伦茨曲线与基尼系数 Gini coefficient 是指绝对公平线(line of equality)和洛伦茨曲线(Lorenz Curve)围成的面积与绝…