机器学习之决策树

决策树(decision tree) 是一类常见的机器学习方法。顾名思义,决策树是基于树结构来进行决策的,其基本流程遵循简单且直观的"分而治之" (divide-and-conquer) 策略。
决策树学习的关键是如何选择最优划分属性,使得分支结点的"纯度" (purity) 越来越高。

1决策树算法相关术语

1.1信息熵

“信息熵” (information entropy)是度量样本集合纯度最常用的一种指标。样本集合D的信息熵定义
E n t ( D ) = − ∑ k = 1 ∣ γ ∣ p k   l o g 2   p k Ent(D)=-\sum_{k=1}^{|\gamma|}p_k\, log_2\, p_k Ent(D)=k=1γpklog2pk
Ent(D)的值越小,则D 的纯度越高,最小值为0。

1.2信息增益

假定离散属性a有V 个可能的取值 a 1 , a 2 , . . . , a V {a^1,a^2,...,a^V} a1,a2,...,aV,若使用a 来对样本集D 进行划分,则会产生V 个分支结点,那么可计算用属性a 对样本集D 进行划分所获得的"信息增益" (information gain),公式:
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣   E n t ( D v ) Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}\, Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的"纯度提升"越大。因此,我们可用信息增益来选择决策树的划分属性。著名的ID3(Iterative Dichotomiser 3)决策树学习算法就是以信息增益为准则来选择划分属性。

1.3增益率

信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,著名的C4.5决策树算法不直接使用信息增益,而是使用"增益率" (gain ratio) 来选择最优划分属性。增益率定义为:
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) ) I V ( a ) ) Gain\_ratio(D,a)=\frac{Gain(D,a))}{IV(a))} Gain_ratio(D,a)=IV(a))Gain(D,a))
需注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法不是直接用增益率,而采用先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

1.4基尼指数

CART决策树使用"基尼指数" (Gini index)来选择划分属性,是Classification and Regression Tree(分类和回归树)的简称,分类和回归任务都可用。数据集D的纯度可用基尼指数进行度量。

1.5剪枝处理

剪枝(pruning)是决策树学习算法对付"过拟合"的主要手段。基本策略有"预剪枝" (prepruning)和"后剪枝"(postpruning)。

1.6连续值处理

如何在决策树学习中使用连续属性?
最简单的策略是采用二分法(bi-partition)对连续属性进行离散化处理。

2Sklearn代码实现

决策树是一种用来 classification 和 regression 的无参监督学习方法。其目的是创建一种模型从数据特征中学习简单的决策规则来预测一个目标变量的值。
Sklearn库中类DecisionTreeClassifier分类算法,类DecisionTreeRegressor 回归算法。
决策树算法: ID3, C4.5, C5.0 和 CART,Sklearn库使用 CART 算法的优化版本。
示例:鸢尾花数据集分类任务

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
import sklearn.metrics as sm
from sklearn.model_selection import train_test_split

# 加载数据
iris = datasets.load_iris()
x = iris.data
y = iris.target
fnames = iris.feature_names
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=37, test_size=0.2)

# 创建模型
model = DecisionTreeClassifier()
# 训练模型
model.fit(x_train, y_train)
# 预测
pred_y = model.predict(x_test)
acc = model.score(x_test, y_test)
print('score', acc)
# 获取决策树的特征重要性指标
dt_fi = model.feature_importances_
print(dt_fi)
# 模型评分
print(sm.r2_score(y_test, pred_y))

# 绘制数据散点图
plt.title('Iris Decision Tree Classifier')
label_dict = iris.target_names
for label, marker, color in zip(range(0, 3), ('*', 's', 'o'), ('blue', 'red', 'green')):
plt.scatter(x=x_test[y_test == label][:, 0],
	    y=x_test[y_test == label][:, 1],
	    marker=marker,
	    color=color,
	    label=label_dict[label])
# plt.scatter(x_test[:, 0], x_test[:, 1], c=pred_y, cmap='brg', s=80)
plt.xlabel(fnames[0], fontsize=14)
plt.ylabel(fnames[1], fontsize=14)
# 图例
plt.legend(loc='upper right', fancybox=True)
# 刻度字体大小
plt.tick_params(labelsize=10)
plt.show()

# 柱状图显示特征重要性
plt.figure('Feature Ipltortance')
plt.title('Iris Features')
plt.ylabel('Ipltortance', fontsize=12)
plt.grid(axis='y', linestyle=':')
# 从高到低排序
sorted_indices = np.argsort(dt_fi)[::-1]
x_tick = np.arange(4)
fnames = np.array(fnames)
plt.bar(x_tick, dt_fi[sorted_indices], 0.8, color='dodgerblue', label='DT FI')
plt.xticks(x_tick, fnames[sorted_indices])
plt.legend()

# 自动调整子图参数, 防止坐标轴标签、刻度标签以及标题出现重叠
plt.tight_layout()
plt.show()

运行效果,如下图:
classifier
features

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
决策树是常用的机器学习算法之一,通过对数据的分类和特征值计算来完成对未知数据的预测。本文将介绍使用Python实现决策树算法的相关步骤。 首先,需要导入决策树算法工具包,使用以下代码: ```python from sklearn import tree ``` 然后,导入训练数据和测试数据,并进行预处理。为了方便起见,在本文中采用生成随机数的方式来生成样本数据,使用以下代码: ```python from sklearn.datasets import make_classification X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=0, random_state=0, shuffle=False) ``` 接下来,使用生成的样本数据进行模型训练。这里使用scikit-learn中的DecisionTreeClassifier()函数。 ```python clf = tree.DecisionTreeClassifier() clf = clf.fit(X, y) ``` 训练后,调用predict()方法进行对测试数据的预测,使用以下代码: ```python y_pred = clf.predict(X) ``` 最后,评估模型的准确率,使用以下代码: ```python from sklearn.metrics import accuracy_score print(accuracy_score(y, y_pred)) ``` 这就是使用Python实现决策树算法的基本过程。决策树可以根据数据中的不同特征进行分类,是一个简单且常用的分类算法。决策树算法也可用于回归问题,例如预测一个数的大小。与其他机器学习算法相比,决策树具有易于理解和可解释的优点,同时还可以处理非线性的分类问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值