机器学习学习笔记
- Sklearn入门
- 决策树(一)——分类树
- 决策树(二)——回归树
文章目录
- 1 决策树是如何工作的
- 2 决策树建模的基本流程
- 3 Sklearn中的决策树类型
- 4 DicisionTreeClassifier 分类树
- 4.1 重要参数
- 4.1.1 critertion
- 例子:建立一棵树
- 4.1.2 控制随机性:random_state & splitter
- 4.1.3 剪枝参数
- max_depth
- min_samples_leaf & min_samples_split
- max_features & min_impurity_decrease
- 确认最优的剪枝参数——学习曲线
- 4.1.4 目标权重参数
- class_weight & min_weight_fraction_leaf
- 4.2 重要属性和接口
- 属性
- 接口
- 附录:所有参数
1 决策树是如何工作的
决策树是一种多功能机器学习算法, 即可以执行分类任务也可以执行回归任务,甚至包括多输出任务。
例如将动物们分为哺乳类和非哺乳类。那根据已经收集到的数据,决策树算法为我们算出了下面的这棵决策树:
可以看出,在这个决策过程中,我们一直在对记录的特征进行提问。
- 最初的问题所在的地方叫做根节点
- 得到结论前的每一个问题都是中间节点
- 得到的每一个结论(动物的类别)都叫做叶子节点
2 决策树建模的基本流程
问题:
- 如何从数据表中找出最佳节点和最佳分枝?
- 如何让决策树停止生长,防止过拟合?
3 Sklearn中的决策树类型
sklearn.tree
sklearn中决策树的类都在“tree”模块之下,这个模块包括五个类:
模块 | 类名 |
---|---|
tree.DecisionTreeClassifier | 分类树 |
tree.DecisionTreeRegressor | 回归树 |
tree.wxport_graphviz | 将生成的决策树导出DOT格式,画圈专用 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归树 |
1
2
3
4
5
6from sklearn import tree #导入需要的模块 clf = tree.DecisionTreeClassifier() #实例化 clf = clf.fit(X_train,y_train) #用训练集数据训练模型 result = clf.score(X_test,y_test) #导入测试集,从接口中调用所需要的信息
4 DicisionTreeClassifier 分类树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class 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)
4.1 重要参数
4.1.1 critertion
不纯度:衡量的指标,越低越好
这个参数是用来决定不纯度的计算方法的,有两种选择:
- 输入
entropy
,使用信息熵 - 输入
gini
,使用基尼系数
- 比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强
- 在实际使用中,信息熵和基尼系数的效果基本相同
- 对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好
- 当模型拟合程度不足的时候,即当模型在训练集和测试集上都表现不太好的时候,使用信息熵
决策树的基本流程简单概括:
直到没有更多的特征可用,或者整体的不纯度指标已经最优,决策树就会停止生长
例子:建立一棵树
1
2
3
4from sklearn import tree from sklearn.model_selection import train_test_split from sklearn.datasets import load_wine #红酒数据
1
2wine = load_wine()
分训练集和测试集,测试集占所有数据量的30%
1
2Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
建立模型,使用criterion="entropy"和criterion="gini"来进行比对
1
2
3
4
5clf = tree.DecisionTreeClassifier(criterion="entropy") clf = clf.fit(Xtrain, Ytrain) score = clf.score(Xtest, Ytest) #返回预测的准确度 score
画一棵树
1
2
3
4
5
6
7
8
9
10
11
12
13
14feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸'] import graphviz dot_data = tree.export_graphviz (clf ,feature_names=feature_name ,class_names=['a','b','c'] ,filled=True #填充颜色 ,rounded=True #外框是否是圆形 ) graph = graphviz,Source(dot_data) graph
探索
1
2
3#返回使用了哪些特征,返回重要性 clf.feature_importances_
1
2
3#返回使用了哪些特征,返回重要性 [*zip(feature_name,clf.feature_importances_)]
4.1.2 控制随机性:random_state & splitter
1、random_state用来设置分枝中的随机模式的参数,默认为None,可以输入任意整数,会一直长出同一棵树,让模型稳定下来
设置了这个,score就不会改变了
2、splitter也可以用来控制决策树中的随机选项
有两种输入值:best
和random
输入best会优先选择更重要的特征
random会更加随意
1
2
3clf = tree.DecisionTreeClassifier (criterion="entropy",random_state=30,splitter="random")
4.1.3 剪枝参数
有时会出现过拟合
1
2
3
4#查看拟合程度 score_train = clf.score(Xtrain, Ytrain) score_train
为了让决策树有更好的泛化性,我们要对决策树进行剪枝。
剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。sklearn为我们提供了不同的剪枝策略:
max_depth
限制树的最大深度,超过的树枝全部剪掉
这是用的最广泛的剪枝参数,在高纬度低样本量时非常有效
建议从3开始尝试
min_samples_leaf & min_samples_split
min_samples_leaf限定,一个节点在分支后每个子节点必须包含至少min_samples_leaf个训练样本。
- 一般与max_depth结合,建议从5开始尝试
- 如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用
- 对于类别不多的分类问题,1通常就是最佳选择
min_samples_split限定,一个节点至少包含min_samples_split个训练样本,这个节点才能够被允许分枝
1
2
3
4
5
6
7clf = tree.DecisionTreeClassifier(criterion="entropy" ,random_state=30 ,splitter="random" ,max_depth=3 ,min_samples_leaf=10 ,min_samples_split=10)
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。
确认最优的剪枝参数——学习曲线
那具体怎么来确定每个参数填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了
超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import matplotlib.pyplot as plt test = [] for i in range(10): clf = tree.DecisionTreeClassifier(max_depth=i+1 ,criterion="entropy" ,random_state=30 ,splitter="random" ) clf = clf.fit(Xtrain, Ytrain) score = clf.score(Xtest, Ytest) test.append(score) plt.plot(range(1,11),test,color="red",label="max_depth") plt.legend() plt.show()
4.1.4 目标权重参数
class_weight & min_weight_fraction_leaf
完成样本标签平衡的参数
样本不平衡:是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。
因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重。
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。
另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保
4.2 重要属性和接口
属性
最重要的是feature_importances_
,能够查看每个特征的重要性
接口
附录:所有参数
最后
以上就是无限绿茶最近收集整理的关于【机器学习】决策树的使用和代码示例(一)1 决策树是如何工作的2 决策树建模的基本流程3 Sklearn中的决策树类型4 DicisionTreeClassifier 分类树的全部内容,更多相关【机器学习】决策树的使用和代码示例(一)1内容请搜索靠谱客的其他文章。
发表评论 取消回复