首页 > 分享 > Python:以鸢尾花数据为例,介绍决策树算法

Python:以鸢尾花数据为例,介绍决策树算法

文章参考来源:

https://www.cnblogs.com/yanqiang/p/11600569.html

https://www.cnblogs.com/baby-lily/p/10646226.html

https://blog.csdn.net/liuziyuan333183/article/details/107399633

决策树算法

决策树算法主要有ID3, C4.5, CART这三种。

ID3算法从树的根节点开始,总是选择信息增益最大的特征,对此特征施加判断条件建立子节点,递归进行,直到信息增益很小或者没有特征时结束。
信息增益:特征 A 对于某一训练集 D 的信息增益 g(D,A)g(D,A) 定义为集合 D 的熵 H(D)H(D) 与特征 A 在给定条件下 D 的熵 H(D/A)H(D/A) 之差。
熵(Entropy)是表示随机变量不确定性的度量。

g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)−H(D∣A)

C4.5是使用了信息增益比来选择特征,这被看成是 ID3 算法的一种改进。

但这两种算法都会导致过拟合的问题,需要进行剪枝。

决策树的修剪,其实就是通过优化损失函数来去掉不必要的一些分类特征,降低模型的整体复杂度。

CART 算法在生成树的过程中,分类树采用了基尼指数(Gini Index)最小化原则,而回归树选择了平方损失函数最小化原则。
CART 算法也包含了树的修剪,CART 算法从完全生长的决策树底端剪去一些子树,使得模型更加简单。

具体代码实现上,scikit-learn 提供的 DecisionTreeClassifier 类可以做多分类任务。

1. DecisionTreeClassifier API 的使用

和其他分类器一样,DecisionTreeClassifier 需要两个数组作为输入:
X: 训练数据,稀疏或稠密矩阵,大小为 [n_samples, n_features]
Y: 类别标签,整型数组,大小为 [n_samples]

from sklearn import tree

X = [[0, 0], [1, 1]]

Y = [0, 1]

clf = tree.DecisionTreeClassifier(criterion="entropy"

,splitter="best"

,max_depth=10

,min_samples_split=5

,min_samples_leaf=1

,min_weight_fraction_leaf=0.0

,max_features=None

,random_state=None

,max_leaf_nodes=None

,min_impurity_decrease=0.0

,min_impurity_split=None

,class_weight=None

,presort=False

)

clf = clf.fit(X, Y)

DecisionTreeClassifier参数如下:

函数的参数含义如下所示:

criterion:gini或者entropy,前者是基尼系数,后者是信息熵。splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中,默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random” 。max_features:None(所有),log2,sqrt,N  特征小于50的时候一般使用所有的max_depth:  int or None, optional (default=None) 设置决策随机森林中的决策树的最大深度,深度越大,越容易过拟合,推荐树的深度为:5-20之间。min_samples_split:设置结点的最小样本数量,当样本数量可能小于此值时,结点将不会在划分。min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。min_weight_fraction_leaf: 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。class_weight: 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

模型拟合后,可以用于预测样本的分类

clf.predict([[2., 2.]])

array([1])

此外,可以预测样本属于每个分类(叶节点)的概率,(输出结果:0%,100%)

clf.predict_proba([[2., 2.]])

array([[0., 1.]])

DecisionTreeClassifier() 模型方法中也包含非常多的参数值。例如:

criterion = gini/entropy 可以用来选择用基尼指数或者熵来做损失函数。splitter = best/random 用来确定每个节点的分裂策略。支持 “最佳” 或者“随机”。max_depth = int 用来控制决策树的最大深度,防止模型出现过拟合。min_samples_leaf = int 用来设置叶节点上的最少样本数量,用于对树进行修剪。 2. 由鸢尾花数据集构建决策树

鸢尾花数据集:
数据集名称的准确名称为 Iris Data Set,总共包含 150 行数据。每一行数据由 4 个特征值及一个目标值组成。
其中 4 个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度。
而目标值为三种不同类别的鸢尾花,分别为:Iris Setosa,Iris Versicolour,Iris Virginica。

DecisionTreeClassifier 既可以用于二分类,也可以用于多分类。
对于鸢尾花数据集,可以如下构建决策树:

from sklearn.datasets import load_iris

from sklearn import tree

X, y = load_iris(return_X_y=True)

clf = tree.DecisionTreeClassifier()

clf = clf.fit(X, y)

