python_sklearn机器学习算法系列之RandomForest(随机森林算法)

原创 2018年04月15日 20:31:09

       本文主要目的是通过一段及其简单的小程序来快速学习python 中sklearn的RandomForest这一函数的基本操作和使用,注意不是用python纯粹从头到尾自己构建RandomForest,既然sklearn提供了现成的我们直接拿来用就可以了,当然其原理十分重要,下面最简单介绍:

      集成学习是将多个模型进行组合来解决单一的预测问题。它的原理是生成多个分类器模型,各自独立地学习并作出预测。

这些预测最后结合起来得到预测结果,因此和单独分类器的结果相比,结果一样或更好。

bagging就是一种集成学习用来提高学习算法准确度的方法主要思想:

1.给定一个弱学习算法,和一个训练集;

2.单个弱学习算法准确率不高;

3.将该学习算法使用多次,得出预测函数序列,进行投票;

4.最后结果准确率将得到提高.

随机森林是Bagging的一个拓展变体,是集成学习的一个分支,因为它依靠于决策树的集成。

更详细的介绍可以去官网查看

随机森林有两种算法(红字就是主要区别)

RandomForest algorithm :

样本提取时允许replacement(a bootstrap sample),在随机选取的部分(而不是全部的)features上进行划分,与原论文的vote方法不同,scikit-learn通过平均每个分类器的预测概率(averaging their probabilistic prediction)来生成最终结果。

Extremely Randomized Trees 

有两个class,分别处理分类和回归,默认使用所有样本,但划分时features随机选取部分。

随机森林算法既可以应运到分类RandomForestClassifier(随机森林分类)、又可以用于回归问题RandomForestRegressor(随机森林回归),下面将分别给与代码

RandomForestClassifier:

代码:

#RandomForestClassifier
import math
import matplotlib as mpl
import warnings
import numpy as np
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
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

#忽略一些版本不兼容等警告
warnings.filterwarnings("ignore")

#源数据产生具体看https://blog.csdn.net/ichuzhen/article/details/51768934
n_features=2  #每个样本有几个属性或特征
x,y = make_blobs(n_samples=300, n_features=n_features, centers=6)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.7)

#核心代码
#传统决策树、随机森林算法、极端随机树关于区别:https://blog.csdn.net/hanss2/article/details/53525503
#关于其中参数的说明请看http://www.jb51.net/article/131172.htm
clf1 = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)
clf2 = RandomForestClassifier(n_estimators=10,max_features=math.sqrt(n_features), max_depth=None,min_samples_split=2, bootstrap=True)
clf3 = ExtraTreesClassifier(n_estimators=10,max_features=math.sqrt(n_features), max_depth=None,min_samples_split=2, bootstrap=False)



'''
#交叉验证
scores1 = cross_val_score(clf1, x_train, y_train)
scores2 = cross_val_score(clf2, x_train, y_train)
scores3 = cross_val_score(clf3, x_train, y_train)
print('DecisionTreeClassifier交叉验证准确率为:'+str(scores1.mean()))    
print('RandomForestClassifier交叉验证准确率为:'+str(scores2.mean()))    
print('ExtraTreesClassifier交叉验证准确率为:'+str(scores3.mean()))
'''





clf1.fit(x_train, y_train)
clf2.fit(x_train, y_train)
clf3.fit(x_train, y_train)

#区域预测
x1_min, x1_max = x[:, 0].min(), x[:, 0].max()            # 第0列的范围
x2_min, x2_max = x[:, 1].min(), x[:, 1].max()            # 第1列的范围
x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]# 生成网格采样点行列均为200点
area_smaple_point = np.stack((x1.flat, x2.flat), axis=1) # 将区域划分为一系列测试点去用学习的模型预测,进而根据预测结果画区域
area1_predict = clf1.predict(area_smaple_point)          # 所有区域点进行预测
area1_predict = area1_predict.reshape(x1.shape)          # 转化为和x1一样的数组因为用plt.pcolormesh(x1, x2, area_flag, cmap=classifier_area_color) 
                                                         # 时x1和x2组成的是200*200矩阵,area_flag要与它对应

area2_predict = clf2.predict(area_smaple_point)          
area2_predict = area2_predict.reshape(x1.shape)

area3_predict = clf3.predict(area_smaple_point)          
area3_predict = area3_predict.reshape(x1.shape)



