有用请点赞,没用请差评。

欢迎分享本文,转载请保留出处。

本次代码是基于上一节决策树ID3\C45修改过来的,建议两篇博客一起看。具体算法原理等有时间了再写。

# -*- coding:utf-8 -*-
# Decision tree by cart决策树,cart算法,算法参考李航《统计学习方法》P71
#author:Tomatorimport numpy as np
import math
from sklearn.model_selection import train_test_split# 测试数据集,《统计学习方法》P59,贷款申请样本数据集
def createDataSet():dataSet = [[0, 0, 0, 0, 'no'],  # 数据集[0, 0, 0, 1, 'no'],[0, 1, 0, 1, 'yes'],[0, 1, 1, 0, 'yes'],[0, 0, 0, 0, 'no'],[1, 0, 0, 0, 'no'],[1, 0, 0, 1, 'no'],[1, 1, 1, 1, 'yes'],[1, 0, 1, 2, 'yes'],[1, 0, 1, 2, 'yes'],[2, 0, 1, 2, 'yes'],[2, 0, 1, 1, 'yes'],[2, 1, 0, 1, 'yes'],[2, 1, 0, 2, 'yes'],[2, 0, 0, 0, 'no']]labels = ['年龄', '有工作', '有自己的房子', '信贷情况']  # 分类属性return dataSet, labels  # 返回数据集和分类属性# 计算基尼指数
def cal_gini(data_vector):nums_data = len(data_vector)  # 数据集样本数counts_by_labels = {}  # 用来保存每个label下的样本数gini = 0      #基尼指数p_sum=0       #每个类别的样本数for vector in data_vector:if vector[-1] not in counts_by_labels:  # vector[-1]为label值counts_by_labels[vector[-1]] = 0counts_by_labels[vector[-1]] += 1  # 统计label出现的次数for key in counts_by_labels:p = float(counts_by_labels[key] / nums_data)  # 计算每个标签出现的概率p_sum+= p**2gini=1-p_sum               # 公式5.24return gini# 返回类列表中出现次数最多的类标签
def max_class(label_list):count_label = {}for label in label_list:if label not in count_label:count_label[label] = 0count_label[label] += 1#     选择字典value最大的所对应的key值return max(count_label, key=count_label.get)"""
根据每个特征划分数据集
data_vector
index_feature:特征的索引位置i
value:用来划分的特征取值返回划分后的子数据及样本数,和子数据集(子数据集剔除了第i列特征)
"""
# 根据cart算法划分数据集,cart算法生成的是二叉数,因此分割之后也就只有两个子数据集。返回分割后的D1和D2数据集
def split_datatset_cart(data_vector, index_feature, value):split_set_yes = []   #判别为“是”的子数据集split_set_no=[]       #判别为“否”的子数据集for vector in data_vector:if vector[index_feature] == value:# 去掉第i列特征split_1 = vector[:index_feature]split_1.extend(vector[index_feature + 1:])split_set_yes.append(split_1)else:split_2 = vector[:index_feature]split_2.extend(vector[index_feature + 1:])split_set_no.append(split_2)#         分别输出D1和D2数据集以及对应的数据集样本数return len(split_set_yes),split_set_yes,len(split_set_no),split_set_no# 选择最优分类特征
# 生成决策树的方法:cart算法
def choose_bestfeture_cart(data_vector):nums_data = len(data_vector)nums_feature = len(data_vector[0]) - 1  # 每个样本所包含的特征个数min_gini = float('inf')  # 表示最小的基尼指数best_index_feature = 0  # 表示最优特征的索引位置indexbest_split_point=None  #表示最优的切分点for i in range(nums_feature):  # 遍历所有的特征features_i_set = [vector[i] for vector in data_vector]  # 提取第i个特征中所包含的可能取值features_i_set = list(set(features_i_set))  # 对特征值去重feature_gini = 0  #每个特征中每个特征值所对应的基尼指数# 如果第i个特征向量包含的特征取值个数小于2,则只有一个切分点。参考P71例5.4if len(features_i_set)<=2:# 同时选取features_i_set中数值最大特征取值为切分点。当然选取最小取值也有一样的结果,这只是设定的一个规矩。# fea为切分点fea=max(features_i_set)# 根据切分点进行划分子数据集nums_di_yes, di_set_yes, nums_di_no, di_set_no = split_datatset_cart(data_vector, i, fea)  #p_di_yes = nums_di_yes / nums_data  # 计算|Di|/|D|gini_yes_di = cal_gini(di_set_yes)  # 计算yes子类的gini指数feature_gini += p_di_yes * gini_yes_dip_di_no = nums_di_no / nums_datagini_yes_no = cal_gini(di_set_no)     # 计算no子类的gini指数feature_gini += p_di_no * gini_yes_no# 选取最优的分类特征和最优切分点if feature_gini < min_gini:min_gini = feature_ginibest_index_feature = ibest_split_point = fea# 如果第i个特征向量包含的特征取值个数小于2,则有多个切分点else:for fea in features_i_set:  # 遍历第i个特征的所有vlauenums_di_yes, di_set_yes,nums_di_no, di_set_no = split_datatset_cart(data_vector, i, fea)  #p_di_yes = nums_di_yes / nums_data  # 计算|Di|/|D|gini_yes_di = cal_gini(di_set_yes)  # 计算yes子类的gini指数feature_gini += p_di_yes * gini_yes_dip_di_no=nums_di_no/nums_datagini_yes_no=cal_gini(di_set_no)feature_gini += p_di_no*gini_yes_no# 选取最优的分类特征和最优切分点if feature_gini<min_gini:min_gini=feature_ginibest_index_feature=ibest_split_point=fea# print(best_index_feature,best_split_point)return best_index_feature,best_split_point  # 返回最优分类特征的索引位置和最优切分点# 决策树的生成
class Decision_tree(object):def __init__(self, data_vector, labels):# 数据集self.data_vector = data_vector# 特征标签self.labels = labels# 用于保存最优特征的索引信息,列表形式输出self.best_feature_index_list=[]# 生成决策树,返回决策树tree,字典形式def tree_main(self):tree = self.create_decision_tree(self.data_vector, self.labels)return tree"""递归函数,用于生成每一个子树,并返回。《统计学习方法》CART算法data_vector:每一个待分类数据集labels:待分类特征标签 """def create_decision_tree(self,data_vector, labels):nums_label = [vector[-1] for vector in data_vector]# 如果数据集中所有实例属于同一个类,则停止划分。返回该类 标签。if len(set(nums_label)) == 1:return nums_label[0]# 如果特征集只有一类时,即已经遍历完了所有特征,则停止划分。返回出现次数最多的类标签if len(data_vector[0]) == 1:return max_class(nums_label)best_index_feature,best_split_point = choose_bestfeture_cart(data_vector)  # 选择最优特征# best_feature_index_list存放每一个最优分类特征的索引值和对应的切分点,以两者的元组形式存放。self.best_feature_index_list.append((best_index_feature,best_split_point))best_feature_label = labels[best_index_feature]  # 最优特征的标签myTree = {best_feature_label: {}}  # 子决策树,key为最优特征的标签,value为子决策树del (labels[best_index_feature])  # 删除已经使用过的最优特征标签# 规定左子树为A=a的样本,右子树为A!=a的样本,并规定右子树的标签为“-best_split_point”!!!这样可以便于在进行predict时方便分类。nums_di_yes, di_set_yes, nums_di_no, di_set_no = split_datatset_cart(data_vector,best_index_feature,best_split_point)# 左子树myTree[best_feature_label][best_split_point] = self.create_decision_tree(di_set_yes, labels)# 右子树myTree[best_feature_label][-best_split_point] = self.create_decision_tree(di_set_no, labels)return myTreeif __name__ == '__main__':dataSet, labels = createDataSet()# best_index,point_split=choose_bestfeture_cart(dataSet)# print(labels[best_index],point_split)# 划分训练集和测试集x_train, x_test = train_test_split(dataSet, test_size=0.3, random_state=0)#tree= Decision_tree(dataSet, labels)decision_tree=tree.tree_main()print(decision_tree)print(tree.best_feature_index_list)# test_vector=[2, 1, 0, 0]# 由于数据集# score=0# for test_vector in x_test:#     predict_result=tree.predict(decision_tree,test_vector)#     print(test_vector,predict_result)#     if predict_result == test_vector[-1]:#         score+=1# print("测试准确率:%f%%"%(score/len(x_test)*100))

python 实现CART算法决策树相关推荐

  1. 经典算法详解--CART分类决策树、回归树和模型树

    Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Reg ...

  2. 机器学习十大算法之-CART分类决策树、回归树和模型树

    转载(http://blog.163.com/zhoulili1987619@126/blog/static/35308201201542731455261/) Classification And ...

  3. CART分类决策树、回归树和模型树算法详解及Python实现

    机器学习经典算法详解及Python实现–CART分类决策树.回归树和模型树 摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用 ...

  4. 02-23 决策树CART算法

    文章目录 决策树CART算法 决策树CART算法学习目标 决策树CART算法详解 基尼指数和熵 CART算法对连续值特征的处理 CART算法对离散值特征的处理 CART算法剪枝 生成剪枝后的决策树 选 ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法5:决策树之CART算法

    目录 CART概述 回归树 分类树 剪枝 Python实现示例:分类树 在数学推导+纯Python实现机器学习算法4:决策树之ID3算法中笔者已经对决策树的基本原理进行了大概的论述.本节将在上一讲的基 ...

  6. 决策树 基于python实现ID3,C4.5,CART算法

    实验目录 实验环境 简介 决策树(decision tree) 信息熵 信息增益(应用于ID3算法) 信息增益率(在C4.5算法中使用) 基尼指数(被用于CART算法) 实验准备 数据集 算法大体流程 ...

  7. Python 数据处理数据挖掘(六):决策树模型 之 CART算法

    声明:本文为学习笔记,侵权删 一.基尼系数&CART算法 CART(Classification And Regression Tree - 分类/回归树)是决策树算法的其中一种,依靠基尼系数 ...

  8. python数据分析算法调用_python数据分析算法(决策树2)CART算法

    CART(Classification And Regression Tree),分类回归树,,决策树可以分为ID3算法,C4.5算法,和CART算法.ID3算法,C4.5算法可以生成二叉树或者多叉树 ...

  9. python多项分时求和_python实现连续变量最优分箱详解--CART算法

    关于变量分箱主要分为两大类:有监督型和无监督型 对应的分箱方法: A. 无监督:(1) 等宽 (2) 等频 (3) 聚类 B. 有监督:(1) 卡方分箱法(ChiMerge) (2) ID3.C4.5 ...

最新文章

  1. php怎样解析数组,PHP 数组 Array 解析
  2. 服务器建立共享后无法写入文件,Win7 局域网共享问题,XP访问Win7复制或写入一会文件之后出现无法访问,您没有权限,或者说服务器空间不足...
  3. labuladong 的算法小抄_关于算法笔试的几个套路,一点就透
  4. 猎取人心的36条黄金法则
  5. html文档基本结构由哪三对,第3章 网页制作及HTML语言基本结构简介.ppt
  6. java function void_Java8中你可能不知道的一些地方之函数式接口实战
  7. linux客户端 存活检测,Linux下客户端检测服务器的 heartbeat
  8. HTML极客自适应网址导航模板,更换背景+看板娘
  9. 7月31日云栖精选夜读 | 在浏览器上也能训练神经网络?TensorFlow.js带你玩游戏~...
  10. linux查cpu命令4可以选择哪些运动,Linux 查看cpu 信息的命令及简单实例
  11. Ai Challenger Caption图像中文描述(2017)
  12. 歌词滚动效果在Win8 Store 开发中的实现
  13. 封装常用的js(base.js)——【05】自定义弹出框.封装水平垂直居中center(),和resize() ....
  14. 《通信原理》樊昌信、《移动通信》——知识点总结
  15. Google Earth Engine(GEE)——字典合并
  16. Objective-C——initialize方法调用原理分析
  17. html图片自动适应屏幕代码,css让图片宽度自适应屏幕的例子
  18. 【Excle数据透视表】如何让字段标题不显示“求和项”
  19. android 同根动画_[转载]Android anim动画切换效果
  20. 热度TopN排名算法的设计

热门文章

  1. 安卓手机来电防火墙_手机号拉黑了能收到短信吗
  2. 【MEMS】【2】微机电的传感器和执行器,换能器
  3. r9 plus Android 10,OPPO R9s plus有几个版本?OPPO R9s plus各版本区别对比评测
  4. SketchUp导出有纹理贴图的模型进入Unity3d的设置
  5. 关于微信分享后,提示“未验证应用”的解决办法(iOS)
  6. 每周学算法/读英文/知识点心得分享 9.27
  7. 自动化无人零售店监管系统开发
  8. 华为手表gt2搭载鸿蒙,华为手表GT2规格泄露,或搭载鸿蒙系统
  9. 2019创业做哪方面,有什么好的建议吗?
  10. 那些公司网页隐藏的彩蛋