python实现机器学习之随机森林

来源:互联网 发布:郑州商业银行软件 编辑:程序博客网 时间:2024/04/29 06:48

转载自http://blog.csdn.net/lulei1217/article/details/49583287。仅用作个人学习。

几天一直在看随机森林。可以说遇到任何一个有关预测的问题。都可以首先随机森林来进行预测,同时得到的结果也不会太差。在这篇文章里我首先会向大家推荐几篇写的比较好的博客。接着会将我觉得比较好的例子使用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/ 




首先推荐的就是:随机森林入门—简化版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数据来进行随机森林的预测:

[python] view plain copy
 print?
  1. from sklearn.tree import DecisionTreeRegressor  
  2. from sklearn.ensemble import RandomForestRegressor  
  3. import numpy as np  
  4.    
  5. from sklearn.datasets import load_iris  
  6. iris=load_iris()  
  7. #print iris#iris的4个属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度 标签是花的种类:setosa versicolour virginica  
  8. print iris['target'].shape  
  9. rf=RandomForestRegressor()#这里使用了默认的参数设置  
  10. rf.fit(iris.data[:150],iris.target[:150])#进行模型的训练  
  11. #    
  12. #随机挑选两个预测不相同的样本  
  13. instance=iris.data[[100,109]]  
  14. print instance  
  15. print 'instance 0 prediction;',rf.predict(instance[0])  
  16. print 'instance 1 prediction;',rf.predict(instance[1])  
  17. print iris.target[100],iris.target[109]  



返回的结果如下:
(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算法包中随机森林实际上就是一颗颗决策树组成的。但是之前我写的决策树博客中是可以将决策树给显示出来。但是随机森林却做了黑盒处理。我们不知道内部的决策树结构,甚至连父节点的选择特征都不知道是谁。所以我给出下面的代码(这代码不是我的原创),可以显示的显示出所有的特征的贡献。所以对于贡献不大的,甚至是负贡献的我们可以考虑删除这一列的特征值,避免做无用的分类。

[python] view plain copy
 print?
  1. from sklearn.cross_validation import cross_val_score, ShuffleSplit  
  2. X = iris["data"]  
  3. Y = iris["target"]  
  4. names = iris["feature_names"]  
  5. rf = RandomForestRegressor()  
  6. scores = []  
  7. for i in range(X.shape[1]):  
  8.      score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",  
  9.                               cv=ShuffleSplit(len(X), 3, .3))  
  10.      scores.append((round(np.mean(score), 3), names[i]))  
  11. print sorted(scores, reverse=True)  



显示的结果如下:
[(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://blog.csdn.net/u012102306/article/details/52228516,仅用作个人学习。

Random Forest(sklearn参数详解)

本篇不是介绍RF的,关于RF网上有很多通俗易懂的解释
西瓜书与统计学习方法等很多教材中的解释也都足够
本篇仅针对如何使用sklearn中的RandomForestClassifier作记录

一、代码怎么写

[python] view plain copy
 print?
  1. class sklearn.ensemble.RandomForestClassifier(n_estimators=10, crite-rion=’gini’, max_depth=None,    
  2. min_samples_split=2, min_samples_leaf=1,    
  3. min_weight_fraction_leaf=0.0,    
  4. max_features=’auto’,    
  5. max_leaf_nodes=None, bootstrap=True,    
  6. oob_score=False, n_jobs=1, ran-dom_state=None, verbose=0,    
  7. warm_start=False, class_weight=None)    

二、关于参数

其中关于决策树的参数:

criterion: ”gini” or “entropy”(default=”gini”)是计算属性的gini(基尼不纯度)还是entropy(信息增益),来选择最合适的节点。

splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。

max_features: 选择最适属性时划分的特征不能超过此值。

当为整数时,即最大特征数;当为小数时,训练集特征数*小数;

if “auto”, then max_features=sqrt(n_features).

If “sqrt”, thenmax_features=sqrt(n_features).

If “log2”, thenmax_features=log2(n_features).

If None, then max_features=n_features.

max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。

min_samples_split:根据属性划分节点时,每个划分最少的样本数。

min_samples_leaf:叶子节点最少的样本数。

max_leaf_nodes: (default=None)叶子树的最大样本数。

min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值

verbose:(default=0) 是否显示任务进程

关于随机森林特有的参数:

n_estimators=10:决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。 

bootstrap=True是否有放回的采样。  

oob_score=Falseoob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。  

n_jobs=1并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job

warm_start=False热启动,决定是否使用上次调用该类的结果然后增加新的。  

class_weight=None各个label的权重。  


进行预测可以有几种形式:

predict_proba(x):给出带有概率值的结果。每个点在所有label的概率和为1.  

predict(x):直接给出预测结果。内部还是调用的predict_proba(),根据概率的结果看哪个类型的预测值最高就是哪个类型。  

predict_log_proba(x):和predict_proba基本上一样,只是把结果给做了log()处理。  


原创粉丝点击