决策树原理以及在sklearn中的使用

简介: 决策树原理以及在sklearn中的使用

决策树基础


什么是决策树


决策树学习的算法通常是一个递归地选择最优特征(选择方法的 不同,对应着不同的算 法),并根据该特征对训练数据进行分割,使得各个子数据集有一个 最好的分类的过程。这 一过程对应着对特征空间的划分,也对应着决策树的构建。


决策树提供了一种展示类似在什么条件下会得到什么值这类规则 的方法

决策树一般是自上而下生成的

决策树既可以解决分类问题,也可以解决回归问题

信息增益与信息增益比


熵(entropy)

熵(entropy)表示随机变量不确定性的度量。设X是一个取有限个 值的离散随机变量,其概率分布为

则随机变量X的熵定义为



信息增益

特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵 H(D)与特征A给定条件 下D的经验条件熵H(D|A)之差,即



信息增益大的特征具有更强的分类能力,举个例子:



g(D,A2 ),g(D,A3 ),g(D,A4 )的计算方法类似.


信息增益比

信息增益值的大小是相对于训练数据集而言的,并没有绝对意 义。当某个特征的取值种 类非常多时,会导致该特征对训练数据集的信息增益偏大。反之, 信息增益值会偏小。使用 信息增益比(information gain ratio)可以对这一问题进行校正。 这是特征选择的另一准 则。 特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益 g(D,A)与训练数据集D关于 特征A的值的熵HA(D)之比,即



决策树的ID3和C4.5生成算法

ID3算法生成决策树的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树

C4.5在生成决策树的过程中,用信息增益比来选择特征

注意: 决策树生成只考虑了对训练数据更好的拟合,可以通过对决策 树进行剪枝,从而减小模型的复杂度,达到避免过拟合的效果


基尼指数与CART决策树


基尼指数(Gini index)

在分类问题中,假设有K个类,样本点属于第k类的概率为pk, 则概率分布的基尼指数定义为



Gini指数越小表示集合的纯度越高,反之,集合越不纯


例如:有三个类别,它们所占的比例分别为{1/3,1/3,1/3},则基尼 指数为 G=1-(1/3)2-(1/3)2-(1/3)2=0.666;若三个类别所占的比例分别为{1/10,2/10,7/10},则基尼指数 为 G=1-(1/10)2-(2/10)2-(7/10)2=0.46; 若三个类别所占的比例分别为{1,0,0},则基尼指数为 G=1-12=0;


CART决策树


分类与回归树(classification and regression tree,CART) 模型是应用广泛的决策树学习方法。CART既可以用于分类也可以用 于回归。 CART分类树默认使用基尼指数选择最优特征


各类算法总结


ID3:信息增益标示按某种特性分类后,剩余特性的信息熵的大小 的衰减程度,信息熵越小, 证明已经分好的类别就更加的纯粹单一

C4.5:选择了信息增益比替代信息增益;由于ID3算法会倾向于 选取特征值较多的特征 进行分类(因为这样会让信息增益很大),比如:区分每个学生的成绩 采用学生的学号进行区分,那么每个学生对应一个学号,则按照学 号分的话,每个分组中就只有一个样本,并且信息熵为0,显然这个 不是我们想要的,因此我们引入了信息增益比,每次选择分类特性 的时候,根据信息增益比进行选取

基尼系数:代表了模型的不纯度,基尼系数越小,则不纯度越 低,特征越好

实战——CART分类树的sklearn实现


sklearn中使用sklearn.tree.DecisionTreeClassifier可以实现 CART分类树,默认使用gini指数选择特征。


在使用DecisionTreeClassifier对训练数据集进行拟合后,可使 用下面封装的绘图函数进行观察。

# 封装绘图函数
def plot_decision_boundary(model, axis):
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1],int((axis[1]-axis[0])*100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3],int((axis[3]-axis[2])*100)).reshape(-1, 1),
   )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    plt.contourf(x0, x1, zz, linewidth=5,cmap=custom_cmap)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 生成数据集
X, y = datasets.make_moons(noise=0.25, random_state=666)
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

