python随机森林

准备在天池新人赛中使用随机森林。
网上搜索了一个博客:
http://blog.csdn.net/lulei1217/article/details/49583287
下面是自己实现的代码:
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  )
print( 'instance 0 prediction',rf.predict(instance[0]) )
print( 'instance 1 prediction',rf.predict(instance[1]) )
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

下面是自己对问题的思考:

from sklearn.datasets import load_iris  
iris=load_iris()  

这个代码明显是sklearn包封装了load_iris函数,那么这个函数代码在哪里呢?数据放哪里?怎么组织的呢?

按照介绍,sklearn包随机森林函数接口的官方说明:
http://scikit-learn.org/stable/modules/ensemble.html#random-forests
最简单的随机森林的例子:
最后预测的时候需要2个数组:X为训练集合,Y为标签

from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)

所以,我们回到之前的代码,可以知道:
训练集合:iris.data[:150]
标签集合:iris.target[:150]
我们输入:

iris

可以看到iris的具体描述,好复杂,但是还是基本上都能看明白:
python随机森林_第1张图片
输入:

iris['target'].shape[0]

可以看到有150个标签,意味着有150个数据
输入:

iris.target[:150]

可以看到有0、1、2合计3类
输入:

iris.data[:150]

可以看到每个有4个特征。
也就是说,只要我们把天池新人赛中的数据转换成这种格式,就可以使用随机森林做训练预测了。
预测直接使用:

print(rf.predict(iris.data[2]) )

另外有个问题看官方网站介绍:
RandomForestRegressor是做随机森林回归
RandomForestRegressor(n_estimators=10, criterion=’mse’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False)
而RandomForestClassifier是做随机森林分类
RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None)
几个重要的参数:(http://blog.csdn.net/lulei1217/article/details/49583287)
最主要的两个参数是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。

切换到随机森林分类:

from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.ensemble import RandomForestClassifier
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=RandomForestClassifier()#这里使用了默认的参数设置  
rf.fit(iris.data[:150],iris.target[:150])#进行模型的训练  
#随机挑选两个预测不相同的样本  
instance=iris.data[[100,109]]  
print (instance  )
print( 'instance 0 prediction',rf.predict(instance[0]) )
print( 'instance 1 prediction',rf.predict(instance[1]) )
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
可以发现这个结果就是整数了,而不是浮点数据了。

测试分类效果:

err = 0
temp = 0
for i in range(iris['target'].shape[0]):
    temp = rf.predict(iris.data[i])
    #print(temp[0])
    if temp[0] != iris.target[i]:
        err = err +1
err = err/iris['target'].shape[0]
print(1-err)

输出结果:
0.9866666666666667

天池新手赛使用的都是pandas类型的数据,所以又自己写了个最简单的测试代码:

import pandas as pd
from pandas import Series,DataFrame 
import random
from numpy import nan as NA
from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.ensemble import RandomForestClassifier
import numpy as np  
from sklearn.datasets import load_iris  

读取自己随便写的一个csv文件

#读取测试数据
data = pd.read_csv('test.csv')
print(data)

读取结果如下:
f1 f2 f3 f4 f5 flag
0 1.414214 2 3.414214 92 106.142136 0
1 1.732051 3 4.732051 73 90.320508 0
2 2.000000 4 6.000000 36 56.000000 0
3 2.236068 5 7.236068 -25 -2.639320 0
4 2.449490 6 8.449490 -116 -91.505103 0
5 2.645751 7 9.645751 -243 -216.542487 0
6 2.828427 8 10.828427 -412 -383.715729 0
7 3.000000 9 12.000000 -629 -599.000000 0
8 3.162278 10 13.162278 -900 -868.377223 0
9 3.316625 11 14.316625 -1231 -1197.833752 0
10 3.464102 12 15.464102 -1628 -1593.358984 1
11 3.605551 13 16.605551 -2097 -2060.944487 1
12 3.741657 14 17.741657 -2644 -2606.583426 1
13 3.872983 15 18.872983 -3275 -3236.270167 1
14 4.000000 16 20.000000 -3996 -3956.000000 1
15 4.123106 17 21.123106 -4813 -4771.768944 1
16 4.242641 18 22.242641 -5732 -5689.573593 1
17 4.358899 19 23.358899 -6759 -6715.411011 0
18 4.472136 20 24.472136 -7900 -7855.278640 0
19 4.582576 21 25.582576 -9161 -9115.174243 0
20 4.690416 22 26.690416 -10548 -10501.095840 0
21 4.795832 23 27.795832 -12067 -12019.041680 0
22 4.898979 24 28.898979 -13724 -13675.010210 0
23 5.000000 25 30.000000 -15525 -15475.000000 1
24 5.099020 26 31.099020 -17476 -17425.009800 1
25 5.196152 27 32.196152 -19583 -19531.038480 1
26 5.291503 28 33.291503 -21852 -21799.084970 1
27 5.385165 29 34.385165 -24289 -24235.148350 1
28 5.477226 30 35.477226 -26900 -26845.227740 1
29 5.567764 31 36.567764 -29691 -29635.322360 1
30 5.656854 32 37.656854 -32668 -32611.431460 1
31 5.744563 33 38.744563 -35837 -35779.554370 1
32 5.830952 34 39.830952 -39204 -39145.690480 1
对特征和标签做提取,转成numpy的数组

UseFlag = data['flag'].values
print(UseFlag)
UseFeature = data[['f1','f2','f3','f4','f5']].values
print(UseFeature)

使用随机森林分类模型,训练

rf=RandomForestClassifier()#这里使用了默认的参数设置  
rf.fit(UseFeature,UseFlag)#进行模型的训练  

验证最终模型的预测结果:

err = 0
temp = 0
for i in range(UseFeature.shape[0]):
    temp = rf.predict(UseFeature[i])
    if temp[0] != UseFlag[i]:
        err = err +1
err = err/UseFeature.shape[0]
print(1-err)

最终输出结果:预测成功率100%(就这几个数据,还是训练集合,不是100%就怪了)
1.0

这样就只剩下在天池的数据中提取出特征就OK了。

你可能感兴趣的:(天池)