机器学习sklearn之决策树
程序员文章站
2022-03-05 22:11:55
...
决策树
决策树算法是一个非常经典的机器学习算法,常用于分类和回归,也特别适合集成学习,首先先给大家推荐两个看过的比较好的博客:
- 1、https://blog.csdn.net/u012328159/article/details/70184415
该博客从构造决策树方法、剪枝、连续值处理、缺失值处理四个方面详细介绍了决策树算法,并给出了详细的计算过程,案例来源于西瓜书 - 2、https://www.cnblogs.com/pinard/p/6050306.html
该博客从作者的学习和实践经验出发,对决策树算法做了很好的总结,强烈建议大家看看评论内容,收获很大。
由于决策树算法的公式编辑比较多,本博客就不做详细说明了。简单的对自己的学习进行总结。
首先,决策树的发展历程包括:ID3–>C4.5–>CART,现在常用的是CART决策树,它既可以做分类也能做回归。
其中ID3算法存在如下几个缺点:
- 1、没有考虑连续特征
- 2、采用的是信息增益作为选择节点的依据,这使得取值比较多的特征的信息增益比较大
- 3、未考虑缺失值的处理
- 4、过拟合问题
增对上述缺点,C4.5在此基础上做了相应的改进:
1、对于连续特征,C4.5采用了特征离散化的办法,具体细节可以参考上述博客,很容易理解的,这里不再赘述
2、采用了信息增益比的划分依据,解决了ID3的第二个缺陷
3、处理缺失值
4、引入正则化系数剪枝
存在的不足:
- 1、剪枝的方法有待提升,常用的是:预剪枝、后剪枝,在CART中采用了后剪枝与交叉验证的方式选择最合适的决策树
- 2、C4.5是多叉树,运算效率没有二叉树高
- 3、C4.5只能用于分类
CART算法,在不考虑集成学习的情况下,CART算法算是比较好的算法了,在sklearn库里也是使用的这个算法,在CART算法中采用的是基尼系数作为划分的依据,这简化了熵模型,也不完全丢失熵模型的优点。
CART算法相比C4.5算法的分类方法,采用了简化的二叉树模型,同时特征选择采用了近似的基尼系数来简化计算。当然CART树最大的好处是还可以做回归模型
当然,CART算法也存在一些缺点:
- 1、分类决策不应该只取决于一个特征,而是由一组特征决定,我觉得在这一方面比不上神经网络,比如:自编码器+softmax分类器,但是决策树的可解释性强啊
- 2、只要样本发生一点点变化,树的结构可能就发生大的变化了,解决办法:集成优化
最后给出几个小案例,供初学者入门学习
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
# 随便挑了两个维度
iris = load_iris()
X = iris.data[:, [1, 2]]
y = iris.target
clf = DecisionTreeClassifier(max_depth=4)
clf.fit(X, y)
# 画图
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.show()
graphviz 安装:
以下链接下载安装包,我这里下载的是graphviz-2.38.zip
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
下载完成后解压,把bin所在的目录添加到环境变量中去,dot -version查看是否安装成功
决策树可视化方式一
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.datasets import load_iris
isir = load_iris()
X = isir.data
y = isir.target
clf = DecisionTreeClassifier(max_depth=4)
clf.fit(X, y)
dot_data = export_graphviz(clf, out_file="tree2.dot",
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
# 命令行输入: dot -Tpng tree2.dot -o tree2.png
决策树可视化方式二,推荐
from IPython.display import Image
from sklearn import tree
import pydotplus
from sklearn.datasets import load_iris
import os
os.environ["PATH"] += os.pathsep + "D:/graphviz/release/bin/" # 要加上这一句,不然会报错:GraphViz's executables not found
iris = load_iris()
X = iris.data
y = iris.target
clf = tree.DecisionTreeClassifier(max_depth=4)
clf.fit(X, y)
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png()) # 不加os这句话,执行到这里会报错
上一篇: 笔记:机器学习之决策树
下一篇: IDEA