sklearn机器学习(四)

Task04
本次学习参照Datawhale开源学习:https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn
内容安排如下,主要是一些代码实现和部分原理介绍。
在这里插入图片描述

4. 决策树

决策树是一种基本的分类与回归方法。在分类问题中,它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。学习时,利用训练数据根据损失函数最小化原则建立决策树模型。预测时,对新的数据利用决策树模型进行分类。决策树学习包括三个步骤:特征选择、决策树生成、决策树修剪。

4.1. 决策树结构

一棵决策树包含一个根结点,若干个内部结点和若干个叶结点。叶结点对应于决策结果,其它结点对应于属性测试。每个结点包含的样本集合根据属性测试的结果被划分到子结点中。决策树学习的基本流程遵循简单“分而治之”策略。三种情形会导致递归返回,当前结点包含的样本全属于同一类别,无需划分;当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;当前结点包含的样本集合为空,不能划分。
在这里插入图片描述

4.2. 特征选择

决策树学习的关键是如何选择最优划分属性。

4.2.1. 信息增益

“信息熵”是度量样本集合纯度最常用的指标。样本集合 D D D中第 k k k类样本所占的比例为 p k ( k = 1 , 2 , . . . , ∣ γ ∣ ) p_k(k=1,2,...,|\gamma|) pk(k=1,2,...,γ),则 D D D信息熵为: E n t ( D ) = − ∑ k = 1 ∣ γ ∣ p k l o g 2 p k Ent(D)=-\sum_{k=1}^{|\gamma|}p_klog_2p_k Ent(D)=k=1γpklog2pk E n t ( D ) Ent(D) Ent(D)值越小, D D D纯度越高。属性 a a a对样本集 D D D进行划分所获得的信息增益 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 a a划分所获得的纯度提升越大。

4.2.2. 增益率

信息增益准则对可取数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,C4.5决策树算法不直接使用信息增益,而是使用增益率来选择最优划分属性:
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)} Gainratio(D,a)=IV(a)Gain(D,a)其中: I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} IV(a)=v=1VDDvlog2DDv

4.2.3. 基尼系数

CART决策树使用“基尼系数”来选择属性划分,数据集 D D D的纯度:
G i n i ( D ) = ∑ k = 1 ∣ γ ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ γ ∣ p k 2 Gini(D)=\sum_{k=1}^{|\gamma|}\sum_{k'\not=k}p_kp_{k'}=1-\sum_{k=1}^{|\gamma|}p_k^2 Gini(D)=k=1γk=kpkpk=1k=1γpk2 G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D中随机抽取两个样本,其类别标记不一致的概率。因此 G i n i ( D ) Gini(D) Gini(D)越小,则数据集 D D D的纯度越高。属性a的基尼指数定义为:
G i n i i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v) Giniindex(D,a)=v=1VDDvGini(Dv)
选择使得划分后基尼指数最小的属性作为最优划分属性。

4.3. 决策树生成

4.3.1. ID3算法

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

  • 从根结点开始,对结点计算所有可能的特征的信息增益
  • 选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点
  • 对子结点递归地调用以上方法,构建决策树,直到所有特征地信息增益均很小或没有特征可以选择为止。

最后得到一个决策树,ID3相当于用极大似然法进行概率模型地选择。

4.3.2. C4.5生成算法

C4.5算法与ID3算法相似,不同的是,C4.5算法在生成地过程中,用信息增益比来选择特征。

4.4. 决策树修剪

剪枝是决策树学习算法对付“过拟合”地主要手段,基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前先进性估计,若当前结点地划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。后剪枝是先从训练集生成一颗完整地决策树,然后自底向上地对非叶结点进行考察,若该结点对应的子树退还为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

4.5. sklearn决策树

'''对鸢尾花数据集进行分类任务'''
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt

# 导入数据集
data = load_iris()
df = pd.DataFrame(data.data, columns = data.feature_names)

# 分类标签
df['Species'] = data.target
target = np.unique(data.target)
target_names = np.unique(data.target_names)
targets = dict(zip(target, target_names))
df['Species'] = df['Species'].replace(targets)

# 划分特征和标签
x = df.drop(columns="Species")
y = df["Species"]
feature_names = x.columns
labels = y.unique()

# 划分训练集和测试集
X_train, test_x, y_train, test_lab = train_test_split(x,y,test_size = 0.4,random_state = 42)

# 使用决策树训练模型
model = DecisionTreeClassifier(max_depth =3, random_state = 42)
model.fit(X_train, y_train)      

# 决策树可视化
plt.figure(figsize=(30,10), facecolor ='g')
a = tree.plot_tree(model,feature_names = feature_names,class_names = labels,rounded = True,filled = True,fontsize=14)
plt.show()     

在这里插入图片描述

4.6. 参数说明

决策树是一种监督学习算法,可以用于分类,也可用于回归。sklearn.tree.DecisionTreeClassifier 是sklearn中用于决策树分类问题的类。

class sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, 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, class_weight=None, ccp_alpha=0.0)

criterion特征选择标准,‘gini’ or ‘entropy’ (default=”gini”)
splitter特征划分标准,‘best’ or ‘random’ (default=”best”)
max_depth决策树最大深度,int or None(default=None)。推荐树的深度为:5-20之间
min_samples_split内部节点再划分所需最小样本数,int, float(default=2)。int则取值本身作为最小样本数;float则按比例取(min_samples_split * 样本数量)的值作为最小样本数
min_samples_leaf叶子节点最少样本数,int,float(default=1)
min_weight_fraction_leaf叶子节点最小加权分数,float(default=0)。一个叶节点上的所有输入样本总权重的最小加权分数
max_features最大特征数,int, float or {“auto”, “sqrt”, “log2”}, (default=None)。寻找最佳分割时的特征数
random_state随机参数,int, RandomState instance or None, (default=None)。每次分割都是随机的,该参数将固定一个随机分割点
max_leaf_nodes最大叶子节点数,int or None(default=None)
min_impurity_decrease节点划分最小不纯度,float, (default=0)。如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点,即为叶子节点
min_impurity_split信息增益的阀值,float,(default=1e-7)决策树在创建分支时,信息增益必须大于这个阀值,否则不分裂,成为叶子节点。
class_weight类别权重,dict, list of dicts, “balanced” or None,(default=None)。指定样本各类别的的权重
ccp_alpha最小剪枝系数,non-negative float,(default=0)。该参数用来限制树过拟合的剪枝参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值