Python 实现的随机森林 已翻译 100%

oschina 投递于 2013/06/07 08:11 (共 9 段, 翻译完成于 06-07)
阅读 26222
收藏 158
11
加载中

随机森林是一个高度灵活的机器学习方法,拥有广泛的应用前景,从市场营销到医疗保健保险。 既可以用来做市场营销模拟的建模,统计客户来源,保留和流失。也可用来预测疾病的风险和病患者的易感性。

随机森林是一个可做能够回归和分类。 它具备处理大数据的特性,而且它有助于估计或变量是非常重要的基础数据建模。

这是一篇关于使用Python来实现随机森林文章。

MtrS
MtrS
翻译于 2013/06/07 09:26
3

什么是随机森林?

随机 森林 几乎 任何 预测 问题 (甚至 非直线 部分) 的固有 选择 它是 一个 相对较 机器 学习 策略 90 年代产生于 贝尔 实验室 ) 可以 几乎用于 任何方面 属于 机器 学习 算法 类----- 集成学习 方法

集成学习

集成学习通过建立几个模型组合解决单一预测问题工作原理是生成多个分类器/模型,各自独立地学习作出预测这些预测最后结合 预测因此优于任何一个单分类的做出预测

随机森林是集成学习的一个子类,由于它依靠于策率合并。你可以在这找到用python实现集成学习的文档 Scikit 学习文档

MtrS
MtrS
翻译于 2013/06/07 09:41
2
随机决策树

我们 知道 随机 森林 是 其他 的模型 聚合, 但 它 聚合 了什么 类型 模型 ? 你 可能 已经 从 其 名称 、 随机 森林 聚合 分类(或 回归) 的 树 中猜到。 决策 树 是 由 一 系列 的 决策的组合, 可 用于 分类 观察 数据集 。

随机森林

算法引入了一个随机森林来 自动 创建 随机 决策 树 群 。 由于 树 随机 生成 的树, 大部分的树(或许 99.9%树) 不 会 对 学习 的 分类/回归 问题 都 有意义 。

如果 观察到 长度 为 45 ,蓝 眼睛 , 和 2 条腿 , 就 被 归类 为 红色
MtrS
MtrS
翻译于 2013/06/07 10:10
3
树的投票

所以10000个(概率上)糟糕的模型有TMD什么好的?好吧,这样确实没什么特别的好处。但是随着很多糟糕的决策树被生成,其中也会有很少确实很优秀的决策树。

当你要做预测的时候,新的观察到的特征随着决策树自上而下走下来,这样一组观察到的特征将会被贴上一个预测值/标签。一旦森林中的每棵树都给出了预测值/标签,所有的预测结果将被归总到一起,所有树的模式投票被返回做为最终的预测结果。

简单来说,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。

袁不语
袁不语
翻译于 2013/06/07 12:18
3

为什么你让我用它?

简单

随机森林就是学习方法中的Leatherman呀。你几乎可以把任何东西扔进去,它基本上都是可供使用的。在估计推断映射方面特别好用,以致都不需要像SVM那样做很多调试(也就是说对于那些最后期限很紧的家伙们真是太棒了)。

[译者注:Leatherman就是那家生产多功能折叠刀的公司,类似瑞士军刀]

一个映射的例子

随机森林在没有精心准备的数据映射的情况下也能学习。以方程f(x) = log(x)为例。

制造一些假数据,并且加上一点儿噪音。


import numpy as np
x = np.random.uniform(1, 100, 1000)
y = np.log(x) + np.random.normal(0, .3, 1000)
full gist here


袁不语
袁不语
翻译于 2013/06/07 14:24
2
如果 我们 建立了 一个 基本 的 线性 模型 通过使用 x 来预测y, 我们需要 作 一 条 直线 , 算是 平分 log (x) 函数。 而 如果 我们 使用 一个 随机 的 森林 , 它 不会 更 好 的 逼近 log (x) 曲线 并能够使得它更像实际函数。

你 也许会说 随机 森林 有点 扰乱了 log(x) 函数 。 不管怎样 , 我 都认为 这 做了一个 很 好 的 说明 如何 随机 森林 并 未绑定于 线性 约束 。

MtrS
MtrS
翻译于 2013/06/07 09:50
2

使用

变量选择

随机森林最好的用例之一是特征选择。尝试很多决策树变种的一个副产品就是你可以检测每棵树中哪个变量最合适/最糟糕。

当一棵树使用一个变量,而另一棵不使用这个变量,你就可以从是否包含这个变量来比较价值的减少或增加。优秀的随机森林实现将为你做这些事情,所以你需要做的仅仅是知道去看那个方法或参数。

在下述的例子中,我们尝试去指出对于将酒分为红酒或者白酒哪个变量是最重要的。


袁不语
袁不语
翻译于 2013/06/07 15:20
3

分类

随机森林也很善于分类。它可以被用于为多个可能目标类别做预测,它也可以被校正输出概率。你需要注意的一件事情是过拟合。随机森林容易产生过拟合,特别是在数据集相对小的时候。当你的模型对于测试集合做出“太好”的预测的时候就应该怀疑一下了。

产生过拟合的一个原因是在模型中只使用相关特征。然而只使用相关特征并不总是事先准备好的,使用特征选择(就像前面提到的)可以使其更简单。

回归

是的,它也可以做回归。

我们已经发现随机森林——不像其它算法——对分类变量或者分类变量和真实变量混合学习的非常好。具有高基数(可能值的#)的分类变量是很棘手的,所以在你的口袋中放点儿这样的东西将会是非常有用的。

袁不语
袁不语
翻译于 2013/06/07 16:13
2

一个简短的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.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包。

袁不语
袁不语
翻译于 2013/06/07 17:02
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(15)

邪恶胖子
邪恶胖子

引用来自“hongzao”的评论

引用来自“邪恶胖子”的评论

我去!感觉好像R语言的函数画的图啊!呵呵!

有同感,图形的风格感觉就是R语言

但是就数据分析来说R语言比python强大,主要是不用多学很多东西,但是就长远集成开发来说python优于R语言,能干很多R语言不能干的事情,比如底层调用。但是就数据分析还是R和ruby各领风骚啊!
h
hongzao

引用来自“邪恶胖子”的评论

我去!感觉好像R语言的函数画的图啊!呵呵!

有同感,图形的风格感觉就是R语言
h
hongzao
还是看原文吧,虽然译者也很辛苦,不过真心觉得就是一个词一个词的翻译出来,而不是一句一段的翻译的
super0555
super0555

引用来自“袁不语”的评论

@红薯 建议加一个“挑错”的功能。很多时候看到有些地方有问题,往往都不会想再翻一遍,提交个不同的版本的。

那不成了维基了
邪恶胖子
邪恶胖子
我去!感觉好像R语言的函数画的图啊!呵呵!
明月照大江
明月照大江
我只想知道 minecraft 的地图是怎么生成的~
LinkerLin
LinkerLin
随机森林的缺点就是深度只有一层,还是比深度学习方面的算法差点。
袁不语
袁不语
@红薯 建议加一个“挑错”的功能。很多时候看到有些地方有问题,往往都不会想再翻一遍,提交个不同的版本的。
frc6
frc6
non-linear:非线性。
tsl0922
tsl0922

引用来自“Honghe”的评论

来源呢,怎么没标

标题下面:英文原文
返回顶部
顶部