首页  > 今日智库  > 

决策树分类算法,使用Python了解分类决策树(附代码)

  • 点击7002次
  • www.couwai.com
  • 评论0条
  • 导读决策树分类算法,作者:Michael Galarnyk翻译:李润嘉:和中华本文约3600字,建议阅读15分钟。本教程介绍了用于分类的决策树,即分类树,包括分类树的结构,分类树如何进行预测,使用scikit-learn构造分类树,以及超参数的调整。本教程详细...

    使用Python了解分类决策树(附代码)

    作者:Michael Galarnyk

    翻译:李润嘉

    :和中华

    本文约3600字,建议阅读15分钟。

    本教程介绍了用于分类的决策树,即分类树,包括分类树的结构,分类树如何进行预测,使用scikit-learn构造分类树,以及超参数的调整。

    使用Python了解分类决策树(附代码)

    本教程详细介绍了决策树的工作原理

    由于各种原因,决策树一种流行的监督学习方法。决策树的优点包括,它既可以用于回归,也可用于分类,易于解释并且不需要特征缩放。它也有一些缺点,比如容易过拟合。本教程介绍了用于分类的决策树,也被称为分类树。

    除此之外,本教程还将涵盖:

    分类树的结构(树的深度,根节点,决策节点,叶节点/终端节点)

    分类树如何进行预测

    如何通过Python中的scikit-learn构造决策树

    超参数调整

    与往常一样,本教程中用到的代码可以在我的github(结构,预测)中找到,我们开始吧!

    什么是分类树?

    分类和回归树(CART)是由Leo Breiman引入的,用一种于解决分类或回归预测建模问题的决策树算法。本文只介绍分类树。

    分类树

    从本质上讲,分类树将分类转化为一系列问题。下是在IRIS数据集(花卉种类)上训练的一个分类树。根节点(棕色)和决策节点(蓝色)中包含了用于分裂子节点的问题。根节点即为最顶端的决策节点。换句话说,它就是你遍历分类树的起点。叶子节点(绿色),也叫做终端节点,它们不再分裂成更多节点。在叶节点处,通过多数投票决定分类。

    使用Python了解分类决策树(附代码)

    将三个花卉品种(IRIS数据集)一一进行分类的分类树

    如何使用分类树

    使用分类树,要从根节点(棕色)开始,逐层遍历整棵树,直到到达叶节点(终端节点)。如下所示的分类树,假设你有一朵花瓣长度为4.5cm的花,想对它进行分类。首先从根节点开始,先回答“花瓣长度(单位:cm)≤ 2.45吗?”因为宽度大于2.45,所以回答否。然后进入下一个决策节点,回答“花瓣长度(单位:cm)≤ 4.95吗?”。答案为是,所以你可以预测这朵花的品种为变色鸢尾(versicolor)。这就是一个简单的例子。

    使用Python了解分类决策树(附代码)

    分类树如何生长(非数学版)

    分类树从数据中学到了一系列“如果…那么…”的问题,其中每个问题都涉及到一个特征和一个分割节点。从下的局部树(A)可看出,问题“花瓣长度(单位:cm)≤ 2.45”将数据基于某个值(本例中为2.45)分成两个部分。这个数值叫做分割点。对分割点而言,一个好的值(使得信息增益最大)可将类与类之间分离开。观察下中的B部分可知,位于分割点左侧的所有点都被归为山鸢尾类(setosa),右侧的所有点则被归为变色鸢尾类(versicolor)。

    使用Python了解分类决策树(附代码)

    从中可看出,山鸢尾类(setosa)中所有的38个点都已被正确分类。它是一个纯节点。分类树在纯节点上不会分裂。它不再产生信息增益。但是不纯节点可以进一步分裂。观察B的右侧可知,许多点被错误归类到了变色鸢尾类(versicolor)。换而言之,它包含了分属于两个不同类(setosa和versicolor)的点。分类树是个贪婪算法,这意味着它会默认一直分裂直到得到纯节点。而且,该算法会为不纯节点选择最佳分割点(我们会在下节介绍数学方法)。

    使用Python了解分类决策树(附代码)

    在上中,树的最大深度为2。树的深度是对一棵树在进行预测之前可分裂次数的度量。树可进行多次分裂,直到树的纯度越来越高。多次重复此过程,会导致树的深度越来越大,节点越来越多。这会引起对训练数据的过拟合。幸运的是, 大多数分类树的实现都允许控制树的最大深度,从而减少过拟合。换而言之,可以通过设置决策树的最大深度从而阻止树的生长超过某个特定深度。可通过下直观地了解最大深度。

    使用Python了解分类决策树(附代码)

    选择准则

    使用Python了解分类决策树(附代码)

    本节解答了信息增益、基尼指数和熵是如何计算出来的。

    在本节,你可以了解到什么是分类树中根节点/决策节点的最佳分割点。决策树在某个特征和相对应的分割点上进行分裂,从而根据给定的准则(本例中为基尼指数或熵)产生最大的信息增益(IG)。可以将信息增益简单定义为:

    IG = 分裂前的信息(父) – 分裂后的信息(子)

    通过下的决策树,我们可以更清晰的理解父与子。

    使用Python了解分类决策树(附代码)

    下为更准确的信息增益公式。

    使用Python了解分类决策树(附代码)

    因为分类树是二元分裂,上述公式可以简化为以下公式。

    使用Python了解分类决策树(附代码)

    基尼指数和熵是两个用于衡量节点不纯度的常用准则。

    使用Python了解分类决策树(附代码)

    为了更好的理解这些公式,下展示了如何使用基尼指数准则计算决策树的信息增益。

    使用Python了解分类决策树(附代码)

    下展示了如何使用熵来计算决策树的信息增益。

    使用Python了解分类决策树(附代码)

    我不打算对细节进行过多的阐述,但是你应当知道,不同的不纯度度量(基尼指数和熵)通常会产生相似的结果。下就展示了基尼指数和熵是极其相似的不纯度度量。我猜测,基尼指数之所以是scikit-learn的默认值,是因为熵的计算过程略慢一些(因为它使用了对数)。

    使用Python了解分类决策树(附代码)

    不同的不纯度度量(基尼指数和熵)通常会产生相似的结果。感谢Data Science StackExchange 和 Sebastian Raschka为本提供的灵感。

    在结束本节之前,我应注明,各种决策树算法彼此不同。比较流行的算法有ID3,C4.5和CART。Scikit-learn使用了CART算法的优化版本。你可以点击此处了解它的时间复杂度。

    使用Python实现分类树

    我们在上节介绍了分类树的理论。之所以需要学习如何使用某个编程语言来实现决策树,是因为处理数据可以帮助我们来理解算法。

    加载数据

    Iris数据集是scikit-learn自带的数据集之一,不需要从外部网站。通过下列代码载入数据。

    import pandas as pdfrom sklearn.datasets import load_irisdata = load_iris()df = pd.DataFrame(data.data, columns=data.feature_names)df['target'] = data.target
    使用Python了解分类决策树(附代码)

    原始Pandas df(特征和目标)

    将数据划分为训练集和测试集

    下述代码将75%的数据划分到为训练集,25%的数据划分到测试集合。

    X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)
    使用Python了解分类决策树(附代码)

    中的颜色标注了数据框df中的数据划分到了哪类(X_train, X_test, Y_train, Y_test)变量

    注意,决策树的优点之一是,你不需要标准化你的数据,这与PCA和逻辑回归不同,没有标准化的数据对它们的影响非常大。

    Scikit-learn建模的四个步骤

    第一步:导入你想使用的模型

    在scikit-learn中,所有的机器学习模型都被封装为Python中的类。

    from sklearn.tree import DecisionTreeClassifier

    第二步:构造模型的实例

    在下列代码中,我通过设定max_depth=2来预剪枝我的树,从而确保它的深度不会超过2。请注意,这个教程的下一节将介绍如何为你的树选择恰当的max_depth值。

    还需注意,在下列代码中,我设定random_state=0,所以你也可以得到和我一样的结果。

    clf = DecisionTreeClassifier(max_depth = 2, random_state = 0)

    第三步:基于数据训练模型

    该模型将学习X (sepal length, sepal width, petal length, and petal width) 和 Y(species of iris)之间的关系。

    clf.fit(X_train, Y_train)

    第四步:预测未知(测试)数据的标签

    # Predict for 1 observationclf.predict(X_test.iloc[0].values.reshape(1, -1))# Predict for multiple observationsclf.predict(X_test[0:10])

    请记住,预测只是叶节点中实例的多数类。

    评估模型性能

    尽管有许多评估模型性能的方式(精度,召回率,F1得分,ROC曲线等),我们还是保持简单的基调,使用准确率作为评估的标准。

    准确率的定义为:(正确预测的比例):正确预测的数量/总数据量

    # The score method returns the accuracy of the modelscore = clf.score(X_test, Y_test)print(score)

    调整树的深度

    寻找max_depth最优值的过程就是调整模型的过程。下列代码输出了不同max_depth值所对应的决策树的准确率。

    # List of values to try for max_depth:max_depth_range = list(range(1, 6))# List to store the accuracy for each value of max_depth:accuracy = []for depth in max_depth_range:  clf = DecisionTreeClassifier(max_depth = depth, random_state = 0)clf.fit(X_train, Y_train) score = clf.score(X_test, Y_test) accuracy.end(score)

    由下可看出,当max_depth的值大于或等于3时,模型的准确率最高,所以选择max_depth=3,在准确率同样高的情况下,模型的复杂度最低。

    使用Python了解分类决策树(附代码)

    选择max_depth=3因为此时模型的精确率高且复杂度较低。

    你需要谨记,max_depth和决策树的深度并不是一回事。Max_depth是对决策树进行预剪枝的一个方法。换而言之,如果一棵树在某个深度纯度已经足够高,将会停止分裂。下分别展示了当max_depth的值为3,4,5时的决策树。由下可知,max_depth为4和5时的决策树是一模一样的。它们的深度相同。

    使用Python了解分类决策树(附代码)

    请观察我们是如何得到两棵一模一样的树

    如果想知道你训练的决策树的深度是多少,可以使用get_depth方法。除此之外,可以通过get_n_leaves方法得到叶子节点的数量。

    尽管本教程已经介绍了一些选择准则(基尼指数,熵等)和树的max_depth,请记住你也可以调整要分裂的节点的最小样本(min_samples_leaf),最大叶子节点数量(max_leaf_nodes)等。

    特征重要性

    分类树的优点之一是,它们相对易于解释。基于scikit-learn的分类树可以计算出特征的重要性,即在给定特征上分裂而导致基尼指数或熵减小的总量。Scikit-learn对每个特征输出一个0和1之间的数值。所有特征的重要性之和为1。下列代码展示了在决策树模型中每个特征的重要性。

    importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)})importances = importances.sort_values('importance',ascending=False)
    使用Python了解分类决策树(附代码)

    在上述例子中(iris的某个特定的训练集测试集划分),花瓣宽度的特征重要性权重最高。我们可以通过察看相应的决策树来确认。

    使用Python了解分类决策树(附代码)

    这个决策树仅基于两个特征进行分裂,分别是花瓣宽度(单位:cm)和花瓣长度(单位:cm)

    请注意,如果一个特征的重要性分值较低,也并不意味着这个特征对预测而言不重要,只是说明在树的较早阶段,它未被选择到。该特征也可能与另一个信息量较高的特征完全相同或高度相关。特征重要性值不能说明它们对哪个类别具有很好的预测性,也不会说明可能影响预测的特征之间的关系。要注意的是,在进行交叉验证或类似的验证时,可以使用来自不同训练集测试集划分的特征重要性值的平均值。

    结束语

    虽然这篇文章只介绍了用于分类的决策树,但请随意阅读我的其他文章《用于回归的决策树(Python)》。分类和回归树(CART)是一个相对较老的技术(1984),是更复杂的技术的基础。决策树的主要缺点之一是它们通常不是最准确的算法。部分原因是决策树是一种高方差算法,这意味着训练数据中的不同划分会导致非常不同的树。如果您对本教程有任何疑问或想法,请随时通过以下评论或通过Twitter与我们。

    作者简介:

    Michael Galarnyk是一名数据科学家和企业培训师。他目前在Scripps翻译研究所工作。

    您可以在:

    Twitter(https://twitter.com/GalarnykMichael)

    Medium(https://medium.com/@GalarnykMichael)

    GitHub(https://github.com/mGalarnyk)上找到他。

    原文标题:

    Understanding Decision Trees for Classification in Python

    原文链接:

    https://www.kdnuggets.com/2019/08/understanding-decision-trees-classification-python.htm

    :于腾凯

    :林亦霖

    译者简介

    使用Python了解分类决策树(附代码)

    李润嘉,首都师范大学应用统计硕士在读。对数据科学和机器学习兴趣浓厚,语言学习爱好者。立志做一个有趣的人,学想学的知识,去想去的地方,敢想敢做,不枉岁月。

    — 完 —

    清华-青岛数据科学研究院官方公众平台“THU数据派”及姊妹号“数据派THU”获取更多讲座福利及优质内容。

    常用数据挖掘算法从入门到精通 第八章 C4.5决策树分类算法

    上一篇文章为大家介绍了ID3决策树分类算法,本文为大家介绍C4.5决策树分类算法,并附有详细的案例帮助大家理解。

    C4.5分类算法介绍

    C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进

    C4.5算法在决策树的生成过程中,用信息增益比来选择特征

    C4.5算法考虑了对连续型的属性处理

    C4.5算法考虑了对样本的缺失数据处理

    信息增益比(Information Gain Ratio)

    信息增益是一种衡量最优分支属性的有效函数,但是它倾向于选择具有大量不同取值的属性,从而产生许多小而纯的子集,为了改进这种状况,提出使用信息增益比例来代替信息增益。

    分裂信息

    分裂信息用来衡量属性F分裂数据样本S的广度和均匀性这个信息量是与样本的类别无关的,它由如下公式所示:

    常用数据挖掘算法从入门到精通 第八章 C4.5决策树分类算法

    分裂信息的计算公式

    Sv表示属性F划分的第v个样本子集。

    信息增益比

    属性F对样本S进行划分的信息增益比如下公式所示:

    常用数据挖掘算法从入门到精通 第八章 C4.5决策树分类算法

    信息增益比计算

    一个属性分割样本的的广度越大,均匀性越强,该属性的split_info越大,增益比例就越小,因此使用信息增益比例降低了选择那些值较多且均匀分布的属性的可能性

    对连续型属性的处理

    离散化处理:将连续型的属性变量进行离散化处理,形成决策树的训练集

    把需要处理的样本(对应根节点)或样本子集(对应子树)按照连续变量的大小从小到大进行排序

    假设该属性对应的不同的属性值一共有N个,那么总共有N-1个可能的候选分割阈值点,每个候选的分割阈值点的值为上述排序后的属性值中两两前后连续元素的中点

    信息增益比选择最佳划分

    对样本缺失值的处理

    缺失值:在某些情况下,可供使用的数据可能缺少某些属性的值。例如(X, y)是样本集S中的一个训练实例,X=(F1_v, F2_v, …Fn_v)。但是其属性Fi的值Fi_v未知。

    处理策略:

    处理缺少属性值的一种策略是赋给它结点t所对应的训练实例中该属性的最常见值

    另外一种更复杂的策略是为Fi的每个可能值赋予一个概率

    例如,给定一个布尔属性Fi,如果结点t包含6个已知Fi_v=1和4个Fi_v=0的实例,那么Fi_v=1的概率是0.6,而Fi_v=0的概率是0.4。于是,实例x的60%被分配到Fi_v=1的分支(也就是分配到这边的样本数+0.6)40%被分配到另一个分支(也就是分配到这边的样本数+0.4)

    简单处理策略就是丢弃这些样本

    C4.5算法步骤

    C4.5的算法步骤与ID3算法的步骤类似,最主要的区别就是,C4.5算法采用信息增益比来选择特征。

      创建根节点R

      如果当前DataSet中的数据都属于同一类,则标记R的类别为该类

      如果当前featureList集合为空,则标记R的类别为当前 DataSet中样本最多的类别

      递归情况:

    从featureList中选择属性F(选择GainRatio(DataSet, F)最大的属性,连续属性参见上面的离散化过程)

    根据F的每一个值v,将DataSet划分为不同的子集DS,对于每一个DS:

    创建节点C

    如果DS为空,节点C标记为DataSet中样本最多的类别

    如果DS不为空,节点C=C4.5(DS, featureList - F)

    将节点C添加为R的子节点

    C4.5算法实例分析

    对毕业生的就业信息进行分析,寻找可能影响毕业生就业的因素。

    常用数据挖掘算法从入门到精通 第八章 C4.5决策树分类算法

    毕业生就业信息表

    第1步,计算决策属性的经验熵(训练集的全部信息量)

    entropy(就业情况)=entropy(14,8)

    = -14/22*log2(14/22) - 8/22*log2(8/22)

    =0.945660

    第2步,计算每个属性的信息增益,以属性“性别”为例

    entropy(男)=entropy(10,7)

    = -10/17*log2(10/17)- 7/17*log2(7/17)

    =0.977417

    entropy(女)=entropy(4,1)

    = -4/5*log2(4/5)- 1/5*log2(1/5)

    =0.721928

    因此,“性别”的条件熵为:entropy(性别)

    =17/22*entropy(男)+5/22*entropy(女)

    =0.919351

    因此,“性别”的信息增益为:Gain(性别)

    =entropy(就业情况) - entropy(性别)

    = 0.026308

    第3步,计算样本在“性别”属性上的分裂信息

    split_info(性别)

    = -17/22*log2(17/22) - 5/22*log2(5/22)

    =0.773226

    第4步,计算样本在“性别”属性上的信息增益比

    gain_ratio(性别)= Gain(性别)/split_info(性别)

    =0.026308/0.773226=0.034023

    运用同样的方法计算样本在其他属性上的信息增益比

    gain_ratio(性别)=0.034023;

    gain_ratio(学生干部)= 0.411714;

    gain_ratio(综合成绩)=0.088391;

    gain_ratio(毕业论文)= 0.101671

    第5步,选择分类属性

    由上述计算结果可知,“学生干部”属性具有最大的信息增益比,取“学生干部”为根属性,引出一个分支,样本按此划分。对引出的每一个分支再用此分类方法进行分类,再引出分支,最后所构造出的决策树如下所示。

    常用数据挖掘算法从入门到精通 第八章 C4.5决策树分类算法

    最终构造出的决策树

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    作者:Abhishek Sharma

    翻译:陈超

    :丁楠雅

    本文长度为4600字,建议阅读20分钟

    本文以银行贷款数据为案例,对是否批准顾客贷款申请的决策过程进行了算法构建,并对比了决策树与随机森林两种机器学习算法之间的异同及各自的优劣。

    标签:算法,初学者,分类,机器学习,Python,结构化数据,监督

    用一个简单的比喻来解释决策树 vs 随机森林

    让我们从一个思维实验来阐述决策树和随机森林之间的差异。

    假设一个银行要给一位顾客批准一笔小额贷款,银行需要迅速做出决策。银行检查了这位顾客的信用记录和他的财政状况,并发现他还没有还上之前的贷款。因此,银行拒绝了他的申请。

    但是,这笔贷款跟银行所拥有的巨额资金相比实在是小的可怜,银行本可以轻易地批准这笔贷款并且也不会承担很多风险。于是,银行失去了一次赚钱的机会。

    现在,银行又来了一个贷款申请,但是这次银行想出了一种不同的策略——多重决策过程。有时它会先检查信用历史,有时它会先检查顾客的财政状况和贷款额度。然后,银行会把这些多重决策过程的结果进行整合,并最终决定是否将贷款发放给顾客。

    即使这个过程比之前更费时,但是银行依然能够通过此途径获利。这是一个基于单一决策过程进行集合决策的经典案例。现在,我的问题来了——你知道这两个过程表征的是什么吗?

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    这里是决策树和随机森林,我们将详细探究这种观点,深入挖掘两种方法的主要差异,并且对关键问题进行回复——你应该选择那种机器学习算法?

    目录

    决策树简介

    随机森林概览

    随机森林和决策树的冲突(代码)

    为什么随机森林优于决策树?

    决策树vs随机森林——你应该在何时选择何种算法?

    决策树简介

    决策树是一种有监督的机器学习算法,该方法可以用于解决分类和回归问题。决策树可以简单地理解为达到某一特定结果的一系列决策。这里是一幅决策树的阐述(使用我们上面的案例):

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    让我们来理解这棵树是如何工作的。

    首先,它检查了顾客是否有良好的信用历史。基于此,它将顾客分为两组,也就是良好信用组和不良信用组。然后,它检查了顾客的收入,并再次将顾客分为两类。最后,它检查了顾客申请的贷款额度。基于这三种特征的检测,决策树会决定是否通过顾客的贷款申请。

    特征/属性和调节可能会随着数据和问题复杂度的改变而改变,但是整体的理念是一致的。所以,一棵决策树会基于一系列特征做出一系列的决策,在本例中是信用历史、收入和贷款额度。

    现在,你可能会疑惑:

    “为什么决策树会先检测信用得分而不是收入呢?”

    特征重要性和特质的检测顺序是基于如基尼不纯度指数或信息增益等标准来决定的。这些概念的解释不在本文所探讨的范围内,但是你可以通过以下的资料来学习决策树相关知识:

    基于树的算法:从零开始的完整教程(R & Python)

    https://www.analyticsvidhya.com/blog/2016/04/tree-based-algorithms-complete-tutorial-scratch-in-python/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    从决策树开始(免费课程)

    https://courses.analyticsvidhya.com/courses/getting-started-with-decision-trees?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    注:本文的想法是比较决策树和随机森林。因此,我不会详细解释基本概念,但是我将提供相关链接以便于你可以进一步探究。

    随机森林概览

    决策树算法很容易理解和解释。但是通常来说,一棵简单的树并不能产生有效的结果。这就是随机森林算法的用武之地。

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    随机森林是基于树的机器学习算法,该算法利用了多棵决策树的力量来进行决策。顾名思义,它是由一片树木组成的“森林”!

    但是为什么要称其为“随机森林”呢?这是因为它是随机创造的决策树组成的森林。决策树中的每一个节点是特征的一个随机子集,用于计算输出。随机森林将单个决策树的输出整合起来生成最后的输出结果。

    简单来说:

    “随机森林算法用多棵(随机生成的)决策树来生成最后的输出结果。”

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    这种结合了多个单一模型的输出(也被称为弱学习)的过程被称为集成学习。如果你想阅读更多关于随机森林和其他集成学习算法如何工作,请查阅一下文章:

    从零开始构建一个随机森林&理解真实世界的数据产品

    https://www.analyticsvidhya.com/blog/2018/12/building-a-random-forest-from-scratch-understanding-real-world-data-products-ml-for-programmers-part-3/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    随机森林超参数调优——一个初学者的指南

    https://www.analyticsvidhya.com/blog/2020/03/beginners-guide-random-forest-hyperparameter-tuning/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    集成学习的综合指南(使用Python代码)

    https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-for-ensemble-models/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    如何在机器学习中建立集成模型?( R代码)

    https://www.analyticsvidhya.com/blog/2017/02/introduction-to-ensembling-along-with-implementation-in-r/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    现在的问题是,我们怎样选择决策树和随机森林算法呢?让我们在做出结论之前,先看看过两种算法的具体情况。

    随机森林和决策树的冲突(代码)

    本部分,我们将使用Python实现决策树和随机森林算法来解决一道二分类问题。我们接下来将会比较它们的结果并看一看那种更适合解决我们的问题。

    我们将基于Analytics Vidhya’s DataHack(https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm)平台的贷款预测数据集进行分析。这是一个二分类问题,我们需要基于特定的特征集来决定一个人是否可被批准获得贷款。

    注:你可以去DataHack(https://datahack.analyticsvidhya.com/contest/all/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm )平台并在不同在线机器学习竞赛中与他人竞争,并且有机会获得令人兴奋的奖品。

    准备好编程了吗?

    第一步:加载库和数据集

    让我们从导入所需的Python库和我们的数据集开始:

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    数据库包括614列和13个特征,包括信用历史(credit history),婚姻状况(marital status),贷款额度(loan amount),和性别(gender)。在这里,目标变量是是否贷款(Loan_Status),该变量表明是否一个人能够被批准获得贷款。

    第二步:数据预处理

    现在到了任何数据科学项目中最为关键的部分——数据预处理和特征工程。本部分中,我将处理数据中的类别变量以及缺失值插补。

    我将使用特定的模式对类别变量中的缺失值进行插补,并且对连续型变量用平均值插补(每列分别插补)。我们也将对类别变量进行标签设置。你可以阅读以下文章来了解更多关于标签编码的内容。

    https://www.analyticsvidhya.com/blog/2016/07/practical-guide-data-preprocessing-python-scikit-learn/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    # Data Preprocessing and null values imputation# Label Encodingdf['Gender']=df['Gender'].map({'Male':1,'Female':0})df['Married']=df['Married'].map({'Yes':1,'No':0})df['Education']=df['Education'].map({'Graduate':1,'Not Graduate':0})df['Dependents'].replace('3+',3,inplace=True)df['Self_Employed']=df['Self_Employed'].map({'Yes':1,'No':0})df['Property_Area']=df['Property_Area'].map({'Semiurban':1,'Urban':2,'Rural':3})df['Loan_Status']=df['Loan_Status'].map({'Y':1,'N':0})#Null Value Imputationrev_null=['Gender','Married','Dependents','Self_Employed','Credit_History','LoanAmount','Loan_Amount_Term']df[rev_null]=df[rev_null].replace({np.nan:df['Gender'].mode(),                                   np.nan:df['Married'].mode(),                                   np.nan:df['Dependents'].mode(),                                   np.nan:df['Self_Employed'].mode(),                                   np.nan:df['Credit_History'].mode(),                                   np.nan:df['LoanAmount'].mean(),                                   np.nan:df['Loan_Amount_Term'].mean()})rfc_vs_dt-2.py hosted with ❤ by GitHub
    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    第三步:创造训练集和测试集

    现在,让我们以80:20的比例进行训练集和测试集的划分:

    X=df.drop(columns=['Loan_ID','Loan_Status']).valuesY=df['Loan_Status'].valuesX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 42)rfc_vs_dt-3.py hosted with ❤ by GitHub

    让我们一眼所划分的训练集和测试集:

    print('Shape of X_train=>',X_train.shape)print('Shape of X_test=>',X_test.shape)print('Shape of Y_train=>',Y_train.shape)print('Shape of Y_test=>',Y_test.shape)rfc_vs_dt-4.py hosted with ❤ by GitHub
    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    真棒!现在我们已经准备好进入下一个阶段构建决策树和随机森林模型了!

    第四步:构建和评估模型

    既然我们已经有了训练和测试集,是时候训练模型和分类贷款申请了。首先,我们将在数据机上进行决策树的训练:

    # Building Decision Treefrom sklearn.tree import DecisionTreeClassifierdt = DecisionTreeClassifier(criterion = 'entropy', random_state = 42)dt.fit(X_train, Y_train)dt_pred_train = dt.predict(X_train)rfc_vs_dt-5.py hosted with ❤ by GitHub

    接下来,我们将使用F1-Score对模型进行评估。F1-Score是由公式给出的精度和召回的调和平均数:

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    你可以通过以下文章来了解更多关于F1-Score和其他的评估方法:

    https://www.analyticsvidhya.com/blog/2019/08/11-important-model-evaluation-error-metrics/?utm_source=blog&utm_medum=decision-tree-vs-random-forest-algorithm

    让我们来评价F1-Score模型的表现:

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)决策树VS随机森林——应该使用哪种算法?(附代码&链接)
    # Evaluation on Training setdt_pred_train = dt.predict(X_train)print('Training Set Evaluation F1-Score=>',f1_score(Y_train,dt_pred_train))rfc_vs_dt-6.py hosted with ❤ by GitHub# Evaluating on Test setdt_pred_test = dt.predict(X_test)print('Testing Set Evaluation F1-Score=>',f1_score(Y_test,dt_pred_test))rfc_vs_dt-7.py hosted with ❤ by GitHub

    在这里,你可以看到决策树在样本内估计的表现非常好,但是在样本外估计的表现迅速下降。为什么会出现这种情况呢?因为我们的决策树在训练集上产生了过拟合。随机森林能否解决这一问题?

    建立随机森林模型

    让我们来看一下随机森林模型:

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    在这里,我们可以清楚地看到在样本外估计当中,随机森林模型比决策树的表现更优。让我们在接下来的一部分当中来讨论一下背后的原因。

     # Building  Random Forest Classifierfrom sklearn.ensemble import RandomForestClassifierrfc = RandomForestClassifier(criterion = 'entropy', random_state = 42)rfc.fit(X_train, Y_train)# Evaluating on Training setrfc_pred_train = rfc.predict(X_train)print('Training Set Evaluation F1-Score=>',f1_score(Y_train,rfc_pred_train))rfc_vs_dt-8.py hosted with ❤ by GitHubf1 score random forest# Evaluating on Test setrfc_pred_test = rfc.predict(X_test)print('Testing Set Evaluation F1-Score=>',f1_score(Y_test,rfc_pred_test))rfc_vs_dt-9.py hosted with ❤ by GitHub

    为什么我们的随机森林模型比决策树表现更好?

    随机森林利用了多棵决策树的优势。它的确不依赖于单一决策树的特征重要性。让我们来看一看不同算法给予不同特征的特征重要性。

    feature_importance=pd.DataFrame({    'rfc':rfc.feature_importances_,    'dt':dt.feature_importances_},index=df.drop(columns=['Loan_ID','Loan_Status']).columns)feature_importance.sort_values(by='rfc',ascending=True,inplace=True)index = np.arange(len(feature_importance))fig, ax = plt.subplots(figsize=(18,8))rfc_feature=ax.barh(index,feature_importance['rfc'],0.4,color='purple',label='Random Forest')dt_feature=ax.barh(index+0.4,feature_importance['dt'],0.4,color='lightgreen',label='Decision Tree')ax.set(yticks=index+0.4,yticklabels=feature_importance.index)ax.legend()plt.show()rfc_vs_dt-10.py hosted with ❤ by GitHub
    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    正如你在上所见,决策树模型基于某一个特征集很高的重要性。但是随机森林算法在训练过程中随机选择特征。因此,的确不依赖于任何特定的特征集。这是随机森林算法优于bagging算法的一个特殊之处。你可以阅读以下文章获取更多bagging算法知识。

    https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html#sklearn.ensemble.BaggingClassifier

    因此,随机森林可以更好地在数据中心进行泛化。随机化特征选择可以使得随机森林比决策树更准确。

    所以你应该选择哪一种算法呢——决策树还是随机森林?

    “随机森林适用于拥有大型数据集的情况,并且可解释性不是主要考虑因素。”

    决策树更容易解释和理解。因为随机森林整合了多棵决策树,更难以解释。但是好消息是——解释随机森林也并非不可能。这里有一篇文章讲了如何解释随机森林模型的结果:

    https://www.analyticsvidhya.com/blog/2019/08/decoding-black-box-step-by-step-guide-interpretable-machine-learning-models-python/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm

    并且,随机森林比起单一决策树需要更长的训练时间。你应该把此纳入考虑,因为随着决策树数量的增加,所需要的训练时间也会越长。在你面临着紧张的机器学习项目安排过程中这可能通常是至关重要的。

    但是我要说的是——尽管结果不稳定,且依赖于特定的特征集,决策树真的很有帮助,因为他们更容易去解释、训练更快。任何对数据科学缺乏知识的人都可以使用决策树进行快速的数据驱动决策。

    写在最后的话

    了解决策树和随机森林之争是非常有必要的。在你初入机器学习领域时,这可能是一个很棘手的问题,但是本文能够为你阐明两者之间的异同。

    原文标题:

    Decision Tree vs. Random Forest – Which Algorithm Should you Use?

    原文链接:

    https://www.analyticsvidhya.com/blog/2020/05/decision-tree-vs-random-forest-algorithm/

    :王菁

    :龚力

    译者简介

    决策树VS随机森林——应该使用哪种算法?(附代码&链接)

    陈超,北京大学应用心理硕士在读。本科曾混迹于计算机专业,后又在心理学的道路上不懈求索。越来越发现数据分析和编程已然成为了两门必修的生存技能,因此在日常生活中尽一切努力更好地去接触和了解相关知识,但前路漫漫,我仍在路上。

    —完—

    想要获得更多数据科学领域相关动态,诚邀清华-青岛数据科学研究院官方公众平台“ 数据派THU ”。

    来自星星的你
  • 决策树分类算法,使用Python了解分类决策树(附代码)

    作者:Michael Galarnyk翻译:李润嘉:和中华本文约3600字,建议阅读15分钟。本教程介绍了用于分类的决策树,即分类树,包括分类树的结构,分类树如何进行预测,使用scikit-learn构造分类树,以及超参数的调整。本教程详细介绍了决策树的工作原理由于各种原因,决策树一种流行的监督学习方法。决策树的优点包括,它既可以用于回归,也可用于分类,易于解释并且不需要特征缩放。它也有一些缺点,比如容易过拟合。本教程介绍了用于分类的决策树,也被称为分类树。除此之外,本教程还将涵盖:分类树的结构(树的深度...

    2023-09-17 7002阅读 193人支持 0篇回答
  • 数据挖掘之分类算法——决策树(ID3实现)(决策树分类算法)

    古语有云:"物以类聚、人以群分"。那背后隐含的深刻思想:相似的对象最终会聚到一起去,然后聚集后的群体又可以根据聚集后的群体性特征(或者某些特征)一一进行划分。通过这样一个过程,就可以尽最大可能的降低类别信息处理的时间、空间复杂度。比如垃圾邮件分类、人群聚类的标签生成.....那么,今天,我们重点介绍一下决策树分类算法,具体以ID3算法为实例的讲解。首先,什么是决策树?又名:判定树,因其结构形似树状结构,故以“树”字来命名。决策树包括三个部分:根节点、内部节点和叶子节点,其中根节点代表最...

    2023-09-08 7669阅读 61人支持 0篇回答
  • 系带撕裂了一个小口子,好吃到不自觉微笑——正宗的粤式双皮奶

    大家都知道双皮奶是一款经典的粤式甜点,做法虽不算是太简单,但是现在出了什么双皮奶冲粉,开水一冲就好,给厨房小白们提供了不少便利,但是口感真的是差太远了。 去过顺德的朋友就应该知道,大大街小巷都可以找到正宗的双皮奶,厚厚的奶皮,浓郁的奶香,吃过就不会忘记。 双皮奶之所以“双皮”,是因为牛奶经过两次高温洗礼,会在表面两次凝集成奶皮子,最后形成厚厚的一层奶皮,那就是双皮奶的特色了。 今天我要介绍的就是最正宗的双皮奶做法,这个是两碗的量。如果怕麻烦,可以直接做“单皮奶”,省略前面把奶倒来倒去的步骤,直接从第6步牛...

    2023-09-17 3257阅读 91人支持 0篇回答
  • 一组手臂二三头肌训练,助你练出结实有力的麒麟臂(如何锻炼手臂肌肉力量)

    男人的麒麟臂是力量是象征,也是好身材不可缺少的组成部分。但是,练出好看的麒麟臂是需要技巧的。2️⃣三头肌训练1- 哑铃曲臂伸:手持哑铃,向上举起至颈后,再曲肘将哑铃向后放下,感受肌肉扩展、收缩的状态。3- 颈后臂屈伸:仰卧状态,手握杠铃,手臂从颈后处慢慢抬起,再慢慢放下。这个动作可以加强三头肌部分。进行手臂训练的时候,要记得配合其他身体部位的训练,合理安排肩背、胸肌等肌群的训练,才能够获得更加全面的锻炼效果。为什么手臂总是练不粗,看完这篇文章你就明白了#全民健身# 大家好,我是修陈,上篇文章已经分享了腹...

    2023-09-17 7982阅读 84人支持 0篇回答
  • 请勿下架【十大禁曲】黑色星期五(全球十大禁曲原版试听)

    请勿下架【十大禁曲】天使的房间世界三大禁曲你敢听,世界十大禁画你敢看吗? 都知道世界三大禁曲《忏魂曲》、《第十三双眼睛》和《黑色星期五》,但可能很多的人都不知道世界禁画,禁曲是因为音符的魔力使人自杀,而禁画则是带有一种神秘的恐怖诅咒,比如世界两大禁画:《迪奥的世界》、《耶稣画像》,传说收藏过这些画的人都会离奇死亡,而其他的禁画,也都是网友评选出来的。 相传,这幅《迪奥的世界》的作者是中世纪意大利作家比尔·索拉道克夫。在她妻子背叛他、嫌他默默无闻的时候,他在坟堆里与魔鬼作了交易,把眼睛卖给了魔鬼。魔鬼拉着比...

    2023-09-17 3477阅读 138人支持 0篇回答
  • 没想到吧,有了二胎的戚薇说,安全期并不安全(戚薇怀孕安全期)

    27日,在最新一期的《披荆斩棘的哥哥》节目中,李承铉公布了二胎得子的好消息,稍晚,戚薇工作室分享一则vlog恭喜戚薇、李承铉得子,视频记录了戚薇从怀孕到生产的过程,戚薇在vlog中表示安全期并不安全。真是让人没有想到,在安全期的最后一天,由于baby的爸爸没有把持住,让这种极小概率的事情发生了。虽然是个意外之喜,但是这么小的概率,也是命中注定,在这里也恭喜恭喜lucky 做姐姐了~恭喜戚哥和铉哥喜提虎宝宝~戚哥 铉哥也和两个baby也凑成了一个四口之家最后,戚薇忠实告诫大家:“千万不要觉得自己有安全期”“...

    2023-09-17 6136阅读 145人支持 0篇回答
  • 懒人学琴民谣吉他谱①,收藏吧!(民谣吉他谱怎么看懂)

    《董小姐》《斑马斑马》《南山南》《骊歌》《莉莉安》《同桌的你》《贝加尔湖畔》民谣吉他二级进阶(第6课下):阿冗《你的答案》吉他谱可以让你在短时间内学会吉他弹唱/弹奏。二级进阶(第六课)下学习吉他弹唱,不会区分大小调,只会动手,和练武没什么两样在国内快餐文化盛行的年代,吉他速成也是遍地开花,速成的背后是享受了一时的快感,带来的却是止步不前。想真正学好一门乐器,乐理就是你的指明灯,此篇文章让你明白,学习吉他弹唱,必须学习的第一个乐理知识——学会区分歌曲的大小调。一、区分一首歌曲是大调还是小调,常见的有以下两种...

    2023-09-17 6750阅读 121人支持 0篇回答
  • 外星飞船?日照附近海域发现不明飞行物,准备击落,到底是什么?(中国击落ufo外星人视频)

    导语:不明飞行物,一提到这个词,大多数人脑海里可能会浮现出外星人和UFO的形象。探索未知、追求奇异的好奇心使得人类对此充满了无限的遐想。最近,一则消息在网络上传播,引发了广泛,同时也得到了官方的正式证实。原文中的信息是关于山东省日照附近海域发现一架不明飞行物,官方已表明将采取行动击落它,提供了详细的位置坐标,并呼吁附近渔船注意安全,如果有发现飞行物坠落,应拍照并提供协助打捞。然而,这个故事的发展将按照全新的叙事顺序重新编排,结构将被调整,以呈现出全新的视角。那是一个令人心惊的消息,就在不久前,山东省日照附...

    2023-09-17 7274阅读 185人支持 0篇回答
  • dnf补丁安装在哪个文件夹,DNF:史诗都在这样的深渊柱子里吗?贴图文件怎么打开?

    DNF:史诗都在这样的深渊柱子里吗?贴文件怎么打开?DNF每天刷深渊实在是腻烦了,那干巴巴的深渊柱能变成别的模样吗?DNF的ImagePacks2文件夹是NPK格式的游戏像文件,只需要找到深渊柱的文件进行修改,你也能做出自己的补丁。搜索一个DNFEX工具,只有几十M,安装完成即可查看修改NPK文件。勇士们会做出哪些好玩的补丁呢?DNF:不会用猜仙草补丁怎么办?教你如何用补丁并一键删除补丁,一直是DNF玩家中盛传的东西,宝宝的红狗都在用墨镜补丁呢,那么十周年猜仙草活动中,昨天给大家分享了去隐藏补丁,但是很多...

    2023-09-17 5314阅读 74人支持 0篇回答