决策树:从根节点开始一步步走到叶子节点
所有的数据最终都会落到叶子节点,既可以做分类也可以做回归
从根结点到每个叶结点的路径对应了一个判定测试序列
叶子节点:最终的决策结果
增加节点:相当于在数据中切一刀
(每个内部节点表示在一个属性上的测试
每个分枝代表一个测试输出)
训练阶段:从给定的数据集构造出一棵树
决策树的生成由两个阶段组成
1.使用属性选择度量来选择 将元组最好的划分为不同的类 的属性,递归的通过选定的属性,来划分样本
2.决策树建立时,许多分枝反映的是训练数据中的噪声和离群点,树剪枝试图识别并剪去这种分枝,以提高对未知数据分类的准确性
测试阶段:根据构造出来的树模型从上到下走一遍就好了
熵:随机变量不确定性的度量 混乱程度
栗子:A【1,1,1,1,2】
B【1,1,2,2,3】
显然A集合熵值要低,A里面只有两种类别
常用的属性选择度量
• Gini指数
Gini(s)越接近0, s中元素越同质
• 信息增益(增益率)
信息增益:特征X使得类Y的不确定性减少的程度
依据信息增益依次选择根结点
为什么要剪枝:决策树过拟合风险很大,理论上可以完全分得开数据(防止分类中的过分适应)
剪枝策略:预剪枝,后剪枝
预剪枝:边建立决策树边进行剪枝的操作(限制深度,叶子节点个数叶子节点样本数,信息增益量等)
后剪枝:当建立完决策树后来进行剪枝操作(通过一定的衡量标准)
估算类别概率
tree_clf.predict_proba()
tree_clf.predict()
决策树的建立
•选取最优的特征(最大信息)作为根节点, 并进行划分
•划分之后, 在每个子集上选择最优的特征作 为子树的根节点
•递归上述过程, 直到剩余子集同质或几乎同质
CART训练算法
首先,使用单个特征 K 和阈值 t[k]
J( k,t[k] ) = m[left]/mG[left] + m[right]/mG[right]
m[left][right] 左右子集的实例数量
G[left][right]左右子集的不纯度
一旦成功将训练集一分为二,它将使用相同的逻辑,继续分裂子集,然后是子集的子集,依次循环递进。直到抵达最大深度(由超参数max_depth控制)
•非数值型特征
•基于该特征上分量的基数k划分为k个子 集(子节点)
•数值型特征
•划分为2个子集(子节点)
•划分位置通过GINI_SPLIT或GAIN选择
计算复杂度
进行预测需要从根到叶遍历决策树。通常来说,决策树大致平衡,因此遍历决策树需要经历大约O( log2(m) )
正则化超参数
DecisionTreeClassifier 类还有一些其他的参数,同样可以限制决策树的形状:
min_samples_split (分裂前节点必须有的最小样本数)
min_samples_leaf(叶节点必须有的最小样本数量)
max_leaf_nodes(最大叶节点数量)
max_features(分裂每个节点评估的最大特征数量)
from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)
构建决策树模型:
from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth = 2)
dtr.fit(housing.data[:,[6,7]],housing.target) fit(X,Y)
from sklearn.model_selection import train_test_split
data_train,data_test,target_train,target_test = \
train_test_split(housing.data,housing.target,test_size=0.1,random_state=42)
dtr.fit(data_train,target_train)
dtr.score(data_test,target_train)
随机森林模型调用:
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor( random_state = 42 )
rfr.fit(data_train,target_train) #训练
rfr.score(data_test,target_test) #测试
#要可视化展示 首先需要安装 graphviz以及pydotplus #pip install pydotplus
dot_data = tree.export_graphviz(
dtr,
out_file =None,
feature_names = housing.feature_names[6:8],
filles = Ture,
impurity = False,
rounded = True
)
import pydotplus
graph = pydotplus.graph_from_data(dot_data)
graph = get_nodes()[7].set_fillcolor("#FFF2DD")
from IPython.display import Image
Image( graph.create_png() )
参数的选择
from sklearn.grid_search import GridSearchCV
tree_param_grid ={'min_samples_split':list((3,6,9)),'n_estimators':list((10,50,100))}
grid = GridSearchCV(RandomForestRegressor(),param_grid=tree_param_grid,cv=5)
grid.fit(data_train,target_train)
grid.grid_scores_,grid.best_params_,grid.best_score_
可视化:
需要安装graphivz软件
import pydotplus
import os
import graphviz
from IPython.display import Image
from sklearn import tree
os.environ["PATH"] += os.pathsep + 'D://bin//' #用于graphviz设置系统路径
dot_data = tree.export_graphviz(re, out_file=None, #re为构造的决策树模型
feature_names=[' ',' ',' '], #特征标签
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('example.png') #保存图像
Image(graph.create_png())