python决策树算法分析数据,决策树规则提取 python
步骤
1、计算数据集S中的每个属性的熵H(xi)
2、选取数据集S中熵值最小(或者信息增益,两者等价)的属性
3、在决策树上生成该属性节点
4、使用剩余结点重复以上步骤生成决策树的属性节点
实例
importnumpyasnp
导入数学
fromcollectionsimportCounter
#创建数据
defcreate_data():
X1=np.random.rand(50,1)*100
X2=np.random.rand(50,1)*100
X3=np.random.rand(50,1)*100
deff(x):
return2ifx70else1ifx40else0
y=X1 X2 X3
Y=y150
Y=Y 0
r=map(f,X1)
X1=列表(r)
r=地图(女,X2)
X2=列表(r)
r=地图(女,X3)
X3=列表(r)
x=np.c_[X1,X2,X3,Y]
returnx,[courseA , courseB , courseC]
#计算集合信息熵的函数
定义计算信息熵(数据集):
n=len(数据集)
#我们用计数器统计一下Y的数量
标签=计数器(数据集[:-1])
熵=0.0
#套用信息熵公式
餐叉,葡萄酒标签。物品():
prob=
v/n
entropy-=prob*math.log(prob,2)
returnentropy
#实现拆分函数
defsplit_dataset(dataset,idx):
#idx是要拆分的特征下标
splitData=defaultdict(list)
fordataindataset:
#这里删除了idx这个特征的取值,因为用不到了
splitData[data[idx]].append(np.delete(data,idx))
returnlist(splitData.values()),list(splitData.keys())
#实现特征的选择函数
defchoose_feature_to_split(dataset):
n=len(dataset[0])-1
m=len(dataset)
#切分之前的信息熵
entropy=calculate_info_entropy(dataset)
bestGain=0.0
feature=-1
foriinrange(n):
#根据特征i切分
split_data,_=split_dataset(dataset,i)
new_entropy=0.0
#计算切分后的信息熵
fordatainsplit_data:
prob=len(data)/m
new_entropy+=prob*calculate_info_entropy(data)
#获取信息增益
gain=entropy-new_entropy
ifgain>bestGain:
bestGain=gain
feature=i
returnfeature
#决策树创建函数
defcreate_decision_tree(dataset,feature_names):
dataset=np.array(dataset)
counter=Counter(dataset[:,-1])
#如果数据集值剩下了一类,直接返回
iflen(counter)==1:
returndataset[0,-1]
#如果所有特征都已经切分完了,也直接返回
iflen(dataset[0])==1:
returncounter.most_common(1)[0][0]
#寻找最佳切分的特征
fidx=choose_feature_to_split(dataset)
fname=feature_names[fidx]
node={fname:{}}
feature_names.remove(fname)
#递归调用,对每一个切分出来的取值递归建树
split_data,vals=split_dataset(dataset,fidx)
fordata,valinzip(split_data,vals):
node[fname][val]=create_decision_tree(data,feature_names[:])
returnnode
#决策树节点预测函数
defclassify(node,feature_names,data):
#获取当前节点判断的特征
key=list(node.keys())[0]
node=node[key]
idx=feature_names.index(key)
#根据特征进行递归
pred=None
forkeyinnode:
#找到了对应的分叉
ifdata[idx]==key:
#如果再往下依然还有子树,那么则递归,否则返回结果
ifisinstance(node[key],dict):
pred=classify(node[key],feature_names,data)
else:
pred=node[key]
#如果没有对应的分叉,则找到一个分叉返回
ifpredisNone:
forkeyinnode:
ifnotisinstance(node[key],dict):
pred=node[key]
break
returnpred以上就是python决策树算法的实现步骤,希望对大家有所帮助。更多Python学习指路:python基础教程
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。