一、决策树原理
(1)决策树概念:
分为分类决策树和回归决策树。分类决策树应用范围比较广,其核心思想就是在一个数据集上找到一个最优的特征,然后从这个特征的选值中找到一个最优的候选值,根据这个最优候选值将数据集划分为两个子数据集,然后递归上述操作,直到满足指定条件为止。
(2)决策树结构:

(3)熵:
概念:随机变量不确定性的度量,也就是熵越大,则随机变量的不确定性越大。即,物体内部的混乱程度,熵越大,越混乱。
公式:H(X)=−∑Pi×log(Pi),i=1,2,...,nH\left ( X \right )=-\sum P_{i}\times log\left ( P_{i} \right ),i=1,2,...,nH(X)=−∑Pi×log(Pi),i=1,2,...,n
(4)信息增益:
概念:表示由于得知特征A的信息后数据集D的分类不确定性减少(熵值下降)程度。
公式:Gain(D,A)=H(D)−H(D∣A)Gain\left ( D,A \right )=H\left ( D \right )-H\left ( D\right |A)Gain(D,A)=H(D)−H(D∣A)
(5)决策树算法
(i)ID3:使用信息增益判断,如下文案例所示。
Gain(D,A)=H(D)−H(D∣A)Gain\left ( D,A \right )=H\left ( D \right )-H\left ( D\right |A)Gain(D,A)=H(D)−H(D∣A)
(ii)C4.5:使用信息增益率判断,我们知道信息增益会偏向取值较多的特征,使用信息增益比可以对这一问题进行校正。(目前主流算法)
GainRatio(D,A)=Gain(D,A)H(D)=H(D)−H(D∣A)H(D)GainRatio \left ( D,A \right )=\frac{Gain\left ( D,A \right )}{H\left ( D \right )}=\frac{H\left ( D \right )-H\left ( D\right |A)}{H\left ( D \right )}GainRatio(D,A)=H(D)Gain(D,A)=H(D)H(D)−H(D∣A)
(iii)CART:使用基尼系数判断。
Gain(p)=∑Kk=1pk(1−pk)=1−∑Kk=1p2kGain\left ( p \right )=\sum_{K}^{k=1}p_{k}\left ( 1-p_{k} \right )=1-\sum_{K}^{k=1}p_{2}^{k}Gain(p)=K∑k=1pk(1−pk)=1−K∑k=1p2k
ID3决策树算法案例:
下表是小迪14天打球情况,共有4种环境变化,我们的目标是构造决策树:

我们首先遇到的问题便是,哪一个特征用来当根节点?下图是4个特征分别被当作根节点的情况:

我们选着根节点的依据就是信息增益,下面分别计算历史信息增益和4个特征分别被当作根节点时候的信息增益:
第一步:计算历史数据的熵值
熵值=−914×log(914)−514×log(514)=0.940熵值=-\frac{9}{14}\times log\left ( \frac{9}{14} \right )-\frac{5}{14}\times log\left ( \frac{5}{14} \right )=0.940熵值=−149×log(149)−145×log(145)=0.940
第二步:计算4个特征分别被当作根节点时候的信息增益
(1)基于天气的划分:
(i)outlook = sunny:
熵值=−25×log(25)−35×log(35)=0.971熵值=-\frac{2}{5}\times log\left ( \frac{2}{5} \right )-\frac{3}{5}\times log\left ( \frac{3}{5} \right )=0.971熵值=−52×log(52)−53×log(53)=0.971
(ii)outlook = overcast:
熵值=−44×log(44)=0熵值=-\frac{4}{4}\times log\left ( \frac{4}{4} \right )=0熵值=−44×log(44)=0
(iii)outlook = rainy:
熵值=−35×log(35)−25×log(25)=0.971熵值=-\frac{3}{5}\times log\left ( \frac{3}{5} \right )-\frac{2}{5}\times log\left ( \frac{2}{5} \right )=0.971熵值=−53×log(53)−52×log(52)=0.971
(iv)3种情况加权:
514×0.971+414×0+514×0.971=0.693\frac{5}{14}\times 0.971+\frac{4}{14}\times0+\frac{5}{14}\times 0.971=0.693145×0.971+144×0+145×0.971=0.693
(v)信息增益:
0.940−0.693=0.247 0.940-0.693=0.2470.940−0.693=0.247
2.基于温度的划分:信息增益=0.029
3.基于湿度的划分:信息增益=0.152
4.基于有风的划分:信息增益=0.048
因此,outlook就是我们要找的根节点。
第三步:按找这个思路我们可以把决策树构建完整,继续选择第二个、第三个、第四个节点。
(6)预剪枝与后剪枝:(防止过拟合)

