多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
随机森林是集成学习的一个子类,由于它依靠于策率树的合并。你可以在这找到用python实现集成学习的文档:Scikit学习文档。
随机决策树
我们知道随机森林是其他的模型聚合,但它聚合了什么类型模型?你可能已经从其名称、随机森林聚合分类(或回归)的树中猜到。决策树是由一系列的决策的组合,可用于分类观察数据集。
随机森林
算法引入了一个随机森林来自动创建随机决策树群。由于树随机生成的树,大部分的树(或许99.9%树)不会对学习的分类/回归问题都有意义。
如果观察到长度为45,蓝眼睛,和2条腿,就被归类为红色。
所以10000个(概率上)糟糕的模型有TMD什么好的?好吧,这样确实没什么特别的好处。但是随着很多糟糕的决策树被生成,其中也会有很少确实很优秀的决策树。
当你要做预测的时候,新的观察到的特征随着决策树自上而下走下来,这样一组观察到的特征将会被贴上一个预测值/标签。一旦森林中的每棵树都给出了预测值/标签,所有的预测结果将被归总到一起,所有树的模式投票被返回做为最终的预测结果。
简单来说,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。
为什么你让我用它?
简单
随机森林就是学习方法中的Leatherman呀。你几乎可以把任何东西扔进去,它基本上都是可供使用的。在估计推断映射方面特别好用,以致都不需要像SVM那样做很多调试(也就是说对于那些最后期限很紧的家伙们真是太棒了)。
[译者注:Leatherman就是那家生产多功能折叠刀的公司,类似瑞士军刀]
一个映射的例子
随机森林在没有精心准备的数据映射的情况下也能学习。以方程f(x)=log(x)为例。
制造一些假数据,并且加上一点儿噪音。
importnumpyasnp x=np.random.uniform(1,100,1000) y=np.log(x)+np.random.normal(0,.3,1000) fullgisthere
如果我们建立了一个基本的线性模型通过使用x来预测y,我们需要作一条直线,算是平分log(x)函数。而如果我们使用一个随机的森林,它不会更好的逼近log(x)曲线并能够使得它更像实际函数。
你也许会说随机森林有点扰乱了log(x)函数。不管怎样,我都认为这做了一个很好的说明如何随机森林并未绑定于线性约束。
使用
变量选择
随机森林最好的用例之一是特征选择。尝试很多决策树变种的一个副产品就是你可以检测每棵树中哪个变量最合适/最糟糕。
当一棵树使用一个变量,而另一棵不使用这个变量,你就可以从是否包含这个变量来比较价值的减少或增加。优秀的随机森林实现将为你做这些事情,所以你需要做的仅仅是知道去看那个方法或参数。
在下述的例子中,我们尝试去指出对于将酒分为红酒或者白酒哪个变量是最重要的。
分类
随机森林也很善于分类。它可以被用于为多个可能目标类别做预测,它也可以被校正输出概率。你需要注意的一件事情是过拟合。随机森林容易产生过拟合,特别是在数据集相对小的时候。当你的模型对于测试集合做出“太好”的预测的时候就应该怀疑一下了。
产生过拟合的一个原因是在模型中只使用相关特征。然而只使用相关特征并不总是事先准备好的,使用特征选择(就像前面提到的)可以使其更简单。
回归
是的,它也可以做回归。
我们已经发现随机森林——不像其它算法——对分类变量或者分类变量和真实变量混合学习的非常好。具有高基数(可能值的#)的分类变量是很棘手的,所以在你的口袋中放点儿这样的东西将会是非常有用的。
一个简短的python例子
Scikit-Learn是开始使用随机森林的一个很好的方式。scikit-learnAPI在所以算法中极其的一致,所有你测试和在不同的模型间切换非常容易。很多时候,我从一些简单的东西开始,然后转移到了随机森林。
随机森林在scikit-learn中的实现最棒的特性是n_jobs参数。这将会基于你想使用的核数自动地并行设置随机森林。这里是scikit-learn的贡献者OlivierGrisel的一个很棒的报告,在这个报告中他谈论了使用20个节点的EC2集群训练随机森林。
fromsklearn.datasetsimportload_iris fromsklearn.ensembleimportRandomForestClassifier importpandasaspd importnumpyasnp iris=load_iris() df=pd.DataFrame(iris.data,columns=iris.feature_names) df[‘is_train’]=np.random.uniform(0,1,len(df))<=.75 df[‘species’]=pd.Factor(iris.target,iris.target_names) df.head() train,test=df[df[‘is_train’]==True],df[df[‘is_train’]==False] features=df.columns[:4] clf=RandomForestClassifier(n_jobs=2) y,_=pd.factorize(train[‘species’]) clf.fit(train[features],y) preds=iris.target_names[clf.predict(test[features])] pd.crosstab(test[‘species’],preds,rownames=[‘actual’],colnames=[‘preds’])
看起来很不错!
结语
随机森林相当容易使用,而且很强大。对于任何建模,都要注意过拟合。如果你有兴趣用R语言开始使用随机森林,那么就签出randomForest包。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。