决策树 ID3 算法中选择分区背后的直觉
Posted
技术标签:
【中文标题】决策树 ID3 算法中选择分区背后的直觉【英文标题】:Intuition behind choosing partition in decision tree ID3 algorithm 【发布时间】:2016-07-06 11:05:36 【问题描述】:我试图理解机器学习中决策树分类器背后的直觉。我知道决策树中每个节点的目标是进一步划分可能标签的当前空间,以便根据对该节点给定问题的回答尽可能多地消除候选标签。但是,这与基于最小化分区“熵”的属性选择分区有什么关系呢?其中“熵”定义如下:
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 个或更多子集相反?任何明确的例子将不胜感激。
【问题讨论】:
【参考方案1】:。但是,这与基于最小化分区“熵”的属性选择分区有什么关系呢?
熵(这里是香农熵)是一种不确定性的度量,它简单地表达了你的每类分离的清晰程度。如果熵很高 - 那么有很多来自不同类别的样本,因此在这个特征中进行拆分将是有价值的,因为显然需要更多的决策规则来分离对象。另一方面,如果熵很小——节点已经主要由一个类的样本组成,因此进一步分裂没有意义。特别是当其中一个类的概率等于 1 时,您将获得 0 熵,因此获得最小值,如果您在此处创建叶子,则有 100% 的机会正确分类。
另外,每个节点的“问题”是否必须是是/否问题,从而将当前标签空间分成 2 个?
不,您可以轻松创建具有任意数量子级的决策树。从计算的角度来看,简单地分成两部分要简单得多(量化是否有一个好的分裂点比是否有多个共同创造好的分裂点更容易量化)。特别是这也是为什么您可以有效地学习线性分类器(如逻辑回归、感知器、支持向量机)而不是多阈值线性分类器(如多阈值熵线性分类器)的原因 - 构建多阈值模型要复杂得多,但仍然 - 可能并且在某些情况下是有利的。
【讨论】:
我仍然对第一部分感到困惑。您说“如果熵很高......因此拆分此功能很有价值”,但不是根据选择最小化分区熵(第二个公式)的分区来选择特定分区吗?至少这是我从书中学到的。 好吧,不。您始终选择具有 最高 值的节点,例如参见 people.cs.pitt.edu/~milos/courses/cs2750-Spring04/lectures/…。目标是让树的熵最小,因此(因为这通常是一种贪婪的学习)你会找到具有最高的节点,然后将其拆分以减少它。 【参考方案2】:决策树算法
此算法适用于分类器和回归器。
分类器演示
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))
【讨论】:
欢迎来到 SO!当您发布答案时,请尝试解释一下。以上是关于决策树 ID3 算法中选择分区背后的直觉的主要内容,如果未能解决你的问题,请参考以下文章