翻译自:http://blog.yhat.com/posts/python-random-forest.htmlhtml
昨天收到
yhat
推送了一篇介绍随机森林算法的邮件,感受做为介绍和入门不错,就顺手把它翻译一下。python
1 什么是随机森林web
1.1 集成学习算法
1.2 随机决策树微信
1.3 随机森林dom
1.4 投票机器学习
2 为何要用它函数
3 使用方法工具
3.1 变量选择post
3.2 分类
3.3 回归
4 一个简单的Python示例
结语
前言: 随机森林是一个很是灵活的机器学习方法,从市场营销到医疗保险有着众多的应用。它能够用于市场营销对客户获取和存留建模或预测病人的疾病风险和易感性。
随机森林可以用于分类和回归问题,能够处理大量特征,并可以帮助估计用于建模数据变量的重要性。
这篇文章是关于如何使用Python构建随机森林模型。
随机森林能够用于几乎任何一种预测问题(包括非线性问题)。它是一个相对较新的机器学习策略(90年代诞生于贝尔实验室)能够用在任何方面。它属于机器学习中的集成学习
这一大类。
集成学习是将多个模型进行组合来解决单一的预测问题。它的原理是生成多个分类器模型,各自独立地学习并做出预测。这些预测最后结合起来获得预测结果,所以和单独分类器的结果相比,结果同样或更好。
随机森林是集成学习的一个分支,由于它依靠于决策树的集成。更多关于python实现集成学习的文档: Scikit-Learn 文档。
咱们知道随机森林是将其余的模型进行聚合, 但具体是哪一种模型呢?从其名称也能够看出,随机森林聚合的是分类(或回归) 树。一颗决策树是由一系列的决策组合而成的,可用于数据集的观测值进行分类 。
引入的随机森林算法将自动建立随机决策树群。因为这些树是随机生成的,大部分的树(甚至 99.9%)对解决你的分类或回归问题是没有有意义。
那么,生成甚至上万的糟糕的模型有什么好处呢?好吧,这确实没有。但有用的是,少数很是好的决策树也随之一块儿生成了。
当你要作预测的时候,新的观察值随着决策树自上而下走下来并被赋予一个预测值或标签。一旦森林中的每棵树都给有了预测值或标签,全部的预测结果将被归总到一块儿,全部树的投票返回作为最终的预测结果。
简单来讲,99.9%不相关的树作出的预测结果涵盖全部的状况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会脱颖而出,从而获得一个好的预测结果。
随机森林是机器学习方法中的Leatherman(多功能折叠刀)。你几乎能够把任何东西扔给它。它在估计推断映射方面作的特别好,从而不须要相似SVM医同样过多的调参(这点对时间紧迫的朋友很是好)。
随机森林能够在未经特地手工进行数据变换的状况下学习。以函数f(x)=log(x)
为例。
咱们将在Yhat本身的交互环境Rodeo
中利用Python生成分析数据,你能够在here下载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)
曲线从而使得它看起来更像实际的函数。
固然,你也能够说随机森林对log(x)
函数有点过拟合。无论怎么样,这说明了随机森林并不限于线性问题。
随机森林的一个最好用例是特征选择。尝试不少个决策树变量的一个副产品就是,你能够检查变量在每棵树中表现的是最佳仍是最糟糕。
当一些树使用一个变量,而其余的不使用这个变量,你就能够对比信息的丢失或增长。实现的比较好的随机森林工具可以为你作这些事情,因此你须要作的仅仅是去查看那个方法或参数。
在下述的例子中,咱们尝试弄明白区分成酒或白酒时,哪些变量是最重要的。
随机森林也很善长分类问题。它能够被用于为多个可能目标类别作预测,它也能够在调整后输出几率。你须要注意的一件事情是过拟合。
随机森林容易产生过拟合,特别是在数据集相对小的时候。当你的模型对于测试集合作出“太好”的预测的时候就应该怀疑一下了。避免过拟合的一个方法是在模型中只使用有相关性的特征,好比使用以前提到的特征选择。
随机森林也能够用于回归问题。
我发现,不像其余的方法,随机森林很是擅长于分类变量或分类变量与连续变量混合的状况。
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包。