决策树能够经过将特征空间进行矩形划分的方式来构建复杂的决策边界。
node
深度越大的决策树,决策边界也就越复杂,于是容易产生过拟合现象。
python
Sklearn代码为:
算法
from sklearn.tree import DecisionTreeClassifierfrom sklearn.tree import export_graphvizfrom sklearn import datasets
iris = datasets.load_iris()X = iris.dataY = iris.targetfrom sklearn.model_selection import train_test_splitX_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3)#建立基于信息熵的模型tree = DecisionTreeClassifier(criterion='entropy')tree.fit(X_train,Y_train)import graphvizgra_data= export_graphviz( tree, feature_names=['花萼长度','花萼宽度','花瓣长度','花瓣宽度'])#由于标签是中文因此须要将参数设置成支持微软雅黑的格式gra_data = gra_data.replace('helvetica','"Microsoft Yahei"')
grap = graphviz.Source(gra_data)grap.render('tree')
DecisionTreeClassifier参数有:
criterion:决策树启发函数,默认gini(entropy, gini)bootstrap
splitter:默认为best。best在特征的全部划分点中找出最优的划分点,random随机的在部分划分点中找局部最优的划分点。(best, random)
max_leaf_nodes:最大叶子节点数。默认为None,(int, None)经过设置最大叶子节点数,能够防止过拟合,默认状况下是不设置最大叶子节点数。若是加了限制,算法会创建在最大叶子节点数内最优的决策树。若是特征很少,能够不考虑这个值,可是若是特征多,能够加限制,具体的值能够经过交叉验证获得。
max_depth:决策树最大深度。默认为None。通常数据比较少或者特征少的时候能够不用管这个值,若是模型样本数量多,特征也多时,推荐限制这个最大深度,具体取值取决于数据的分布。经常使用的能够取值10-100之间,经常使用来解决过拟合。
min_impurity_split:信息增益的阀值。决策树在建立分支时,信息增益必须大于这个阀值,不然不分裂。
class_weight:类别权重。默认为None,(dict, list of dicts, balanced)指定样本各种别的权重,主要是为了防止训练集某些类别的样本过多,致使训练的决策树过于偏向这些类别。balanced,算法本身计算权重,样本量少的类别所对应的样本权重会更高。若是样本类别分布没有明显的偏倚,则能够无论这个参数。
在电脑上安装好Graphviz就可使用export_graphviz函数来可视化决策树。微信
经过观察GraphViz建立的图像,能够很好的回溯决策树在训练数据集上对各节点进行划分的过程。
dom
最初,决策树根节点包含105个样本,以花瓣长度<=2.45为界限,将其划分为分别包含33个和72个样本的两个子节点。第一次划分后,能够看到:左子树上的样本均来自于Iris-Setosa类,已经无需再划分。在右子树上进一步划分,直到Versicolor和Virginica两类分开。
编辑器
直观上,随机森林能够视为多颗决策树的集成。集成学习的基本理念就是将弱分类器即成为鲁棒性更强的模型,即一个能力更强的分类器,集成后具有更好的泛化偏差,不易产生过拟合现象。
函数
随机森林能够概况为四个步骤:
性能
使用bootstrap抽样方法随机选择n个样本用于训练(从训练集中随机可重复选择n个样本。)学习
使用第1步选定的样本构造一颗决策树。节点划分以下:(1)不重复地随机选择d个特征。(2)根据目标函数,如最大化信息增益,使用选定的特征对节点进行划分。
重复上述过程1~2000次。
汇总每颗决策树类表进行多数投票。
在步骤2处,对于单决策树的构建作了些许修改:在对节点进行最优化划分的断定时,并未使用全部的特征,而只是随机选择了一个子集。
虽然随机森林没有决策树那样良好的可解释性,但其显著的优点在于没必要担忧超参值的选择。一般不须要对随机森林进行剪枝,由于相对于单棵决策树来讲,集成模型对噪声的鲁棒性更好。在实践中,真正须要关心的参数是为构建随机森林所需的决策树数量(步骤 3))。一般状况下,决策树的数量越多,可是随机森林总体的分类表现就越好,但这同时也相应地增长了计算成本。
经过选择bootstrap抽样中样本数量n,咱们能够控制随机森林的误差与方差权衡的问题。若是n的值较大,就下降了随机性,由此更可能致使随机森林的过拟合。反之,咱们能够基于模型的性能,经过选择较小的n值来下降过拟合。
包括sklearn中RandomForestClassifier在内的大多数对随机森林的实现中,抽样的数量通常与原始训练集中样本的数量相同,由于这样在折中误差与方差方面通常会有一个好的均衡结果。而对于在每次节点划分中用到的特征 数量m,咱们选择一个比训练集中特征总量小的值,一般这个值默认为,m为特征总量。
from sklearn import datasetsiris = datasets.load_iris()X = iris.dataY = iris.targetfrom sklearn.model_selection import train_test_splittrain_test_split(X,Y,test_size=0.3) = from sklearn.ensemble import RandomForestClassifierforest = RandomForestClassifier( criterion='entropy', n_estimators=10, random_state=1,2 = )forest.fit(X_train,Y_train)import graphvizfrom sklearn.tree import export_graphviz#生成的多个随机数trees = forest.estimators_[9]gra_data= export_graphviz( trees, feature_names=['花萼长度','花萼宽度','花瓣长度','花瓣宽度'])#由于标签是中文因此须要将参数设置成支持微软雅黑的格式gra_data = gra_data.replace('helvetica','"Microsoft Yahei"')grap = graphviz.Source(gra_data)grap.render('forest')
上述代码中,经过参数n_estimators使用了10课决策树进行随机森林的训练。

本文分享自微信公众号 - 小啦的学习笔记(woshiguolala)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。