2.1 简单绘制决策树

拟合完后,可以用plot_tree()方法绘制出决策树来,如下图所示

tree.plot_tree(clf)

2.2 Graphviz形式输出决策树

也可以用 Graphviz 格式(export_graphviz)输出。
如果使用的是 conda 包管理器,可以用如下方式安装:

conda install python-graphviz
pip install graphviz

以下展示了用 Graphviz 输出上述从鸢尾花数据集得到的决策树,结果保存为 iris.pdf

import graphviz

iris = load_iris()

dot_data = tree.export_graphviz(clf, out_file=None)

graph = graphviz.Source(dot_data)

graph.render("iris")

export_graphviz 支持使用参数进行视觉优化,包括根据分类或者回归值绘制彩色的结点,也可以使用显式的变量或者类名。
Jupyter Notebook 还可以自动内联呈现这些绘图。

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 = graphviz.Source(dot_data)

graph

2.3 文本形式输出决策树

此外,决策树也可以使用 export_text 方法以文本形式输出,这个方法不需要安装其他包,也更加的简洁。

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

from sklearn.tree.export import export_text

iris = load_iris()

decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2)

decision_tree = decision_tree.fit(iris.data, iris.target)

r = export_text(decision_tree, feature_names=iris['feature_names'])

print(r)

|--- petal width (cm) <= 0.80

| |--- class: 0

|--- petal width (cm) > 0.80

| |--- petal width (cm) <= 1.75

| | |--- class: 1

| |--- petal width (cm) > 1.75

| | |--- class: 2

3. 绘制决策平面

绘制由特征对构成的决策平面,决策边界由训练集得到的简单阈值组成。

print(__doc__)

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier, plot_tree

# Parameters

n_classes = 3

plot_colors = "ryb"

plot_step = 0.02

# Load data

iris = load_iris()

for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],

[1, 2], [1, 3], [2, 3]]):

# We only take the two corresponding features

X = iris.data[:, pair]

y = iris.target

# Train

clf = DecisionTreeClassifier().fit(X, y)

# Plot the decision boundary

plt.subplot(2, 3, pairidx + 1)

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, plot_step),

np.arange(y_min, y_max, plot_step))

plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)

plt.xlabel(iris.feature_names[pair[0]])

plt.ylabel(iris.feature_names[pair[1]])

# Plot the training points

for i, color in zip(range(n_classes), plot_colors):

idx = np.where(y == i)

plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],

cmap=plt.cm.RdYlBu, edgecolor='black', s=15)

plt.suptitle("Decision surface of a decision tree using paired features")

plt.legend(loc='lower right', borderpad=0, handletextpad=0)

plt.axis("tight")

plt.figure()

clf = DecisionTreeClassifier().fit(iris.data, iris.target)

plot_tree(clf, filled=True)

plt.show()

Automatically created module for IPython interactive environment

4. 数据集划分及结果评估

数据集获取

from sklearn import datasets

iris = datasets.load_iris()

iris_feature = iris.data

iris_target = iris.target

数据集划分

from sklearn.model_selection import train_test_split

feature_train, feature_test, target_train, target_test = train_test_split(iris_feature, iris_target, test_size=0.33, random_state=42)

模型训练及预测

from sklearn.tree import DecisionTreeClassifier

dt_model = DecisionTreeClassifier()

dt_model.fit(feature_train,target_train)

predict_results = dt_model.predict(feature_test)

结果评估

scores = dt_model.score(feature_test, target_test)

scores

1.0 参考文档

scikit-learn 1.10.1 DecisionTreeClassifier API User Guide
Example: a decision tree on the iris dataset

相关知识

以鸢尾花数据集为例,用Python对决策树进行分类
【python数据挖掘课程】十九.鸢尾花数据集可视化、线性回归、决策树花样分析
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
python利用c4.5决策树对鸢尾花卉数据集进行分类(iris)
Python原生代码实现KNN算法(鸢尾花数据集)
python的鸢尾花数据如何导入
Python实现KNN算法(鸢尾花数据)
机器学习算法之决策树实现鸢尾花数据分类
python实战(一)——iris鸢尾花数据集分类
python 鸢尾花数据集下载

网址: Python:以鸢尾花数据为例,介绍决策树算法 https://m.huajiangbk.com/newsview1141604.html

所属分类:花卉
上一篇: 腰果长在什么树上
下一篇: 珍珠梅