机器学习3决策树算法及其可视化

决策树:从根节点开始一步步走到叶子节点
所有的数据最终都会落到叶子节点,既可以做分类也可以做回归
从根结点到每个叶结点的路径对应了一个判定测试序列
在这里插入图片描述
叶子节点:最终的决策结果
增加节点:相当于在数据中切一刀
(每个内部节点表示在一个属性上的测试
每个分枝代表一个测试输出)

训练阶段:从给定的数据集构造出一棵树
决策树的生成由两个阶段组成
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())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章