欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习sklearn之决策树

程序员文章站 2022-03-05 22:11:55
...

决策树

决策树算法是一个非常经典的机器学习算法,常用于分类和回归,也特别适合集成学习,首先先给大家推荐两个看过的比较好的博客:

由于决策树算法的公式编辑比较多,本博客就不做详细说明了。简单的对自己的学习进行总结。

首先,决策树的发展历程包括: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树最大的好处是还可以做回归模型
机器学习sklearn之决策树
当然,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()

机器学习sklearn之决策树

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这句话,执行到这里会报错

机器学习sklearn之决策树