如果你已经知道如何对决策树进行编码,那么你想更进一步是很自然的--既然你可以有很多棵树,为什么还要停留在一棵树上呢?告诉你一个好消息:Python中的随机森林的概念很容易掌握,而且它们也很容易实现。
在本教程中,你将学习什么是随机森林,以及如何在Python中用scikit-learn编写一个随机森林。对于阅读这篇文章,了解回归和分类决策树被认为是一个前提条件。此外,为了获得完整的体验,还需要安装matplotlib、 pandas和 scikit-learn。
注意:这篇文章可以帮助设置你的数据服务器,然后这篇文章可以安装数据科学库。
我想指出的是,我们将为一个分类任务编码一个随机森林。原因很简单:在现实生活中,我相信你更有可能要解决一个分类任务而不是回归任务。
考虑到这一点,让我们首先了解什么是随机森林,以及为什么它比简单的决策树更好。
随机森林--它是什么?
I.随机森林是一堆不同的决策树,可以克服过度拟合的问题
这就是森林部分的意思;如果你把一堆树放在一起,你就得到一个森林。大脑时间,对吗?
说实在的,创建森林背后有一个非常聪明的动机。如果你记得,决策树不是最好的机器学习算法,部分原因是它们容易过度拟合。
为什么呢?
在某个数据集上训练的决策树是由其设置(如深度、分割标准等)定义的。如果你用相同的设置为同一个数据集创建一个模型,你会得到完全相同的决策树(相同的根节点,相同的分割,相同的一切)。
如果你给你的决策树引入新的数据......哦,孩子,过拟合就发生了
问题是,我们真的不希望过拟合发生,所以我们需要以某种方式创建不同的树。不同的树意味着每棵树对我们的数据提供了一个独特的视角(=它们有不同的设置)。我们希望如此,因为这些独特的视角会导致对我们的数据集有一个更好的、集体的理解。
长话短说,这种集体智慧是通过创建许多不同的决策树实现的。这也是减少过度拟合的原因,与单一的决策树相比,能产生更好的预测结果。
那么,百万美元的问题是:我们如何获得不同的树?
这就是令人兴奋的部分。随机的部分。
二。随机森林是随机的,因为我们为其决策树随机化了特征和输入数据。
二/一。随机化的特征
你已经知道,一棵决策树并不总是使用数据集的所有特征。这不一定好,因为遗漏的特征对于理解你的数据集仍然很重要。
那么,随机森林是怎么做的呢?
在决策树的每个分叉处,它随机化了它所考虑的特征。通过这样做,它让数据集中的每个特征都有机会在数据分类中发言。
让我用一个快速的例子来解释。如果你有一个具有五个特征(F1、F2、F3、F4和F5)的数据框架,在决策树的每一次分割中,都会随机选择一定数量的特征(现在我们暂定为三个),并根据这些特征之一进行分割。
因此,你的一棵决策树可能看起来像这样(当然,有更多的分裂)。
但另一个可能看起来像这样(自然,有更多的分割)。
而这种情况发生在随机森林模型的每一棵决策树上。你已经可以看到为什么这种方法会产生不同的决策树。
但这只是硬币的一面,我们来看看另一面。
二/二。Bootstrapping。随机化输入数据
对于每棵决策树,都要从原始数据集中形成一个新的数据集。这些新形成的数据集的行数与原始数据集的行数完全相同。这些行是以随机抽样的方式挑出来的,也就是说,完全相同的行可以在新的数据集中包含不止一次。
这个过程被称为自举。让我们用一个例子来说明,你的数据集有8行,从1到8。一个自举的数据集可以包含不止一次的行,所以你的自举数据集可以是这样的。
在每次分割时随机化特征,再加上自举,就会产生不同的决策树。这两个随机化过程是随机森林的核心;它们负责消除决策树的过拟合问题。
现在我们知道了不同的决策树是如何在随机森林中创建的。留给我们的是对随机森林如何分类数据的理解。
打包:随机森林产生输出的方式
到目前为止,我们已经确定,随机森林包括许多不同的决策树,对数据集有独特的意见。如果意见不同,随机森林将如何得出最终决定?
这就是 "打包"。
装袋意味着自举 聚合或自举 聚合。
自举的部分你已经知道并理解了。那么,什么是聚集呢?
你看,在随机森林中,有许多在自举数据上训练的决策树--如果你给每棵决策树输入信息,每棵决策树都会根据其树的特定知识(=基于它所适应的自举数据)给你一个预测。
聚合意味着每棵树都有自己的投票,然后计算票数,得票最多的预测将被宣布为获胜者(=你的随机森林模型的输出)。
比方说,你想预测一种动物是老虎还是斑马。你创建了一个有1000棵决策树的随机森林,你在引导数据上训练这些树,然后给它们新的输入数据,根据这些数据它们必须决定动物是老虎还是斑马。
结果如下:在1000棵决策树中,有940棵投票给动物是斑马,而60棵说是老虎。根据所有的投票,你可以很肯定地认为有关的动物是斑马。
你到底能有多确定?
这就是随机森林的魅力之一--你不仅可以得到一个预测,还可以得到一个伴随着预测的概率。940是1000的94%,所以你可以确定你的模型的预测是正确的,这是94%。
这就是你现在需要知道的一切。如果你对更多的细节感兴趣,我强烈建议你观看Kilian Weinberger的这个讲座。
初级数据科学家的第一个月
一个100%实用的在线课程。一个为期6周的模拟在一个真实的创业公司担任初级数据科学家的课程。
"解决真正的问题,获得真正的经验--就像在一个真正的数据科学工作中一样"。
了解更多...
Python中的随机森林(用scikit-learn一步步编码)
第一步。- 分离特征和标签
对于初学者,不要忘记导入pandas。
import pandas as pd
然后下载数据集--我们将使用回归树教程中的同一个负鼠回归数据集,根据负鼠的特征,如肚子大小、头骨宽度等,预测它的性别。
正如数据集的页面上所说。
"数据最初发现于DAAG R包 并在Maindonald, J.H. and Braun, W.J. (2003, 2007, 2010) "Data Analysis and Graphics Using R "一书中使用)。
该数据的一个子集也是为 OpenIntro统计书第8章线性回归介绍而整理的。
数据集的原始来源。
Lindenmayer, D. B., Viggers, K. L., Cunningham, R. B., and Donnelly, C. F. 1995。山地刷尾负鼠(Trichosurus caninus Ogilby)的柱子之间的形态学变化(长耳动物科:有袋动物)。澳大利亚动物学杂志43: 449-458"。
接下来,把数据读进去,并从中随机调查五行与。
df = pd.read_csv("/file-location-don't-copy/possum.csv")
这就是结果。
让我们做一个快速的清理,用:删除任何有缺失数据的行。
df = df.dropna()
df.info() (如果你在df.dropna() ,你会发现我们已经从数据框架中删除了三条记录)。
现在让我们删除不必要的列,然后将特征和标签数据存储在不同的变量中。
下面是代码,如果你想复制它的话。
X = df.drop(["case", "site", "Pop", "sex"], axis=1)
第2步。- 训练我们的随机森林模型
在这一步,我们将创建我们的第一个随机森林。
from sklearn.model_selection import train_test_split
让我把上面的代码分解给你看(尽管我想如果你读过以前关于机器学习模型的文章,在这一点上你已经很熟悉了)。
from sklearn.model_selection import train_test_split>> 这一行导入了 ,我们将使其有可能将我们的数据集随机地分成训练和测试数据。train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=44)>> 这就是我们将30%的数据( )分配给训练特征( )和标签( ),而其余的则分配给测试数据( , )。你也可以选择使用 ,以获得和我一样的结果。test_size=0.3``X_train``y_train``X_testy_testrandom_state=44from sklearn.ensemble import RandomForestClassifier>> 我们最后导入随机森林模型。 中的sklearn.ensemble合奏部分是随机森林是合奏模型的一个提示性标志。这是一种花哨的说法,即这个模型在后台使用了多个模型(在本例中=多个决策树)。rf_model = RandomForestClassifier(n_estimators=50, max_features="auto", random_state=44)>> 这就是我们用我们选择的设置创建我们的模型的地方。n_estimators决定了组成我们随机森林的决策树的数量。越多越好。max_features定义了每个决策树在每次分裂时考虑的特征数量。如果你读过scikit-learn的文档,你会知道 的默认值是max_featuresauto,这实际上与sqrt(=特征数的平方根))。使用 *sqrt*是推荐的设置。
rf_model.fit(X_train, y_train)>> 最后,我们在训练数据的基础上创建我们的模型。
你可能想知道为什么没有自举的设置。事实上,有一个。bootstrap=True但由于它是默认设置,我干脆把它排除了(希望你不介意!)。
第三步。- 用我们的模型进行预测
就像这样简单。
predictions = rf_model.predict(X_test)
让我们检查一下我们的随机森林的预测结果*(m*代表男性,f代表女性)。
你只要给你的模型(X_test )一些数据(rf_model ),然后调用predict() 方法,嗯,进行预测。预测结果被保存在predictions 。
你可以将预测值(predictions)与真实值(y_test)进行比较,如果你感到好奇。
你甚至可以用predict_proba() 来检查你的模型分配给每个预测的概率。
在这种情况下,每个数组包含两个概率,因为我们有两个类别要预测:男性或女性。左边的值显示属于女性类别的预测概率,第二个值显示属于男性类别的预测概率。
我们怎么知道的呢?
借助于classes_ 。
如果你想知道每个特征在预测负鼠性别方面的重要性,也可以用feature_importances_ 。
feature_importances_ 反映了你的特征数据框架中各列的顺序,所以你只需要将其值与特征的名称相匹配,就像这样。
有趣的是,头部长度 (hdlngth) 对负鼠的性别有最高的预测能力(14.62%),不是吗?
顺便说一下,在这一点上,你的随机森林模型已经准备好了,所以可以随时向它输入任何新的数据来进行新的预测。
结论
就这样了。这就是你如何在Python中用scikit-learn创建一个随机森林模型。随机森林的神奇之处在于,它们很容易理解,而且无需任何复杂的超参数调整就能发挥巨大的作用。
我不知道你是否意识到了这一点,但你刚刚获得了一些非常有用的知识--或者至少我希望如此-因为在你的机器学习旅程中,你会多次遇到随机森林。
我确实鼓励你阅读更多关于这个主题的文章和观看更多的视频,因为仍有许多令人心动的东西需要你去发现!
- 如果你想了解更多关于如何成为一名数据科学家的信息,请参加Tomi Mester的50分钟视频课程。如何成为一名数据科学家。(它是免费的!)
- 还可以查看为期6周的在线课程。初级数据科学家的第一个月》视频课程。
干杯
,Tamas Ujhelyi
The postRandom Forest in Python (and coding it with Scikit-learn)appeared first onData36.
