根据菜菜的课程进行整理,便利记忆理解
代码方位如下:
DecisionTreeClassifier与红酒数据集
class sklearn.tree.DecisionTreeClassifier (
criterion
=’gini’,splitter
=’best’,max_depth
=None,min_samples_split
=2,min_samples_leaf
=1, min_weight_fraction_leaf=0.0,max_features
=None,random_state
=None, max_leaf_nodes=None, min_impurity_decrease=0.0,min_impurity_split
=None,class_weight=None, presort=False)
重要参数
random_state & splitter
-
random_state:用来设置分枝中的随机形式的参数,默许None,在高维度时随机性会体现更明显,低维度的数据(比如鸢尾花数据集),随机性简直不会闪现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
-
splitter:也是用来操控决策树中的随机选项的.这也是避免过拟合的一种方法。当你猜测到你的模型会过拟合,用这两个参数来帮助你下降树建成之后过拟合的可能性。当然,树一旦建成,咱们依然是运用剪枝参数来避免过拟合。
-
best
,决策树在分枝时尽管随机,可是仍是会优先挑选更重要的特征进行分枝(重要性可以经过特点feature_importances_查看) -
random
,决策树在分枝时会愈加随机,树会由于含有更多的不必要信息而更深更大,并因这些不必要信息而下降对练习集的拟合。
-
# splitter 避免过拟合,使模型变简略,分数下降
clf = tree.DecisionTreeClassifier(criterion="gini",random_state=30,splitter="best")
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf.fit(Xtrain,Ytrain)
score = clf.score(Xtest,Ytest)
score
clf = tree.DecisionTreeClassifier(criterion="gini",random_state=30,splitter="random")
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf.fit(Xtrain,Ytrain)
score = clf.score(Xtest,Ytest)
score
剪枝参数
在不加约束的情况下,一棵决策树会生长到衡量不纯度的指标最优,或许没有更多的特征可用为止。这样的决策树往往会过拟合,这便是说,它会在练习集上体现很好,在测验集上却体现糟糕。咱们搜集的样本数据不可能和全体的情况完全一致,因而当一棵决策树对练习数据有了过于优异的解释性,它找出的规则必然包括了练习样本中的噪声,并使它对不知道数据的拟合程度缺乏。
为了让决策树有更好的泛化性,咱们要对决策树进行剪枝。剪枝战略对决策树的影响巨大,正确的剪枝战略是优化决策树算法的中心。sklearn为咱们提供了不同的剪枝战略:
max_depth
约束树的最大深度,超越设定深度的树枝全部剪掉
这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以约束树深度可以有效地约束过拟合。在集成算法中也非常实用。实际运用时,主张从=3开始测验,看看拟合的作用再决议是否增加设定深度。
min_samples_leaf & min_samples_split
-
min_samples_leaf : 约束,一个节点在分枝后的每个子节点都必须包括至少min_samples_leaf个练习样本,不然分枝就不会发生,或许,分枝会朝着满意每个子节点都包括min_samples_leaf个样本的方向去发生
- 一般搭配max_depth运用,在回归树中有奇特的作用,可以让模型变得愈加滑润。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,主张从=5开始运用。假如叶节点中含有的样本量变化很大,主张输入浮点数作为样本量的百分比来运用。同时,这个参数可以保证每个叶子的最小尺度,可以在回归问题中避免低方差,过拟合的叶子节点呈现。对于类别不多的分类问题,=1一般便是最佳挑选。
-
min_samples_split : 约束,一个节点必需要包括至少min_samples_split个练习样本,这个节点才允许被分枝,不然分枝就不会发生。
# max_depth 和 min_samples_split 配合运用
# 咱们可以清晰的发现,最下面的44个清酒的没有分枝并没有展开
clf = tree.DecisionTreeClassifier(criterion="gini",random_state=30,max_depth=3,min_samples_split=15)
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf.fit(Xtrain,Ytrain)
dot_data = tree.export_graphviz(
clf
,feature_names=wine.feature_names
,class_names=["琴酒","清酒","茅台"]
,filled=True
,rounded= True
)
graph = graphviz.Source(dot_data)
graph
max_features & min_impurity_decrease
一般max_depth运用,用作树的”精修“
- max_features : 约束分枝时考虑的特征个数,超越约束个数的特征都会被舍弃。和max_depth殊途同归,max_features是用来约束高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接约束可以运用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习缺乏。假如期望经过降维的方法避免过拟合,主张运用PCA,ICA或许特征挑选模块中的降维算法。
- min_impurity_decrease : 约束信息增益的巨细,信息增益小于设定数值的分枝不会发生。这是在0.19版别中更新的功能,在0.19版别之前时运用min_impurity_split。
方针权重参数
class_weight & min_weight_fraction_leaf
- class_weight : 完成样本标签平衡的参数。样本不平衡是指在一组数据会集,标签的一类天然生成占有很大的份额。比如说,在银行要判断“一个办了信用卡的人是否会违约”,便是是vs否(1%:99%)的份额。这种分类情况下,即使模型什么也不做,全把成果猜测成“否”,正确率也能有99%。因而咱们要运用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少量类,向捕获少量类的方向建模。该参数默许None,此形式表明主动给与数据会集的一切标签相同的权重。
- min_weight_fraction_leaf : 有了权重之后,样本量就不再是单纯地记载数目,而是受输入的权重影响了,因而这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来运用.
学习曲线(要点
)
那详细怎么来确认每个参数填写什么值呢?这时候,咱们就要运用确认超参数的曲线来进行判断了,继续运用咱们现已练习好的决策树模型clf。超参数的学习曲线,是一条以超参数的取值为横坐标,模型的衡量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的体现的线。在咱们建好的决策树里,咱们的模型衡量指标便是score。
# 寻求最优的超参数 max_depth
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
wine = load_wine()
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(criterion="gini",random_state=30,max_depth=i+1,min_samples_leaf=10)
clf.fit(Xtrain,Ytrain)
score = clf.score(Xtest,Ytest)
test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.show()
重要特点和接口
特点是在模型练习之后,可以调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_ ,可以查看各个特征对模型的重要性。
sklearn中许多算法的接口都是相似的,比如说咱们之前现已用到的fit和score,简直对每个算法都可以运用。除了这两个接口之外,决策树最常用的接口还有apply和predict。
- apply中输入测验集返回每个测验样本所在的叶子节点的索引
- predict输入测验集返回每个测验样本的标签。
在这里不得不提的是,一切接口中要求输入X_train和X_test的部分,输入的特征矩阵必须至少是一个二维矩阵
。sklearn不接受任何一维矩阵作为特征矩阵被输入。假如你的数据的确只要一个特征,那必须用reshape(-1,1)来给矩阵增维;假如你的数据只要一个特征和一个样本,运用reshape(1,-1)来给你的数据增维。
# 返回的是猜测的所在节点的索引
clf.apply(Xtest)
# array([ 3, 6, 3, 10, 3, 3, 7, 10, 3, 10, 3, 10, 3, 3, 10, 10, 3,10, 3, 3, 6, 3, 3, 10, 10, 6, 3, 6, 3, 3, 6, 9, 9, 10,10, 7, 4, 9, 9, 6, 10, 3, 7, 10, 4, 3, 4, 4, 10, 9, 3,10, 3, 10], dtype=int64)
# 返回的是类别的猜测值
clf.predict(Xtest)
# array([1, 2, 1, 0, 1, 1, 2, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 2, 1,1, 0, 0, 2, 1, 2, 1, 1, 2, 0, 0, 0, 0, 2, 1, 0, 0, 2, 0, 1, 2, 0,1, 1, 1, 1, 0, 0, 1, 0, 1, 0])
总结
- 八个参数:Criterion,两个随机性相关的参数(random_state,splitter),五个剪枝参数(max_depth,min_samples_split,min_samples_leaf,max_feature,min_impurity_decrease)
- 一个特点:feature_importances_
- 四个接口:fit,score,apply,predict