文章目录
1、 决策树
-
关键概念:节点
根节点:没有进边,有出边。包含最初的,针对特征的提问。
中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签。
子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点。 -
决策树算法的核心是要解决两个问题:
1)如何从数据表中找出最佳节点和最佳分枝?
2)如何让决策树停止生长,防止过拟合?
1.2 sklearn中的决策树
2、分类树
八个参数:Criterion,两个随机性相关的参数(random_state,splitter),五个剪枝参数(max_depth,
min_samples_split,min_samples_leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict
2.1 重要参数
1、criterion
2、random_state & splitter
-
random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
-
splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这
也是防止过拟合的一种方式。
3、剪枝参数
在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树
往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现糟糕。
剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。
1、max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉
实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度。
2、min_samples_leaf
min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分
枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据**。一般来说,建议从=5开始使用。**
3、min_samples_split
min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。
4、max_features & min_impurity_decrease
一般max_depth使用,用作树的”精修
-
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。
max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量
而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型
学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。 -
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本中更新的
功能,在0.19版本之前时使用min_impurity_split。
确认最优的剪枝参数
在我们建好的决策树里,我们的模型度量指标就是score。
4、目标权重参数
1、class_weight & min_weight_fraction_leaf
完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要
判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不
做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给
少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给
与数据集中的所有标签相同的权重。
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_
weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_
fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使
用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。
2.2 重要属性和接口
1.属性
属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_,能
够查看各个特征对模型的重要性。
2.接口
1、训练的 fit.() 和 准确度 score.()
# 模型实例化
#不加,random_state=30,每刷新最终预测准确度score会一直变,因为模型一直在变;加上后模型就不变了
clf = tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30 #random_state=可以是任意数
,splitter="random" #准确率变高了,保留,变低了可以注释掉
,max_depth=3 #树的最大深度
# ,min_samples_leaf=10 #分支后这两个子节点都必须有10及以上个样本,否则这两个子节点都被砍掉,(一个够10个,另一个不够,也得都砍掉)
# ,min_samples_split=10 #每个节点必须有10个样本才能往下分,否则不能再分
)
#模型训练
clf = clf.fit(Xtrain, Ytrain)
#返回预测的准确度
score = clf.score(Xtest, Ytest)
score
2、apply和predict
#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)
3.代码
3、回归树
几乎所有参数,属性及接口都和分类树一模一样。需要注意的是,在回归树种,没有标签分布是否均衡的问题,因此没有class_weight这样的参数。
3.1 重要参数,属性及接口
1、参数:criterion
在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡
量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作
为我们的评估(在分类树中这个指标是score代表的预测准确率)。
在回归中,我们追求的是,MSE越小越好。然而,回归树的接口score返回的是R平方,并不是MSE。
虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error) 。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均
方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的
均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。
2、属性:feature_importances_,
3、接口依然是apply, fit, predict, score最核心
4、简单看看回归树是怎样工作的
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
regressor = DecisionTreeRegressor(random_state=0) #实例化
#10次交叉验证的结果
cross_val_score(regressor, boston.data, boston.target, cv=10,
scoring = "neg_mean_squared_error") #boston.data 全部数据,不用划分测试集,训练集
#交叉验证cross_val_score的用法
代码
3、实例:泰坦尼克号幸存者的预测