机器学习sklearn之决策树

决策树

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

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

首先,决策树的发展历程包括: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这句话,执行到这里会报错

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41599977/article/details/89525683