预剪枝: 使用不同指标(如树深度、叶子节点个数、叶子节点样本数、信息增益量等)限制树模型复杂程度,边建立模型边剪枝。
后剪枝: 后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。相比于预剪枝,后剪枝更常用,因为在预剪枝中精确地估计何时停止树增长很困难。
二、决策树案例
#导入库
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")#忽略警告
%matplotlib inline
#导入数据
%%time
from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)
housing.data.shape

(1)树模型可视化
#基础模型构建,仅使用两个特征,最大树深度为2
from sklearn import tree
model = tree.DecisionTreeRegressor(max_depth = 2)
model.fit(housing.data[:,[6,7]],housing.target)
dot_data = tree.export_graphviz(model,out_file = None,feature_names = housing.feature_names[6:8],filled = True,impurity = False,rounded = True)
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')
from IPython.display import Image
Image(graph.create_png())
graph.write_png('model_white_background.png')

(2)基础模型
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
X_train,X_test,y_train,y_test = train_test_split(housing.data,housing.target,test_size = 0.1,random_state = 42)
%%time
dtr = tree.DecisionTreeRegressor(random_state = 42)
dtr.fit(X_train,y_train)
print('Score:',dtr.score(X_test,y_test))

%%time
rf = RandomForestRegressor(random_state = 42)
rf.fit(X_train,y_train)
print('Score:',rf.score(X_test,y_test))

(3)模型调参
parameters = {'min_samples_split':list((3,6,9)),'n_estimators':list((10,50,100))}
%%time
grid = GridSearchCV(rf,param_grid = parameters,cv = 5)
grid.fit(X_train,y_train)
means = grid.cv_results_['mean_test_score']
stds = grid.cv_results_['std_test_score']
params = grid.cv_results_['params']
for mean,std,param in zip(means,stds,params):
print("mean:%f ,std:%f ,param:%r" % (mean,std,param))
print("*******************************************************************")
print('Best param: {} using {}'.format(grid.best_score_, grid.best_params_))
print("*******************************************************************")

#调参最优模型
%%time
rf = RandomForestRegressor(min_samples_split = 3, n_estimators = 100,random_state = 42)
rf.fit(X_train,y_train)
print('Score:',rf.score(X_test,y_test))

#特征重要性排序
pd.Series(rf.feature_importances_, index = housing.feature_names).sort_values(ascending = False)

三、决策树总结
优点:
(1)速度快: 计算量相对较小, 且容易转化成分类规则. 只要沿着树根向下一直走到叶, 沿途的分裂条件就能够唯一确定一条分类的谓词.
(2)准确性高: 挖掘出来的分类规则准确性高, 便于理解, 决策树可以清晰的显示哪些字段比较重要, 即可以生成可以理解的规则.
(3)可以处理连续和种类字段
(4)不需要任何领域知识和参数假设
(5)适合高维数据
缺点:
(1)对于各类别样本数量不一致的数据, 信息增益偏向于那些更多数值的特征
(2)容易过拟合
(3)忽略属性之间的相关性
本文深入探讨了决策树的基本原理,包括分类决策树的概念、决策树结构、熵和信息增益的概念及其计算公式。详细介绍了ID3、C4.5和CART三种决策树算法,并通过案例分析了如何选择根节点。同时,提到了决策树的预剪枝和后剪枝策略,以防止过拟合。最后,总结了决策树的优势和局限性。
决策树&spm=1001.2101.3001.5002&articleId=104651111&d=1&t=3&u=68b5414a63be49928d17f49329a56a6b)
5134

被折叠的 条评论
为什么被折叠?



