作者:Abhishek Sharma

翻译:陈超

校对:丁楠雅

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

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

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

用一个简单的比喻来解释决策树 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

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

随机森林概览

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

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

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

简单来说:

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

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

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

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库和我们的数据集开始:

数据库包括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

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

现在,让我们以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

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

第四步:构建和评估模型

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

# 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是由公式给出的精度和召回的调和平均数:

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

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

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

# 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

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

建立随机森林模型

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

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

 # 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 GitHub
f1 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

正如你在上图所见,决策树模型基于某一个特征集很高的重要性。但是随机森林算法在训练过程中随机选择特征。因此,的确不依赖于任何特定的特征集。这是随机森林算法优于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/

编辑:王菁

校对:龚力


招聘信息

岗位: 开发运维工程师

职能:研发团队支持——配合多个研发组,搭建、维护、优化Jenkins、禅道、数据库、大数据平台等,开发、支持持续集成(CI-CD)脚本和流程、软件发布管理,提高各个研发组的开发效率。深入研究运维相关技术以及新型软硬件技术,包括运维自动化技术,虚拟化技术,监控技术,网络技术等。对外提供数为软件系统的云服务和培训服务设施等。

招聘要求:本科学历、带有大数据系统(Hadoop、Kafka、ES、MongoDB、Jenkins等)使用经历

入职单位: 清华大学软件学院 大数据系统软件国家工程实验室 (工作地点:双清大厦)

简历投递地址:zifanwang@tsinghua.edu.cn
招聘日期:即日起至2020年7月16日

译者简介

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

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家 | 决策树VS随机森林——应该使用哪种算法?(附代码链接)相关推荐

  1. 决策树 随机森林 xgboost_从决策树到随机森林理论篇从人话到鬼话:看不懂来找我麻烦...

    从决策树产生的一些列的问题,过度到随机森林: 全文大概要阅读10分钟: 随机森林算法范畴 监督学习分类算法,基模型是由决策树组成 决策树 决策树模型与学习 特征选择 决策树生成 决策树剪枝 CART算 ...

  2. 使用泰坦尼克号数据进行决策树、随机森林

    使用泰坦尼克号数据进行决策树.随机森林 决策树分类器 随机森林 决策树分类器 sklearn.tree.DecisionTreeClassifier(criterion='gini',max_dept ...

  3. 独家 | 一文读懂随机森林的解释和实现(附python代码)

    作者:William Koehrsen 翻译:和中华 校对:李润嘉 本文约6000字,建议阅读15分钟. 本文从单棵决策树讲起,然后逐步解释了随机森林的工作原理,并使用sklearn中的随机森林对某个 ...

  4. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)

    ML之回归预测:利用十类机器学习算法(线性回归.kNN.SVM.决策树.随机森林.极端随机树.SGD.提升树.LightGBM.XGBoost)对波士顿数据集[13+1,506]回归预测(模型评估.推 ...

  5. 【机器学习基础】(五):通俗易懂决策树与随机森林及代码实践

    与SVM一样,决策树是通用的机器学习算法.随机森林,顾名思义,将决策树分类器集成到一起就形成了更强大的机器学习算法.它们都是很基础但很强大的机器学习工具,虽然我们现在有更先进的算法工具来训练模型,但决 ...

  6. 决策树和随机森林(上)

    决策树和随机森林 信息熵 熵 联合熵 条件熵 互信息 决策树学习算法 信息增益 ID3.C4.5.CART Bagging与随机森林 概念部分 思考:两点分布的信息熵 import numpy as ...

  7. 2.1.决策树和随机森林

    2.1.决策树和随机森林 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用 ...

  8. 机器学习中的不平衡分类方法(part5)--决策树与随机森林

    学习笔记吗,仅供参考,有错必纠 文章目录 决策树与随机森林 基本流程 决策树定义及结构 决策树学习步骤 划分选择 信息增益 增益率 基尼基数 剪枝处理 随机森林 决策树与随机森林 决策树(decisi ...

  9. python实现决策树算法sklearn_python sklearn-05:决策树及随机森林

    1.决策树 2.随机森林 1.决策树(decision tree) 决策树一种简单的非线性模型,用来解决回归与分类问题. 通常是重复的将训练集解释变量分割成子集的过程.决策树的节点用方块表示,用来测试 ...

最新文章

  1. USTC English Club Note20171013(2)
  2. MySQL数据库的可视化管理工具连接时一些问题解决~
  3. InnoDB中一棵B+树能存多少行数据
  4. lintcode:二叉树的层次遍历
  5. c 和java互相验签_C椭圆曲线签名 用java验签
  6. c语言malloc calloc,C语言内存管理:malloc、calloc、free的实现
  7. 比较ArrayList和数组的区别
  8. OpenCV形态学操作
  9. 百度 ERNIE 在 GLUE 大赛中击败了微软和谷歌
  10. 华三服务器linux系统安装u盘,华三H3CR4900服务器安装linux系统
  11. 老男孩大趴会笔记分享
  12. 5月25 python3.6—pymouse—pyhook_3安装问题
  13. 【文章汇总】J2ME程序开发全方位基础讲解
  14. Python实验二——制作可视化标准计算器
  15. 下载webex client的remover
  16. 1 12c语言,1.4.1 Oracle数据库12c中PL/SQL的新特性
  17. 租用国外服务器兴起的背景
  18. [渝粤教育] 南京交通职业技术学院 计算机基础 参考 资料
  19. 选择城市,按城市的首字母进行排序
  20. CentOS 7 安装 OTRS工单提交跟踪系统

热门文章

  1. redhat7操作系统安装
  2. Scalaz(7)- typeclass:Applicative-idomatic function application
  3. HTML5之音频audio知识(部分vedio)
  4. CPU制作流程大揭密
  5. 语言用加法实现加饭运算_面试官:这个经典的并发问题用 Go 语言如何实现?...
  6. 荧光皮肤有哪些_荧光增白剂真的致癌吗?
  7. oracle完全卸載,Oracle10g的完全卸載
  8. oracle 替换逗号,oracle自定义函数:将字符串中的特殊字符转化为逗号
  9. 快速排序算法(基于Java实现)
  10. 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解