赵走x博客
网站访问量:151928
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:17、随机森林
资源编号:75904
人工智能
深入浅出Python机器学习
热度:121
常言道,不要为了一棵树放弃一片森林。这句话在机器学习算法方面也是非常正确的。虽然决策树算法简单易理解,而且不需要对数据进行转换,但是它的缺点也很明显一一决策树往往容易出现过拟合的问题。不过这难不倒我们,因为我们可以让很多树组成团队来工作,也就是一一随机森林。
常言道,不要为了一棵树放弃一片森林。这句话在机器学习算法方面也是非常正确的。虽然决策树算法简单易理解,而且不需要对数据进行转换,但是它的缺点也很明显一一决策树往往容易出现过拟合的问题。不过这难不倒我们,因为我们可以让很多树组成团队来工作,也就是一一随机森林。 # 1、 随机森林的基本概念 先来一段比较官方的解释: 随机森林有的时候也被称为是随机决策森林,是一种集合学习方法,既可以用于分类,也可以用于回归。而所谓集合学习算法,其实就是把多个机器学习算法综合在一起,制造出一个更加大模型的意思。这也就很好地解释了为什么这种算法称为随机森林了,如图6-7 所示,因为它“有很多树”嘛!  在机器学习的领域,其实有很多中集合算法,目前应用比较广泛的就包括随机森林(Random Forests )和梯度上升决策树( Gradient Boosted Decision Trees, GBDT ) 。本书主要讲的是随机森林算法。 前面我们提到,决策树算法很容易出现过拟合的现象。那么为什么随机森林可以解决这个问题呢?因为随机森林是把不同的几棵决策树打包到一起,每棵树的参数都不相同,然后我们把每棵树预测的结果取平均值,这样即可以保留决策树们的工作成效,又可以降低过拟合的风险。这其实也是可以用数学方法推导出来的,不过我们一如既往地,不会讨论数学公式,接下来直接进入随机森林的构建环节。 # 2、 随机森林的构建 这次我们继续用在决策树中来展示酒的数据集,在Jupyter Notebook 中输入代码如下: ``` # 导入随机森林模型 from sklearn.ensemble import RandomForestClassifier # 导入tree 模型和数据集加载工具 from sklearn import tree, datasets # 导入数据集拆分工具 from sklearn.model_selection import train_test_split # 载入红酒数据集 wine=datasets.load_wine() # 选择数据集前两个特征 X=wine.data[:,:2] y=wine.target # 将数据集拆分为训练集和测试集 X_train,X_test,y_train,y_test=train_test_split(X,y) # 设定随机森林中有6棵树 forest=RandomForestClassifier(n_estimators=6,random_state=3) # 使用模型拟合数据 forest.fit(X_train,y_train) print(forest) ``` 运行结果: ``` RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=6, n_jobs=None, oob_score=False, random_state=3, verbose=0, warm_start=False) ``` [结果分析]可以看到,随机森林向我们返回了包含其自身全部参数的信息,让我们重点看一下其中几个必要重要的参数。首先是bootstrap 参数,代表的是bootstrap sample , 也就是“有放回抽样”的意思,指每次从样本空间中可以重复抽取同一个样本(因为样本在第一次被抽取之后又被放回去了) ,形象一点来说,如原始样本是[’ 苹果’,’ 西瓜’,’香蕉’, '桃子' ] ,那么经过bootstrap sample 重构的样本就可能是[ ’ 西瓜’,’ 西瓜’ , '香蕉', ’ 桃子’],还有可能是[’苹果’,’ 香蕉’ , ’ 桃子’,' 桃子’ ] 。Bootstrap sample 生成的数据集和原始数据集在数据量上是完全一样的,但由于进行了重复采样, 因此其中有一些数据点会丢失。 看到这里,读者可能会问为什么要生成bootstrap sample 数据集。这是因为通过重新生成数据集,可以让随机森林中的每一棵决策树在构建的时候,会彼此之间有些差异。再加上每棵树的节点都会去选择不同的样本特征,经过这两步动作之后,可以完全肯定随机森林中的每棵树都不一样,这也符合我们使用随机森林的初衷。 接下来模型会基于新数据集建立一棵决策树,在随机森林当中,算法不会让每棵决策树都生成最佳的节点,而是会在每个节点上随机地选择一些样本特征,然后让其中之一有最好的拟合表现。在这里,我们是用max_features 这个参数来控制所选择的特征数量最大值的, 在不进行指定的情况下,随机森林默认自动选择最大特征数量。 而关于ma_features 参数的设置,还是有些讲究的。假如把max_features 设置为样本全部的特征数n_features 就意味着模型会在全部特征中进行筛选,这样在特征选择这一步, 就没有随机性可言了。而如果把max_features 的值设为1 , 就意味着模型在数据特征上完全没有选择的余地,只能去寻找这1个被随机选出来的特征向量的阀值值了。所以说, max_features 的取值越高,随机森林里的每一棵决策树就会“长得更像”,它们因为有更多的不同特征可以选择,也就会更容易拟合数据: 反之,如果max_features 取值越低,就会迫使每棵决策树的样子更加不同,而且因为特征太少,决策树们不得不制造更多节点来拟合数据。 另外还有一个要强调的参数,是n_estimators , 这个参数控制的是随机森林中决策树的数量。在随机森林构建完成之后, 每棵决策树都会单独进行预测。如果是用来进行回归分析的话,随机森林会把所有决策树预测的值取平均数; 如果是用来进行分类的话,在森林内部会进行"投票",每棵树预测出数据类别的概率,比如其中一棵树说, “这瓶酒80% 属于class 1 ”, 另外一棵树说, “这瓶酒60% 属于class 2 ”,随机森林会把这些概率取平均值,然后把样本放入概率最高的分类当中。 下面我们用图像直观地看一下随机森林分类的表现,输入代码如下: ``` # 导入随机森林模型 from matplotlib.colors import ListedColormap from sklearn.ensemble import RandomForestClassifier # 导入tree 模型和数据集加载工具 from sklearn import tree, datasets # 导入数据集拆分工具 from sklearn.model_selection import train_test_split import numpy as np import matplotlib.pyplot as plt # 载入红酒数据集 wine=datasets.load_wine() # 选择数据集前两个特征 X=wine.data[:,:2] y=wine.target # 将数据集拆分为训练集和测试集 X_train,X_test,y_train,y_test=train_test_split(X,y) # 设定随机森林中有6棵树 forest=RandomForestClassifier(n_estimators=6,random_state=3) # 使用模型拟合数据 forest.fit(X_train,y_train) # 定义图像中分区的颜色和散点的颜色 cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) cmap_bold=ListedColormap(['#FF0000','#00FF00','#0000FF']) # 分别用样本的两个特征值创建图像和横轴和纵轴 x_min,x_max=X_train[:,0].min()-1,X_train[:,0].max()+1 y_min,y_max=X_train[:,1].min()-1,X_train[:,1].max()+1 xx,yy=np.meshgrid(np.arange(x_min,x_max,.02), np.arange(y_min,y_max,.02)) Z=forest.predict(np.c_[xx.ravel(),yy.ravel()]) # 给每个分类中的样本分配不同的颜色 Z=Z.reshape(xx.shape) plt.figure() plt.pcolormesh(xx,yy,Z,cmap=cmap_light) # 用散点把样本表示出来 plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,edgecolors='k',s=20) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title('Classifier:RandomForest') plt.show() ``` 运行结果:  {结果分析] 如果与上节的图片进行对比,可以发现随机森林所进行的分类要更加细腻一些,对训练数据集的拟合更好。读者朋友可以自己试试调节n_estimator 参数和random_state 参数, 看看分类器的表现会有怎样的变化。 # 3、 随机森林的优势和不足 目前在机器学习领域,无论是分类还是回归,随机森林都是应用最广泛的算法之一。可以说随机森林十分强大, 使用决策树并不需要用户过于在意参数的调节。而且,和决策树一样,随机森林算法也不要求对数据进行预处理。 从优势的角度来说,随机森林集成了决策树的所有优点,而且能够弥补决策树的不足。但也不是说决策树算法就被彻底抛弃了。从便于展示决策过程的角度来说, 决策树依旧表现强悍。尤其是随机森林中每棵决策树的层级要比单独的决策树更深,所以如果需要向非专业人士展示模型工作过程的话,还是需要用到决策树的。 还有,随机森林算法支持并行处理。对于超大数据集来说,随机森林会比较耗时(毕竟要建立很多决策树),不过我们可以用多进程并行处理的方式来解决这个问题。实现方式是调节随机森林的njobs 参数,记得把njobs 参数数值设为和CPU 内核数一致,比如你的CPU 内核数是2 ,那么njobs 参数设为3 或者更大是没有意义的。当然如果你搞不清楚自己的C PU 到底就多少内核,可以设置njobs =-1,这样随机森林会使用CPU的全部内核,速度就会极大提升了。 需要注意的是,因为随机森林生成每棵决策树的方法是随机的(所以名字叫随机森林嘛),那么不同的random_state 参数会导致模型完全不同,所以如果不希望建模的结果太过于不稳定,一定要固化random_state 这个参数的数值。 不过,虽然随机森林有诸多优点,尤其是并行处理功能在处理超大数据集时能提供良好的性能表现。但它也有不足,例如,对于超高维数据集、稀疏数据集等来说,随机森林就有点捉襟见肘了,在这种情况下,线性模型要比随机森林的表现更好一些。还有,随机森林相对更消耗内存,速度也比线性模型要慢,所以如果程序希望更节省内存和时间的话, 建议还是选择线性模型。