在决策树ID3算法中选择分区的直觉

时间:2016-03-19 18:41:38

标签: algorithm machine-learning decision-tree supervised-learning

我试图了解ML中决策树分类器背后的直觉。我知道决策树中每个节点的目标是进一步划分可能标签的当前空间,以便根据对该节点的给定问题的答案尽可能多地消除候选标签。但是,这又如何与基于属性选择分区相关联,最小化分区" entropy"?其中"熵"定义如下:

H(S) = −p_1*log2(p_1) −... −p_n*log2(p_n)

和分区熵:

H = q_1*H(S_1) +...+ q_m*H(S_m)

with H(S): entropy of a given subset
     H: partition entropy
     p_i's: proportions of data belonging to class i
     q_i's: proportions of data belonging to subset i based on given partition

此外,必须提出问题"在每个节点是一个是/否问题,从而将当前标签空间拆分为2?与3个或更多子集相对?任何明确的例子将不胜感激。

2 个答案:

答案 0 :(得分:1)

  

。但是,这又如何与基于属性选择分区相关联,最小化分区" entropy"?

熵(这里是香农的熵)是衡量不确定性的指标,它简单地表达了你的每班级分离的清晰程度。如果熵很高 - 那么有很多来自不同类的样本,因此在这个特征中的分裂将是有价值的,因为显然需要更多的决策规则来分离对象。另一方面,如果熵很小 - 节点已经主要由一个类的样本组成,因此进一步分裂没有意义。特别是当其中一个类的概率等于1时,你将获得0熵,因此获得最小值,如果你在这里创建一个叶子,则有100%的正确分类机会。

  

此外,必须提出问题"在每个节点都是是/否问题,因此将当前标签空间拆分为2?

不,您可以轻松创建具有任意数量子项的决策树。从计算的角度来看,简单地分成两个就简单得多了(更容易量化是否存在一个分裂点,这个分裂点是否优于是否存在多个共同创建良好分裂的分裂点)。特别是这也是你可以有效学习linaer分类器(如逻辑回归,感知器,svm)而不是多阈值线性分类器(如多阈值熵线性分类器)的原因 - 构建多阈值模型的方式更复杂,但仍然可行对某些情况有利。

答案 1 :(得分:0)

决策树算法

此算法适用于分类器和回归器。

用于分类器演示

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from sklearn.tree import DecisionTreeClassifier

from sklearn.tree import export_graphviz

from sklearn.model_selection import train_test_split


df=pd.read_csv("D:\\heart.csv")

iris={"data":np.array(df[["age","sex","cp","trestbps","chol","fbs","restecg","thalach","exang","oldpeak","slope","ca","thal"]],ndmin=2),"target":np.array(df["target"]),"target_names":np.array(["No_problem","Problem"])}

X_train,X_test,Y_train,Y_test=train_test_split(iris["data"],iris["target"],random_state=0
)

dt=DecisionTreeClassifier(criterion="gini",random_state=100,max_depth=10,min_samples_leaf=2)

dt.fit(X_train,Y_train)

x_new=np.array([[71,0,0,112,149,0,1,125,0,1.6,1,0,2]])

prediction=dt.predict(x_new)

print("The value is : {}\n".format(prediction))

print("The name is : {}\n".format(iris["target_names"][prediction]))

print("Accurecy is : {:.2f}".format(dt.score(X_train,Y_train)*100))