from sklearn.tree import DecisionTreeClassifier
# 测试一
dt_clf1 = DecisionTreeClassifier()  # 使用CART分类树的默认参数
dt_clf1.fit(X,y)  # 拟合
# 当前训练好的模型绘制决策边界
plot_decision_boundary(dt_clf1,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

通过观察模型拟合结果,发现模型过拟合了,需要调整


# 测试二
dt_clf2 = DecisionTreeClassifier(max_depth=2) # 设置决策树的最大深度 
dt_clf2.fit(X,y)  # 拟合
# 当前训练好的模型绘制决策边界
plot_decision_boundary(dt_clf2,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()


通过限制决策树的最大深度可以防止过拟合


# 测试三
dt_clf3 = DecisionTreeClassifier(max_leaf_nodes=4) # 设置决策树的最多叶子结点数 
dt_clf3.fit(X,y)  # 拟合
# 当前训练好的模型绘制决策边界
plot_decision_boundary(dt_clf3,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

通过限制决策树的叶子节点数也可以防止过拟合


实战——决策树解决回归问题

sklearn中使用sklearn.tree.DecisionTreeRegressor可以实现CART 回归树

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston = datasets.load_boston()  # 加载波士顿房价数据集
X = boston.data  # 样本特征
y = boston.target  # 样本标签
# 拆分数据集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=666)
from sklearn.tree import DecisionTreeRegressor
dt_reg = DecisionTreeRegressor()  # 创建CART回归树对象
dt_reg.fit(X_train,y_train)  # 拟合训练集
dt_reg.score(X_test,y_test)  # 在测试集上进行测试,R2分数
# DecisionTreeRegressor有很多超参数,可以进行调参达到避免过拟合的效果
dt_reg2 = DecisionTreeRegressor(max_depth=4,max_leaf_nodes=5)  
dt_reg2.fit(X_train,y_train)  # 拟合训练集
dt_reg2.score(X_test,y_test)  # 在测试集上进行测试,R2分数

目录
打赏
0
0
0
0
38
分享
相关文章
|
9月前
Sklearn库中的决策树模型有哪些主要参数?
Sklearn的决策树模型参数包括:criterion(默认"gini")用于特征选择,splitter(默认"best")决定划分点,max_depth限制树的最大深度,min_samples_split设置内部节点划分的最小样本数,min_samples_leaf定义叶子节点最少样本数,max_features(默认"auto")控制搜索最优划分时的特征数量,random_state设定随机数种子,max_leaf_nodes限制最大叶子节点数,以及min_impurity_decrease阻止不纯度减少不足的节点划分。
118 0
|
9月前
|
sklearn算法
sklearn算法
65 0
使用sklearn进行特征选择
背景 一个典型的机器学习任务,是通过样本的特征来预测样本所对应的值。如果样本的特征少,我们会考虑增加特征。而现实中的情况往往是特征太多了,需要减少一些特征。
Sklearn中的监督学习全览:从线性回归到SVM
【7月更文第23天】 在机器学习的广阔领域中,监督学习占据着举足轻重的地位,它通过已标记的数据集学习输入与输出之间的映射关系,进而对未知数据进行预测。`scikit-learn`(简称sklearn)作为Python中最受欢迎的机器学习库之一,提供了丰富的监督学习算法。本篇文章将带您深入探索sklearn中的监督学习世界,从简单的线性回归到复杂的支撑向量机(SVM),并通过实战代码示例,让您对这些算法有更直观的理解。
109 8
Sklearn中逻辑回归建模
分类模型评估通常涉及准确率、召回率和F1值。准确率是正确分类样本的比例,但在类别不平衡时可能误导,例如一个模型总是预测多数类,即使误分类少数类也能有高准确率。召回率关注的是真正类被正确识别的比例,而精确率则衡量预测为正类的样本中真正为正类的比例。F1值是精确率和召回率的调和平均数,提供了两者之间的平衡。在sklearn中,可以使用`recall_score`, `precision_score` 和 `f1_score` 函数来计算这些指标。在类别重要性不同时,需根据业务需求选择合适的评估标准。
机器学习之聚类算法Kmeans及其应用,调用sklearn中聚类算法以及手动实现Kmeans算法。
机器学习之聚类算法Kmeans及其应用,调用sklearn中聚类算法以及手动实现Kmeans算法。
423 0
机器学习之聚类算法Kmeans及其应用,调用sklearn中聚类算法以及手动实现Kmeans算法。
一、线性回归的两种实现方式:(二)sklearn实现
一、线性回归的两种实现方式:(二)sklearn实现
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等