是一种有监督学习方法,从一系列有特征和标签的数据中总结出决策规则,并采用树状图的结构来呈现规则,用来解决分类和回归问题。
节点:
根节点:没有进边,有出边。包含最初的,针对特征的提问
中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签
子节点与父节点:在两个相连的节点中,更接近根节点的是父节点,应一个是子节点。
1、如何从数据中找出最佳节点或者最佳分支?
2、如何让决策树停止生长,防止过拟合?
决策树是基于训练集数据构建出来的,如果树长的越大分支越细致,则对训练数据的描述越清楚,但是不一定会很好的用于测试数据中
根据数据构建很多决策树,再通过贪心算法实现局部最优来达到全局最优结果的算法。
不纯度:某一类标签占有的比例比较大,则说明改标签纯,否则就是不纯,样本呢越纯分配错误的几率越低
用信息熵计算不纯度。
如何用信息熵计算不纯度?
先了解下什么叫做信息熵
当我们需要判断64组小组比赛的冠军时,我们可以单个单个的猜,最多需要64次才能猜中,但是我们把数据分开,分为1-32和33-64,决断出哪一份会赢,然后再进行拆分,重复六次,最终确定赢得小组,这种代价被称为6比特,
信息量得值会随着更多有用信息得出现而降低
计算公式:即H(A)=\sum_ip(i)log\frac{1}{p(i)}。
信息熵越大,猜对的概率越小,不确定越大,猜对的代价越大
信息熵越小,猜对的概率越大,不确定越小,猜对的代价越小
如何衡量决策树里节点(特征)重要性?如何理解特征的重要性?
重要性:如果一个节点减少分类的不确定性越明显,则该节点就越重要。
使用信息增益衡量特征的重要性
信息增益:
在根据某个他则会那个划分数据集之前滞后信息熵发生的变化或者差异叫做信息增益,知道如何计算信息增哟,获得计算增益最高的特征就是最好的选择
信息增益作为决策树的划分依据
决策树需要用到的api是:
from sklearn.tree import DecisionTreeClassifier 用来分类
from sklearn.tree import DecisionTreeRegressor 用来回归
需要用到的对象以及参数:
tree = DecisionTreeClassifier(criterion='entropy',random_state=2023)建立对象
需要对里面的参数进行设置criterion,设置为'entropy'表示信息熵,默认是基尼系数,random_state自行设置,如果设置完,后面的准确率就不会发生变化,在特征维度比较多时,建议使用,splitter给定best表示决策树在分支时虽然随机,还是会优先选择更重要的特征进行分支,而random,在分支时会更加随机,会防止过拟合,剪枝参数:
max_depth:限制树的最大深度,超过深度的数值全部剪掉,建议从3开始尝试
min_samples_leaf和min_samples_splite,前者表示该节点后面的节点必须要多于或者等于min_samples_leaf的样本数,否则,不会延续到下一分支,而后者表示,当一个节点内的样本数必须大于或者等于min_samples_splite数才可以分支,否则不能分支
import sklearn.datasets as dataset
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor
data = dataset.load_wine()
print(data.keys())
tree = DecisionTreeClassifier(criterion='entropy',splitter='best')
feature = data['data']
target = data['target']
print(feature.shape, target.shape)
x_train, x_test, y_train, y_test = train_test_split(feature, target,train_size=0.8, random_state=2023)
tree.fit(x_train,y_train)
score = tree.score(x_test,y_test)
print(score)
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
(178, 13) (178,)
0.7777777777777778
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
(178, 13) (178,)
0.8888888888888888
Process finished with exit code 0
我们会发现两次的运行结果不一样。
决策树在构建树时,是靠及优化节点来追求一颗最优化的树,每次分支时,用的时一部分特征,选出不纯度相关指标最优作为分支用的节点,每次生成的树都不一样。
在anaconda的navigator种open terminal中执行:
conda install graphviz
pip install graphviz
重启终端服务即可
使用model.feature_importances_就会 展现每一个维度特征的重要性,model代表你创建的tree模型的名字
在程序中加入
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青色','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
print(*zip(feature_name,tree1.feature_importances_))
就会输出,每个变量的重要性
('酒精', 0.0) ('苹果酸', 0.0) ('灰', 0.0) ('灰的碱性', 0.0) ('镁', 0.0) ('总酚', 0.02365073516699979) ('类黄酮', 0.0) ('非黄烷类酚类', 0.04131580954362543) ('花青色', 0.0) ('颜色强度', 0.0) ('色调', 0.029152437929677186) ('od280/od315稀释葡萄酒', 0.45064598674757594) ('脯氨酸', 0.4552350306121216)
其中zip就是将名字和变量做一个对应关系