mpl.rcParams['font.sans-serif'] = [u'SimHei']            #用来正常显示中文标签    
mpl.rcParams['axes.unicode_minus'] = False               #用来正常显示负号

classifier_area_color = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])  #区域颜色
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])                                  #样本所属类别颜色


#绘图
#第一个子图
plt.subplot(2,2,1)

plt.pcolormesh(x1, x2, area1_predict, cmap=classifier_area_color)                        
plt.scatter(x_train[:,0], x_train[:,1], c=y_train,marker='o', s=50, cmap=cm_dark)    
plt.scatter(x_test[:,0],x_test[:,1], c=y_test,marker='x', s=50, cmap=cm_dark)

plt.xlabel('data_x', fontsize=8)  
plt.ylabel('data_y', fontsize=8)
plt.xlim(x1_min, x1_max)  
plt.ylim(x2_min, x2_max)
plt.title(u'DecisionTreeClassifier:传统决策树', fontsize=8)
plt.text(x1_max-9, x2_max-2, u'$o---train ; x---test$')


#第二个子图
plt.subplot(2,2,2)

plt.pcolormesh(x1, x2, area2_predict, cmap=classifier_area_color)                        
plt.scatter(x_train[:,0], x_train[:,1], c=y_train,marker='o', s=50, cmap=cm_dark)    
plt.scatter(x_test[:,0],x_test[:,1], c=y_test,marker='x', s=50, cmap=cm_dark)

plt.xlabel('data_x', fontsize=8)  
plt.ylabel('data_y', fontsize=8)
plt.xlim(x1_min, x1_max)  
plt.ylim(x2_min, x2_max)
plt.title(u'RandomForestClassifier:随机森林算法', fontsize=8)
plt.text(x1_max-9,x2_max-2, u'$o---train ; x---test$')


#第三个子图
plt.subplot(2,2,3)

plt.pcolormesh(x1, x2, area3_predict, cmap=classifier_area_color)                        
plt.scatter(x_train[:,0], x_train[:,1], c=y_train,marker='o', s=50, cmap=cm_dark)    
plt.scatter(x_test[:,0],x_test[:,1], c=y_test,marker='x', s=50, cmap=cm_dark)

plt.xlabel('data_x', fontsize=8)  
plt.ylabel('data_y', fontsize=8)
plt.xlim(x1_min, x1_max)  
plt.ylim(x2_min, x2_max)
plt.title(u'ExtraTreesClassifier:极端随机树', fontsize=8)
plt.text(x1_max-9, x2_max-2, u'$o---train ; x---test$')


#第四个子图
plt.subplot(2,2,4)
y=[]
scores1 = cross_val_score(clf1, x_train, y_train)
y.append(scores1.mean())
scores2 = cross_val_score(clf2, x_train, y_train)
y.append(scores2.mean())
scores3 = cross_val_score(clf3, x_train, y_train)
y.append(scores3.mean())

x=[0,1,2]
plt.bar(x,y,0.4,color="green")  
plt.xlabel("0--DecisionTreeClassifier;1--RandomForestClassifier;2--ExtraTreesClassifie", fontsize=8)  
plt.ylabel("平均准确率", fontsize=8)
plt.ylim(0.9, 0.99)
plt.title("交叉验证",fontsize=8)
for a, b in zip(x, y):  
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)

plt.show()

RandomForestRegressor:

代码:

#随机森林回归
import matplotlib as mpl
import numpy as np
import warnings 
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import ExtraTreesRegressor

#忽略一些版本不兼容等警告
warnings.filterwarnings("ignore")

#产生心状坐标
t = np.arange(0,2*np.pi,0.1)
x = 16*np.sin(t)**3
x=x[:, np.newaxis]
y = 13*np.cos(t)-5*np.cos(2*t)-2*np.cos(3*t)-np.cos(4*t)
y[::7]+= 3* (1 - np.random.rand(9))                      #增加噪声,在每数2个数的时候增加一点噪声

#传统决策树线性回归,随机森林回归,极端森林回归
rf1=DecisionTreeRegressor()
rf2=RandomForestRegressor(n_estimators=1000)           #一般来说n_estimators越大越好,运行结果呈现出的两种结果该值分别是10和1000
rf3=ExtraTreesRegressor()


#三种算法的预测
y_rf1 =rf1.fit(x,y).predict(x)
y_rf2 =rf2.fit(x,y).predict(x)
y_rf3 =rf3.fit(x,y).predict(x)

