文章目录
- 决策树算法核心是要解决两个的关键问题
- sklearn中的决策树模型
- sklearn建模步骤
- 分类树
- Criterion
- random_state && splitter
- 剪枝参数
- max_depth
- min_samples_leaf&&min_samples_split
- max_features&&min_impurity_decrease
- 确认最优剪枝参数
- 目标权重参数
- 重要属性和接口
- 回归树
- 参数、属性、接口
- Criterion
- 交叉验证
决策树算法核心是要解决两个的关键问题
1、如何从数据表中照出最佳节点和最佳分支
2、如何让决策树停止生长防止过拟合
就是说假如我有一张数据表,数据表中有成千上万个特征,我要把他们都提问完吗?
sklearn中的决策树模型
本文主要是学习分类树和回归树
sklearn建模步骤
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(x_train, y_train)
result = clf.score(x_test, y_test)
分类树
Criterion
为了将表格转化为一棵树,决策树需要找到最佳节点和最佳分支方法,对于分类数来说衡量最佳的方法是叫做不纯度,通常来说不纯度越低,决策树对训练集的拟合效果越好,所有的决策树算法都是将和不纯度相关的某个属性最优化,不管我们用那个算法,都是追求的与不纯度相关的指标最优化
不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定低于父节点的不纯度,在一棵决策树上叶子节点的不纯度一定是最低的
Criterion这个参数就是用来决定不纯度计算方法的,sklearn中提供了两种方法
一种是输入“entropy”,使用信息熵
一种是输入"gini",使用基尼系数
我们无法干扰信息熵和基尼系数的计算,所以这里我们知道怎么算的即可,sklearn中的方法我们是无法干扰的
相比于基尼系数来说,信息熵对于不纯度更加敏感,对不纯度的更强,但在实际使用中两者的效果差不多,信息熵的计算相比于基尼系数会慢一点,因为基尼系数没有对数运算,因为信息熵对于不纯度更加敏感,所以信息熵在计算决策树时候会更加仔细,所以对于高维数据或者噪音很多的数据来说很容易过拟合
关于参数如何选择
我们可以看到我们的决策树中并没有用到我们所给的所有属性
clf = tree.DecisionTreeClassifier(criterion = "entropy", random_state=30)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) # 返回预测的准确度accuracy
score
random_state && splitter
用来设置分支中的随机模式的参数,默认为None,在高维度时随机性会表现更明显,低维度数据几乎不会显现,我们任意给random_state一个数值可以让模型稳定下来
决策树是随机的
splitter也是用来控制决策树中随机选项的可以输入best,决策树虽然分支时会随机但会有限选择更重要的特征进行分支,输入random分支时会更加随机,树会更深,拟合将会降低,这也是防止过拟合的一种方法
clf = tree.DecisionTreeClassifier(criterion = "entropy", splitter="best")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) # 返回预测的准确度accurac
score
剪枝参数
在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或没有更多的特征可用停止,这样的决策树往往会过拟合,也就是说他会在训练集上表现很好,在测试集上表现却很糟糕
score = clf.score(Xtrain, Ytrain)
score
我们要分清楚过拟合的概念,过拟合,也就是说他会在训练集上表现很好,在测试集上表现却很糟糕,但如果我们在训练集和测试集上的表现效果都很好的话不能称为过拟合
剪枝策略对于决策树的影响巨大,正确的剪枝策略是决策树优化的核心
max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉
这是用的最广泛的剪枝参数,在高维度低样本量时非常有效,决策树多生长一层对样本的需求量就会增加一倍,所以限制决策树的深度能够特别有效的限制过拟合,在集成算法中也非常常用,在实际使用过程中,建议我们从3开始尝试,看看拟合的效果再决定是否增加深度
min_samples_leaf&&min_samples_split
这两个是用来限制叶子节点的参数,
min_samples_leaf建议从5开始使用
min_samples_split:一个节点至少包含min_samples_split个样本才被允许进行分支
max_features&&min_impurity_decrease
确认最优剪枝参数
使用确认超参数的曲线
import matplotlib.pyplot as plt
test = []
for i in range(10):clf = tree.DecisionTreeClassifier(criterion = "entropy", random_state=30, splitter="random", max_depth = i + 1)clf = clf.fit(Xtrain, Ytrain)score = clf.score(Xtest, Ytest) # 返回预测的准确度accuracytest.append(score)
plt.plot(range(1,11), test,color = "red", label="max_depth")
plt.legend()
plt.show()
目标权重参数
重要属性和接口
fit
score
apply
predict
回归树
参数、属性、接口
Criterion
回归树衡量分枝质量的指标,支持的有三种
1、mse使用均方误差
2、friedman_mse误差费尔德曼均方误差
3、mae绝对均方误差
这里面也有许多数学原理,但是我们在使用sklearn时不用关心,因为这些因素我们并无法干预
属性依然是feature_importance_
接口中依然是
fit
score
apply
predict
是最核心
交叉验证
交叉验证是用来验证模型稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度
导入所需要的库
from sklearn.datasets import load_diabetes
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
导入数据集
diabetes = load_diabetes()
实例化并交叉验证
regressor = DecisionTreeRegressor(random_state = 0) #实例化
cross_val_score(regressor, diabetes.data, diabetes.target, cv = 10, scoring = "neg_mean_squared_error") #交叉验证
参数解读
1、第一个参数可以是回归也可以是分类,这里的模型不止可以是决策树,可以是其他的支持向量机、随机森林等等模型,可以是任何我们实例化后的算法模型
2、第二个参数是完整的不需要分测试集和训练集的特征矩阵,交叉验证会自己帮我们划分测试集和数据集
3、第三个参数是数据的标签(完整的数据标签)
4、cv = 10是将数据集分成10分,每次用其中的一份作为测试集,通常我们将这个数设为5
5、scoring用后面的neg_mean_squared_error衡量我们交叉测试的结果,当默认时会返回R2可能为负数,但是我们在做回归时最常用的是均方误差,neg_mean_squared_error是负均方误差,R2越接近1越好