牛啊,从零构建决策树并高级优化


牛啊,从零构建决策树并高级优化

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

首先,我将通过一个简单的示例来解释决策树的基础知识。然后,我将深入探讨决策树背后的数学知识,包括熵和Gini不纯度等关键概念。我还将介绍使用logistic函数的软决策树。
介绍完理论后,我将深入编码,向你展示如何在不使用预建库的情况下构建决策树。最后,我将探索优化决策树性能的高级技术,例如使用KS统计和组合不同的指标。
学习本文后,我们将对决策树有一个扎实的了解,并有信心构建和调整你的人工智能模型。
通过一个简单的例子来深入了解决策树的基础知识。假设我们有来自1000个不同年龄的人的数据(输入变量x),我们想预测他们是否就业(目标变量Y,二进制:1表示就业,0表示未就业)。我们的目标是建立一个能预测就业状况的模型f(x)=Y。
首先,我们需要找到最佳的分界年龄,将数据分为两组:高于分界年龄和低于分界年龄。这种划分应使两组之间的就业率差异最大化。
例如,假设30岁是最佳分界点。这意味着30岁以上和30岁以下人群的就业率差异最大。这样,我们就可以创建一个简单的决策规则:如果一个人的年龄大于30岁,那么他就更有可能被雇用;如果他的年龄在30岁或以下,那么他就更不可能被雇用。
在数学上,我们可以将这一决策规则表示如下:
这是一个阶跃函数,其中*f(x)预测,如果x年龄大于30岁,则1(就业);如果x年龄小于等于30岁,则0(失业)。这个简单的模型说明了决策树是如何通过在最佳截点分割数据来进行预测的。
实际上,决策树可以处理多个变量或一个向量:
决策树会考虑不同的分割点,以找到分割数据的最佳方法。构建决策树的关键点在于:1)选择最佳分割变量;2)找到最佳分割点。
让我们深入了解决策树背后的数学知识,并研究如何对其进行扩展。将决策树想象成一系列将数据划分为不同区域的步骤,每个区域都与不同的结果相关联。例如,在前面的例子中,我们用年龄(x)来预测就业状况(Y)。我们从一个简单的决策规则开始,看起来就像这样:
当扩展到多个变量时,决策树模型可以表示为
树中的每个决策节点代表一个或一组基于特征x_1、x_2、…、x_n的条件。模型是根据这些条件递归分割数据而建立的。例如,年龄(x_1)和收入(x_2)这两个变量的阶跃函数可能如下所示:
例如,如果我们有两个变量,年龄(x_1)和收入(x_2),每个变量都有各自的切点,那么决策函数就是这样的:
我们将使用“切树法”求解Y=F(x_1,x_2,…)。就像切蛋糕一样。我们需要做出最好的切法,以确保每一块蛋糕都有适当的配料。
具体操作如下:首先,我们要确定最重要的分割变量。这个决定类似于选择在蛋糕的哪个位置切一刀。是根据年龄、收入还是其他因素进行分割?
这包括根据熵、Gini不纯度和信息增益等标准选择最佳变量和最佳分割点。
熵是衡量数据不纯度或随机性的指标,计算公式为
这里S是数据集,c是类的数量,p_i是类i中实例的比例。试想一下,我们将数据拆分,让每组数据尽可能纯净。熵衡量随机性或不纯度。熵越低,说明组别越纯。
Gini不纯度是另一种衡量不纯度的方法,其值为
这是衡量纯度的另一种方法,计算的是如果从一组物品中随机挑选,你会随机选错物品的频率。Gini不纯度越低,意味着错误越少。
信息增益衡量的是拆分后熵或不纯度的减少:
这可以告诉我们分割后数据的纯度提高了多少。它衡量的是熵的减少。信息增益越高,说明我们的拆分效果越好。
这些指标非常重要,因为它们可以帮助数据树找出进行拆分的最佳位置,确保每次拆分都能使分组尽可能相似。例如,如果你根据年龄和收入来预测人们是否会购买产品,那么你希望创建的分组中,人们更有可能做出相似的决定。
你可能会问如何在实践中使用这些不纯度度量。别担心,我会帮你解决这个问题。以下是根据我的经验和研究得出的总结:
何时使用每项标准?
熵:将熵视为细致的组织者。当你想精确了解小组的混合程度时,就可以使用它。它非常适合你关心班级精确分布的任务。
Gini不纯度:Gini是快速获得可靠结果的首选。在解决二元分类问题时,它的计算量较少,能高效完成任务。
信息增益:在使用ID3、C4.5或C5.0等算法时使用,因为这一指标是为了了解每个分割对你的帮助有多大。这对观察决策树中每个决策的附加值也很有用。
一个自然而然的问题是:“切割树方法”是否存在平滑的阶跃函数?
这对神经网络非常重要,因为传统的决策树是无差别的阶跃函数,在训练神经网络模型时非常吃力。在神经网络中使用类似平滑软树的函数作为激活函数,可以实现反向传播和梯度下降。此外,平滑软树还能通过提供概率输出来促进训练和提高性能。软”可以通过平滑决策边界来防止过度拟合,从而创建一个更加稳定和可泛化的模型。
为了引入软树的概念,我们可以使用logistic函数来平滑阶跃函数。对数函数的定义如下
其中,s是切点,B是定义陡度的大正值(惩罚)。当B较大时,该函数近似于阶跃函数,因为当xs时,上式很快就会趋近于1。这样,我们就可以为树的分支分配概率,从而有效地从软决策树过渡到硬决策树。
将这一点纳入决策树后,预测函数可以更新如下:
如果选择了“软”,预测结果将基于p的加权平均值和硬决策树的赋值。
这种方法引入了软树的概念,即决策边界是平滑的,而不是尖锐的。
来看看软树的功能与硬树的不纯度度量之间的关系。在逻辑回归中,阳性类的概率使用逻辑函数建模:
根据这一模型,单个数据点
(x,y)的似然函数为
数据集的总体可能性为
取对数,就得到了对数概率:
从逻辑函数中代入p:
这表明,在逻辑回归中最大化似然函数的目的是找到能有效区分类别的最佳系数A和B。这与寻找能使Gini或熵值中的不纯度最小化的分离相似。
我们首先比较Logistic回归概率和Gini不纯度:
如果数据分离得很好,逻辑回归模型的决策边界将最大限度地减少重叠,从而产生纯子集(低Gini不纯度)。当p接近0或1(纯类)时,Gini不纯度2p(1-p)接近0,表示纯节点。
然后,我们比较Logistic回归似然和熵:
对数似然函数有
-plog(p)-(1-p)log(1-p)*项,与熵公式类似。这意味着,通过最大化对数似然,我们也在减少熵。我们的目标是进行有把握的分类,即p接近0或1。当p接近0或1时,熵-plog(p)-(1-p)log(1-p)变为0,表示纯节点。
理解和实施具有对数函数的软树方法,对于深度学习和科尔莫哥罗夫-阿诺德网络(KAN)也很重要,因为它弥补了决策树和神经网络架构之间的差距,使模型更加灵活和强大。
下一节,我将讨论传统决策树的代码实现。这可以让你清楚地了解它们的机制。此外,它还能帮助读者开发自己的决策树并理解模型的工作原理。我还将说明为什么使用logistic函数的参数方法很重要。
我将研究从头开始构建决策树分类器的代码,而不依赖scikit-learn等预建库。这种动手实践的方法将帮助你理解决策树的底层机制以及如何自己实现它们。让我们逐块深入代码,重点关注树生长和最佳分割计算的关键部分和更复杂的方面。
该函数计算给定标签集y的Gini不纯度。在这里,我们将这一指标用于分割点搜索。
该函数通过最小化Gini不纯度,找到最佳特征和阈值来分割数据。下面是它的详细过程:
初始化:best_gini初始化为1.0,代表可能的最差不纯度。best_idx和best_thr将存储用于分割的最佳特征索引和阈值。
迭代特征和阈值:该函数对每个特征和该特征的每个唯一阈值进行循环。对于每个组合
屏蔽:它根据特征值低于或高于阈值创建掩码,将数据分为左右两个子集。
Gini计算:通过对左右子集的Gini不纯度按其大小加权,计算出拆分的Gini不纯度。
如果当前拆分的Gini不纯度低于迄今观察到的最佳拆分,函数会更新best_gini、best_idx和best_thr。
该类代表决策树中的一个节点。它存储
Gini:节点的Gini系数。
num_samples:样本数:节点的样本数。
num_samples_per_class(每类样本数):每个类别的样本分布。
predicted_class:预测的类别:节点上的类别预测值。
feature_index(特征索引)和threshold(阈值):用于存储用于分割的最佳特征和阈值。
left和right:指向左右子节点的指针。
该类是决策树的主类。它继承自BaseEstimator和ClassifierMixin,以确保与scikit-learn兼容。下面是每个方法的作用:
初始化:设置树的最大深度。
拟合模型:检查输入数据中的NaN值或无限值,初始化类和特征信息,并启动树生长过程。
该方法以递归方式建立决策树:
创建节点:用Gini不纯度、样本计数和预测类别初始化一个新节点。
分割节点:如果当前深度小于max_depth,它会找到最佳分割。如果找到了有效的拆分:
左右子集:根据分割结果创建数据子集。
递归调用:递归增长左右子树。
预测方法使用辅助函数_predict遍历树,从根节点到叶节点,对每个输入进行预测:
遍历树:从根节点开始,根据特征值和阈值移动到左侧或右侧子节点。
叶节点:一旦到达叶节点,就会返回存储在叶节点上的预测类别。
通过对决策树分类器的自定义实现,我们可以全面了解决策树的工作原理。有了这些知识,你就可以在机器学习算法中处理更高级的应用和定制。
在本节中,我将演示一种扩展的决策树方法,该方法结合了Kolmogorov-Smirnov(KS)统计量、熵以及两者的组合来确定最佳分割。此外,我们还将使用对数函数引入“软”决策树因子:
为分支分配概率,使决策树更具适应性和稳健性。
KS统计量测量两个样本累积分布之间的最大差异,因此,在本文中,我将用它来识别最重要的分裂点。
传统上,Kolmogorov-Smirnov(KS)统计量用于检验两个样本来自相同分布的假设。它测量两个样本的经验累积分布函数(CDF)之间的最大距离。在数学上,两个样本F_1(x)和F_2(x)的KS统计量定义如下
事实证明,这种方法也能有效区分两个类别。因此,我将其作为决策树的有用工具。
下面我们来看看代码的关键部分:
初始化:使用深度、每次分割的最小样本数、潜在切点数、分割标准以及是否使用“软”树选项等参数对该类进行初始化。
构建树:该方法以递归方式构建树。它根据_best_split方法确定的最佳分割点,将数据分割成左右两个子集。如果达到最大深度或样本数低于最小值,就会创建一个叶节点。
找到最佳分割点:_best_split(最佳分割)方法使用KS、熵或两者来评估潜在的分割点。它会遍历每个特征的阈值,并计算左右分割点之间的KS统计量和熵。然后选择得分最高的分割点。
使用“软”树进行预测:_predict_proba方法使用逻辑函数为每个分支分配概率。这使得预测树更“软”,可以更好地处理不确定性。
结果:
结果表明,KS统计量可以提高决策树的性能。虽然软树并不能提高性能,但它有助于理解如何将概率赋值整合到决策树中。这种方法对神经网络非常有用,因为平滑的激活函数对反向传播和梯度下降非常重要。软树方法为机器学习模型的进一步优化增加了灵活性和潜力。
决策树是XGBoost、LightGBM和神经网络等机器学习方法的重要工具。虽然人们经常使用scikit-learn等预构建软件包,但了解决策树的基本机制和数学知识有助于改进和创建新算法。
通过从头开始构建决策树,你可以了解如何决定拆分、不纯度度量如何指导这些拆分,以及KS统计量如何提高性能。我还介绍了软树的概念,它有助于整合概率,对神经网络非常重要。
掌握决策树基础知识有助于你针对特定任务对模型进行微调和优化。它还有助于在机器学习项目中构建高级应用和定制。
长按👇关注-机器学习研习院-设为星标,干货速递


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录