#为了后面plt.text定位
x1_min, x1_max = x[:].min(), x[:].max()          
x2_min, x2_max = y[:].min(), y[:].max()

mpl.rcParams['font.sans-serif'] = [u'SimHei']            #用来正常显示中文标签    
mpl.rcParams['axes.unicode_minus'] = False

plt.scatter(x, y, color='darkorange', label='data')  
plt.hold('on')

plt.plot(x, y_rf1, color='b',  label='DecisionTreeRegressor')  
plt.plot(x, y_rf2, color='g',  label='RandomForestRegressor')  
plt.plot(x, y_rf3, color='r',  label='ExtraTreesRegressor')

plt.xlabel('data_x')  
plt.ylabel('data_y')  
plt.title('python_machine-learning_RandomForest(n_estimators=1000)-----心状学习')  
plt.legend()
plt.text(x1_max-4, x2_max-1, u'$o---Sample-Point$')
plt.show()

运行结果:



更多算法可以参看博主其他文章,或者github:https://github.com/Mryangkaitong/python-Machine-learning

机器学习之集成学习

集成学习是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。本课程主要讲解:个体与集成、Boosting、Bagging与随机森林、结合策略、多样性等知识点。
  • 2018年01月15日 01:56

python随机森林

准备在天池新人赛中使用随机森林。 网上搜索了一个博客: http://blog.csdn.net/lulei1217/article/details/49583287 下面是自己实现的代码: ...
  • masbbx123
  • masbbx123
  • 2017-12-22 10:15:51
  • 124

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

转载自http://blog.csdn.net/lulei1217/article/details/49583287。仅用作个人学习。 这几天一直在看随机森林。可以说遇到任何一个有关预测的问题。都可...
  • qq_27245709
  • qq_27245709
  • 2017-06-28 23:32:38
  • 917

数据挖掘 h2o python随机森林

train.csv为训练数据集,该数据集是驾驶员行为识别聚类结果经处理后的数据。其中driver,trip这2列在构 建模型时没有用, Catrgory为类别标签,其余变量为有意义的特征0 数据集的样...
  • Nougats
  • Nougats
  • 2017-07-01 14:15:22
  • 1497

Python爬虫/文本处理/科学计算/机器学习——工具包总结

Python爬虫/文本处理/科学计算/机器学习——工具包总结 作者:DianaCody         曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开...
  • hubin1989
  • hubin1989
  • 2017-01-23 16:42:00
  • 1699

随机森林

在机器学习中,随机森林由许多的决策树组成,因为这些决策树的形成采用了随机的方法,因此也叫做随机决策树。随机森林中的树之间是没有关联的。当测试数据进入随机森林时,其实就是让每一颗决策树进行分类,最后取所...
  • lsp1991
  • lsp1991
  • 2017-10-15 20:07:54
  • 100

[python] 基于k-means和tfidf的文本聚类代码简单实现

基本步骤包括: 1.使用python+selenium分析dom结构爬取百度|互动百科文本摘要信息; 2.使用jieba结巴分词对文本进行中文分词,同时插入字典关于关键...
  • Eastmount
  • Eastmount
  • 2016-01-08 02:52:26
  • 40188

随机森林的简单实现

近日听了七月天空周博的课。现在对随机森林进行一下,简单的实现。 随机森林(randomforest)是一种利用多个分类树对数据进行判别与分类的方法,它在对数据进行分类的同时,还可以给出各个变量(基因...
  • asdfghjkl1993
  • asdfghjkl1993
  • 2015-11-08 16:51:31
  • 2280

python数据挖掘领域工具包

Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy。其中Numpy是一个用python实现的科学计算包。包括: 一个强大的N维数组对象Array;比较成熟的(广播)函数库;...
  • Leonis_v
  • Leonis_v
  • 2016-06-29 09:48:15
  • 401

Python<H2o使用分布式随机森林建模分类>

1.安装H2ocmd:输入pip install h2o2.启动python import h2o h2o.init()启动成功之后可以在浏览器中输入:localhost:54321 3.数据准备使...
  • Gpwner
  • Gpwner
  • 2017-07-01 13:34:03
  • 1379
收藏助手
不良信息举报
您举报文章:python_sklearn机器学习算法系列之RandomForest(随机森林算法)
举报原因:
原因补充:

(最多只允许输入30个字)