随机森林入门笔记
此篇文章翻译自以下链接(https://community.alteryx.com/t5/Data-Science-Blog/Random-Forests-in-Python/ba-p/138437)
随机森林一种多功能的机器学习算法,它可以作用于从营销到医疗保健、保健的众多应用。它可用于模拟营销对获客、留存和流失的影响,或者预测疾病风险和易感染性。
随机森林可用于分类classification和回归regresssion问题,它可以处理大量的特征,并且有助于估计哪些特征在建模的基础数据中占重要地位。
这是一篇关于在Python中使用随机森林的文章。
1、什么是随机森林
随机森林几乎可以用于任何预测问题,甚至是非线性问题。它是一种相对较新(我猜现在也不新了)的机器学习策略,出自90年代的贝尔实验室,它可以用于任何事情。它属于更大类的机器学习算法,称为集合方法。
集成学习
集成学习涉及集中模型的组合以解决单个预测问题。它的工作原理是生成多个独立学习和预测的分类器/模型。然后这些预测组合起来得到单个预测结果,与单个的分类器相比,它的结果应该是一样好或者更好。
随机森林是集成学习的一个分支,因为它依赖于决策树的集成。关于Python中更多关于集成学习的内容:Scikit-Learn docs
随机决策树
所以我们知道了随机森林是其他模型的集合,但它究竟聚合了哪些模型呢?你可能从它的名称中已经猜到了,随机森林聚合了分类或者回归树。决策树由一系列决策组成,用于对数据集的观测值进行分类。
随机森林
诱导随机森林的算法,将自动创建一堆随机决策树。由于树是随机生成的,因此大多数树对于学习分类/回归问题都没有意义(可能是99.9%的树)。
如果一个观测值为length=45,blue eye,legs=2,那么它将被划分为红色
Arboreal 投票
那么,一万个糟糕的模型有什么用呢?事实证明,它们真的没那么有用。但是,有用的是少数非常好的决策树,它也会和坏的决策树一起生长。
当我们进行预测时,新的观测值随决策树自上而下Push并且被赋予一个预测值/标签。一旦森林中的每棵树都报告了其预测值/标签,我们就会对预测进行统计,所有树的投票结果作为最终预测结果返回。
简单来说,99.9%不相干的树做出的预测,会涵盖所有的结果,并且这些预测结果相互抵消。少数优秀树木的预测才是好的,并且得到好的预测结果。
2、为什么要用它?
它很简单
随机森林是机器学习中的多功能折叠刀,你几乎可以把任何东西扔给它。它在估计推断转换方面做得特别好,因此,你不需要像SVM那样做太多调参(它对于时间紧迫的人来说特别好)
一个转换的例子
随机森林能够在没有精心设计的数据转换的情况下学习。以f(x) = log(x)为例。
我们将在Yhat自己的交互环境Rodeo中利用Python生成分析数据,在这里下载Rodeo
的Mac
,Windows
和Linux
的安装文件。
首先,我们先生成一下数据并添加噪声。
import numpy as np
import pylab as pl
x = np.random.uniform(1, 100, 1000)
y = np.log(x) + np.random.normal(0, .3, 1000)
pl.scatter(x, y, s=1, label="log(x) with noise")
pl.plot(np.arange(1, 100), np.log(np.arange(1, 100)), c="b", label="log(x) true function")
pl.xlabel("x")
pl.ylabel("f(x) = log(x)")
pl.legend(loc="best")
pl.title("A Basic Log Function")
pl.show()
得到如下结果:
如果我们尝试构建一个基本的线性模型来使用x来预测y,我们会得到一条直线,它将log(x)函数一分为二。然而,如果我们使用随机森林,它可以更好地近似log(x)曲线,并且我们得到的东西看起来更像真正的函数。
线性模型 vs 随机森林
当然,你也可以说随机森林对log(x)函数有点过拟合。不管怎么样,这说明了随机森林并不受线性约束的约束。
3使用方法
特征选择
随机森林的最佳用例之一是特征选择。尝试大量决策树变体的副产品之一是,您可以检查每棵树中哪些变量最佳或者最差。
当某个树使用一个参数而另一个不使用时,您可以比较从该参数的包含/排除中丢失或获得的值。好的随机森林实现将为您做到这一点,所以您需要做的就是知道要查看哪个方法或参数。
在下面的例子中,我们试图找出哪些变量对于将葡萄酒分类为红色或白色最重要。
分类
随机森林也很善长分类问题。它可用于对具有多个可能值的类别进行预测,也可以对其进行校准以输出概率。你需要注意的一件事情是过拟合。
随机森林可能容易过度拟合,尤其是在使用相对较小的数据集时。如果您的模型对我们的测试集进行“太好”的预测,您应该怀疑。避免过拟合的一个方法是在模型中只使用有相关性的特征。虽然这并不总是干净完美的,但使用特征选择技术(如前面提到的特征选择)可以使它更容易。
回归
随机森林也可以用于回归问题。
不像其他的方法,随机森林非常擅长于分类变量或分类变量与连续变量混合的情况。
一个简单的Python例子
Scikit-Learn是开始使用随机森林的好方法。scikit-learn API在算法中非常一致,因此您可以非常轻松地在模型之间进行竞赛和切换。很多时候,我从一些简单的东西开始,然后转移到随机森林。
scikit-learn中随机森林实现的最佳功能之一是n_jobs参数。这将根据您要使用的核心数自动并行化随机林的拟合。这里 是scikit-learn撰稿人Olivier Grisel的精彩演讲,他讲述了在20个节点的EC2集群上训练随机森林的过程。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
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.Categorical.from_codes(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'])
这就是我们应该看到的结果了,因为我们选用的是随机的数据,所以每次看到的结果都会有所不同。
preds | sertosa | versicolor | virginica |
---|---|---|---|
actual | |||
sertosa | 6 | 0 | 0 |
versicolor | 0 | 16 | 1 |
virginica | 0 | 0 | 12 |
最终思考
由于它的先进性,随机森林非常易于被使用。但是与任何建模一样,我们都要警惕过拟合。如果你有兴趣在R语言中开始使用随机森林,那么请查看randomForest包吧。
翻译完了才发现,并没有写太多干货.....