决策树分类模型
目录
决策树
概念
机器学习中的决策树是一种常用的有监督学习算法,主要用于分类和回归任务。决策树模型通过一系列的判断规则来进行决策,这些规则以树状结构表示。
所有数据从根节点一步步洛到叶子节点,对样本进行学习,并建立分类规则,依据分类规则对新样本进行预测。
组成部分:
- 根节点:决策树的起始点。
- 非叶子节点:代表一个特征或属性,是除根节点、叶子节点的中间节点。
- 叶子节点:代表一个决策结果,通常用于分类问题中的类别标签或回归问题中的预测值,最终结果点。
决策树的构建过程:
- 特征选择 :在构建决策树时,首先要选择一个最优的特征来对数据进行分割。常用的特征选择方法有信息增益、信息增益比、基尼指数等。
- 树的生成:根据选择的特征,将数据集分割成多个子集,然后对每个子集递归地进行特征选择和分割,直到满足停止条件。
- 剪枝 :为了避免过拟合,需要对决策树进行剪枝 。剪枝策略有预剪枝和后剪枝两种。预剪枝通过提前停止树的生长来防止过拟合,后剪枝则是在树完全生长后,从下到上地对非叶节点进行考察,删除不具统计显著性的节点。
优缺点
决策树的优点:
- 易于理解和解释。
- 可以处理数值型和类别型数据。
- 能够处理缺失值。
- 抗噪声能力较强。
决策树的缺点:
- 容易过拟合,特别是在没有剪枝的情况下。
- 对于连续特征,决策树需要进行离散化处理,可能会损失信息。
- 对于类别不平衡的数据,决策树可能会偏向于多数类
熵
概念
表示随机变量的不确定性的度量 ,也可以表示物体内部的混乱程度。
算法
数据理解
x1=[1,1,1,2,1]
x2=[1,1,1,1,1]
则x1的熵为 -4/5log(4/5,2)--1/5log(1/5,2) =0.7219280948873623
则x2的熵为 -5/5*log(5/5,2)=0,x2更小,更稳定
决策树的三种分法
ID3(Iterative Dichotomiser 3)
概念
是一种经典的决策树学习算法,ID3算法主要用于构造分类树,其核心思想是以信息增益作为特征选择的标准 ,递归地构建决策树。信息增益越大,意味着该特征在分类中的重要性越高,因此通常选择信息增益最大的特征来进行决策树的节点分裂。
算法步骤
-
数据
-
计算类别熵
-
通过属性熵--------->计算信息增益
- 信息增益 = 类别熵-属性熵
- 信息增益 = 类别熵-属性熵
-
对比信息增益选择最大作为决策树的节点分裂
- 根据该节点的类别和属性重复上述操作至可求出类别
如上选择天气后,分裂除sunny,overcast,rainy三个节点
其中sunny有以下数据,重新根据sunny下的温度、湿度、是否有风属性和类别是否出去玩,重复上述操作。
C4.5
概念
其核心思想是以信息增益比作为特征选择的标准 ,递归地构建决策树。信息增益比越大,意味着该特征在分类中的重要性越高,因此通常选择信息增益比最大的特征来进行决策树的节点分裂。
信息增益比
信息增益比=信息增益/分裂信息
**
如天气的分裂信息2hot-2n,2mild-1no-1yes,1cool-yes
-2/5log(2/5,2)-2/5log(2/5,2)-1/5*log(1/5,2)=1.5219280948873621
天气的信息增益是 0.247
则信息增益比为:0.16229413257416767,根据信息增益比分裂,选择更大的信息增益比,步骤于ID3相同。
CART决策树
概念
决策树是一种常用的决策树学习方法,它可以用于分类问题(Classification Trees)也可以用于回归问题(Regression Trees),分裂准则:CART使用"基尼指数"(Gini index)来作为分类树的分裂准则,使用"最小二乘回归"(Least Squares Regression)来作为回归树的分裂准则。
算法
决策分类树
决策树分类函数及参数
函数导入
python
from sklearn.tree import DecisionTreeClassifier
函数及参数
DecisionTreeClassifier(criterion='gini',max_depth=25,max_leaf_nodes=90,random_state=0)
- 1.criterion :gini or entropy 【采用基尼系数还是熵值衡量,默认基尼系数】
- 2.splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)【默认best,无需更改】
- 3.max_features:(表示表示寻找最优分裂时需要考虑的特征数量,默认为None,表示考虑所有特征。),log2,sqrt,N 特征小于50的时候一般使用所有的
- 4**.max_depth: 表示树的最大深度**,数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下。如果没有设置,那么将会把节点完全展开,直到所有的叶子节点都是纯的,或者达到最小叶子节点的个数阈值设置。
- 5.min_samples_split :(表示分裂一个内部节点需要的最小样本数,默认为2),如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分,如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值,控制内部节点分裂的情况;
- 6.min_samples_leaf :(叶子节点最少样本数)
- 7.min_weight_fraction_leaf:(叶子节点最小的样本权重和)
- 8.max_leaf_nodes :(最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None",
-
- min_impurity_decrease :
- 10.min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
- 11.class_weight 指定样本各类别的的权重,
决策树绘制函数及参数
函数导入
python
from sklearn.tree import plot_tree
函数及参数
- fig,ax = plt.subplots(figsize=(10,10)),显示窗口大小
- plot_tree(dtr,filled=True,ax=ax) ,
- dtr,使用的模型
- filled=True,
- ax=ax,窗口
- plt.show(),显示
AUC性能测试指标
AUC-ROC曲线
可以适用于多分类,二分类等分类问题的性能度量,越接近1,样本分离性越好。
函数
y_pre_proba = dtr.predict_proba(data_te)获取概率,data_te,为测试数据
a = y_pre_proba[:,1]
auc_re = metrics.roc_auc_score(tar_te,a),结果
问题测试
问题数据及分析
除最后一列都为特征数据,最后一列为结果类别
实际测试
代码展示:
python
import matplotlib.pyplot as plt
import pandas as pd
from cv2 import threshold
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
datas = pd.read_excel('cart.xlsx')
data = datas.iloc[:,:-1]
tar = datas.iloc[:,-1]
# 训练集特征,测试集特征,训练集结果,测试集结果,test_size抽取的测试集百分比,train_size 抽取的训练集百分比
data_tr,data_te,tar_tr,tar_te = \
train_test_split(data, tar, test_size=0.2,random_state=0)
dtr = DecisionTreeClassifier(criterion='gini',max_depth=20,max_leaf_nodes=80,random_state=0)
dtr.fit(data_tr,tar_tr)
tr_pr = dtr.predict(data_tr)
score = dtr.score(data_tr,tar_tr)
print(score)
print(metrics.classification_report(tar_tr,tr_pr))
te_pr = dtr.predict(data_te)
score = dtr.score(data_te,tar_te)
print(score)
print(metrics.classification_report(tar_te,te_pr))
# auc
y_pre_proba = dtr.predict_proba(data_te)
a = y_pre_proba[:,1]
auc_re = metrics.roc_auc_score(tar_te,a)
# auc绘图
fpr,tpr,thre = roc_curve(tar_te,a)
plt.figure()
plt.plot(fpr,tpr,color='darkorange',lw=2,label=f'ROC curve(area={round(auc_re,2)}')
plt.plot([0,1],[0,1],color='navy',lw=2,linestyle='--')
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend()
plt.show()
# 决策树
from sklearn.tree import plot_tree
fig,ax = plt.subplots(figsize=(8,8))
plot_tree(dtr,filled=True,ax=ax)
plt.show()
运行结果: