这
几天一直在看随机森林。可以说遇到任何一个有关预测的问题。都可以首先随机森林来进行预测,同时得到的结果也不会太差。在这篇文章里我首先会向大家推荐几篇写的比较好的博客。接着会将我觉得比较好的例子使用python+scikit-learn包来实现出来。
首先推荐的就是:随机森林入门—简化版http://www.analyticsvidhya.com/blog/2014/06/introduction-random-forest-simplified/ 老外写的博客,是我目前觉得写的最好的关于随机森林的入门文章。重点讲解来随机森林的构造过程,并举了墨西哥的人均收入的问题来进行随机森林概念的讲解。
其次是:scikit-learn的官方文档:http://scikit-learn.org/stable/modules/ensemble.html#forests-of-randomized-trees 主要告诉大家如何使用scikit-learn包中的类方法来进行随机森林算法的预测。其中讲的比较好的是各个参数的具体用途。
这里我给出我的理解和部分翻译:
参数说明:
最主要的两个参数是n_estimators和max_features。
n_estimators:表示森林里树的个数。理论上是越大越好。但是伴随着就是计算时间的增长。但是并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数。
max_features:随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快。根据较好的实践经验。如果是回归问题则:
max_features=n_features,如果是分类问题则max_features=sqrt(n_features)。
如果想获取较好的结果,必须将max_depth=None,同时min_sample_split=1。
同时还要记得进行cross_validated(交叉验证),除此之外记得在random forest中,bootstrap=True。但在extra-trees中,bootstrap=False。
这里也给出一篇老外写的文章:调整你的随机森林模型参数http://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/
返回的结果如下:
(150,)
[[ 6.3 3.3 6. 2.5]
[ 7.2 3.6 6.1 2.5]]
instance 0 prediction; [ 2.]
instance 1 prediction; [ 2.]
2 2
在这里我有点困惑,就是在scikit-learn算法包中随机森林实际上就是一颗颗决策树组成的。但是之前我写的决策树博客中是可以将决策树给显示出来。但是随机森林却做了黑盒处理。我们不知道内部的决策树结构,甚至连父节点的选择特征都不知道是谁。所以我给出下面的代码(这代码不是我的原创),可以显示的显示出所有的特征的贡献。所以对于贡献不大的,甚至是负贡献的我们可以考虑删除这一列的特征值,避免做无用的分类。
显示的结果如下:
[(0.934, 'petal width (cm)'), (0.929, 'petal length (cm)'), (0.597, 'sepal length (cm)'), (0.276, 'sepal width (cm)')]
这里我们会发现petal width、petal length这两个特征将起到绝对的贡献,之后是sepal length,影响最小的是sepal width。这段代码将会提示我们各个特征的贡献,可以让我们知道部分内部的结构。
首先推荐的就是:随机森林入门—简化版http://www.analyticsvidhya.com/blog/2014/06/introduction-random-forest-simplified/ 老外写的博客,是我目前觉得写的最好的关于随机森林的入门文章。重点讲解来随机森林的构造过程,并举了墨西哥的人均收入的问题来进行随机森林概念的讲解。
其次是:scikit-learn的官方文档:http://scikit-learn.org/stable/modules/ensemble.html#forests-of-randomized-trees 主要告诉大家如何使用scikit-learn包中的类方法来进行随机森林算法的预测。其中讲的比较好的是各个参数的具体用途。
这里我给出我的理解和部分翻译:
参数说明:
最主要的两个参数是n_estimators和max_features。
n_estimators:表示森林里树的个数。理论上是越大越好。但是伴随着就是计算时间的增长。但是并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数。
max_features:随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快。根据较好的实践经验。如果是回归问题则:
max_features=n_features,如果是分类问题则max_features=sqrt(n_features)。
如果想获取较好的结果,必须将max_depth=None,同时min_sample_split=1。
同时还要记得进行cross_validated(交叉验证),除此之外记得在random forest中,bootstrap=True。但在extra-trees中,bootstrap=False。
这里也给出一篇老外写的文章:调整你的随机森林模型参数http://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/
这里我使用了scikit-learn自带的iris数据来进行随机森林的预测:
返回的结果如下:
(150,)
[[ 6.3 3.3 6. 2.5]
[ 7.2 3.6 6.1 2.5]]
instance 0 prediction; [ 2.]
instance 1 prediction; [ 2.]
2 2
在这里我有点困惑,就是在scikit-learn算法包中随机森林实际上就是一颗颗决策树组成的。但是之前我写的决策树博客中是可以将决策树给显示出来。但是随机森林却做了黑盒处理。我们不知道内部的决策树结构,甚至连父节点的选择特征都不知道是谁。所以我给出下面的代码(这代码不是我的原创),可以显示的显示出所有的特征的贡献。所以对于贡献不大的,甚至是负贡献的我们可以考虑删除这一列的特征值,避免做无用的分类。
显示的结果如下:
[(0.934, 'petal width (cm)'), (0.929, 'petal length (cm)'), (0.597, 'sepal length (cm)'), (0.276, 'sepal width (cm)')]
这里我们会发现petal width、petal length这两个特征将起到绝对的贡献,之后是sepal length,影响最小的是sepal width。这段代码将会提示我们各个特征的贡献,可以让我们知道部分内部的结构。