Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4584628
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: IT业界

2019-04-01 14:28:45

https://blog.csdn.net/rosefun96/article/details/78833477

1、理论


根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法;
前者的代表是Boosting,后者的代表是Bagging和“随机森林”(Random 
Forest)
随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择(即引入随机特征选择)。
简单来说,随机森林就是对决策树的集成,但有两点不同:
(2)特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)
随机森林,简单理解, 
比如预测salary,就是构建多个决策树job,age,house,然后根据要预测的量的各个特征(teacher,39,suburb)分别在对应决策树的目标值概率(salary<5000,salary>=5000),从而,确定预测量的发生概率(如,预测出P(salary<5000)=0.3).


参数说明: 
最主要的两个参数是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。


2、随机森林python实现


2.1随机森林回归器的使用Demo1


实现随机森林基本功能


#随机森林


from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor  
import numpy as np  


from sklearn.datasets import load_iris  
iris=load_iris()  
#print iris#iris的4个属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度 标签是花的种类:setosa versicolour virginica  
print(iris['target'].shape)
rf=RandomForestRegressor()#这里使用了默认的参数设置  
rf.fit(iris.data[:150],iris.target[:150])#进行模型的训练  
#    


#随机挑选两个预测不相同的样本  
instance=iris.data[[100,109]]  
print(instance)
rf.predict(instance[[0]])
print('instance 0 prediction;',rf.predict(instance[[0]]))
print( 'instance 1 prediction;',rf.predict(instance[[1]]))
print(iris.target[100],iris.target[109])  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果


(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
1
2
3
4
5
6
2.2 随机森林分类器、决策树、extra树分类器的比较Demo2 
3种方法的比较


#random forest test


from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.tree import DecisionTreeClassifier


X, y = make_blobs(n_samples=10000, n_features=10, centers=100,random_state=0)


clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())                             




clf = RandomForestClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())                             


clf = ExtraTreesClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
运行结果:


0.979408793821
0.999607843137
0.999898989899
1
2
3
2.3 随机森林回归器regressor-实现特征选择


#随机森林2


from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor  
import numpy as np  


from sklearn.datasets import load_iris  
iris=load_iris()  


from sklearn.model_selection import cross_val_score, ShuffleSplit  
X = iris["data"]  
Y = iris["target"]  
names = iris["feature_names"]  


rf = RandomForestRegressor()  
scores = []  
for i in range(X.shape[1]):  
     score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",  
                              cv=ShuffleSplit(len(X), 3, .3))  
     scores.append((round(np.mean(score), 3), names[i]))  


print(sorted(scores, reverse=True))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
运行结果:


[(0.89300000000000002, 'petal width (cm)'), (0.82099999999999995, 'petal length
(cm)'), (0.13, 'sepal length (cm)'), (-0.79100000000000004, 'sepal width (cm)')]
--------------------- 
作者:rosefun96 
来源:CSDN 
原文:https://blog.csdn.net/rosefun96/article/details/78833477 
版权声明:本文为博主原创文章,转载请附上博文链接!
阅读(1494) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~