如何在Python中从零开始实现随机森林?
随机森林(Random Forest)属于集成学习(Ensemble Learning)的一种。集成学习,顾名思义,就是集众模型之大成。类比一下日常生活中的日子,比如给试卷评分,客观题很简单,直接按照标准答案就是了(实际上现在考试客观题基本都通过机器阅卷了),但是主观题就没那么简单了。普通的小测验,一个老师打个分就是了,但重大考试,为了慎重,往往会找多个老师同时打分,然后通过某种算法得出一个最终分,一般而言是平均,但对分差过大的情况会作特殊处理。某种意义上,其实是让多个老师投票投出一个最终得分。再比如,判例法系统中的陪审团,也可以看成是集成学习。(但是各种选秀节目的评委打分就不一定是集成学习了,因为有很多黑箱操作 ;-) 集成学习,也是让多个模型学习同一个问题,然后通过某种投票(voting)机制,得出较优的结果。
(图片来源:KDnuggets)
随机森林,顾名思义,就是找一批决策树来进行决策。用Python代码来表示,就是构建一个决策树的列表,然后让这些决策树“投票”:
trees = [create_tree() for i in range(n)]
predictions = [bagging(trees, sample) for sample in test_data]
其中,create_tree函数用于构建决策树,限于篇幅,具体定义这里省略(可以参考各决策树教程)。
bagging在原数据集的基础上创建多个子数据集,然后分给多棵决策树,让这些决策树分别学习,最后通过某种投票机制(比如平均数、中位数、众数)集成多棵决策树的成果。
比如,通过众数:
predictions = [predict(trees, sample) for sample in test_data]
bagging_prediction = max(set(predictions), key=predictions.count)
好了,随机森林的关键思路就是这些了。详细的代码示例这里就不贴了,可以自行在GitHub等地搜索。
另外,绝大多数情况下,并不需要从零开始实现随机森林,可以直接利用现成的库,比如sklearn.ensemble就提供了RandomForestClassifier。
当然,从零开始实现,对于理解随机森林还是很有帮助的。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有