机器学习入门-决策树算法

摘要:
决策树:从根节点到叶节点,一步一步地,所有数据最终落入叶节点,可以用于分类,也可以用于回归树的组成:1。根节点2。非样式节点和分支:中间过程3。子叶节。一些连续变量的最终决策结果通常采用一刀切的方法。

决策树:从根节点开始一步步到叶子节点,所有的数据最后都落到叶子节点里面,既可以用来做分类也可以用来做回归

树的组成: 1.根节点(第一个参数)

                   2.非子叶节点与分支: 中间过程

                   3. 子叶节点,最终的决策结果

机器学习入门-决策树算法第1张

对于一些连续的变量来说,通常使用一刀切的方式。

决策树的训练与测试

              训练阶段通过构造一棵树,即选择特征作为这一层的判断

              测试:根据构造出来的树结构,将测试数据从上到下走一遍

决策树特征选择的衡量标准

          对每一个特征把数据分开后,求一个熵值,熵值越大,表示当前叶子节点的混乱度越高

         熵值的公式: -∑p*logp   p表示的是概率

         不确定性越高,熵值越大,物体概率为0和1时,熵值最小,当物体的概率为0.5时,熵值越大

         在ID3中,使用信息增益,即没经过特征删选前的熵和经过特征删选后的熵之差,即不确定性的降低(两熵之差)

对于熵求解和信息增益的实例

下面使用了4个特征,判断的结果是是否去打球

机器学习入门-决策树算法第2张机器学习入门-决策树算法第3张

上述以天气特征做一个说明:

没有根据特征进行区分的时候,所有样本都在一个叶子节点中,根据计算公式:熵 =  -9/14*log9/14 - 5/14*log5/14 = 0.940

使用天气进行特征分离时,有sunny, overcast, rainy,根据特征的类别分成3个叶子节点

第一个叶子节点的标签为 2个yes, 3个no  熵 = -2/5*log(2/5) - 3/5*log(3/5)  = 0.971

第二个叶子节点的标签为4个yes  熵 = -5/5 * log(5/5) = 0 

第三个叶子节点的标签为3个yes, 2个no  熵 = -3/5*log3/5 - 2/5*log2/5 = 0.971

总的熵为: 5/14 * 0.971 + 4/14*0 + 5/14 * 0.971  = 0.693

信息增益 = 0.940 - 0.639 = 0.247 

通过相同的方法,求得其他特征所获得的信息增益,来判断哪一个特征作为叶子节点的判别特征

信息增益率: C4.5 

对于像ID这样的特征,可以把每一个样本都进行分开,因为单独的样本,信息熵是等于0,但是明显的ID特征不具有判别性,因此引入了信息增益率

即 在原来的基础上除于叶子节点的个数, 即 假如id有3个, 那么此时的熵 = (-1/3log1/3) * 1/3 * 3 , 此时的熵值还是很大的,这样id特征就会被弃用

CART: 使用gini系数来作为衡量标准, GINI = 1 - ∑p^2 p表示概率,概率越小,熵值越大

对于连续的特征,我们该如何选择分界点,这里我们使用贪心算法,将每种可能性都试一遍,首先将特征进行排序,比如身高特征:60, 75, 80, 85, 90, 95, 100, 120, 125, 220, 如果进行二分,这里有9个分界点,选择一个能将数据尽量分开的分界点,即熵值最小的分界点

决策树的剪枝策略,、

                  目的: 为了防止由于决策树过大,而导致的过拟合的风险

                  剪枝策略: 预剪枝 , 后剪枝

                 预剪枝:边建立决策树边进行剪枝操作(更实用)  控制树的深度, 叶子节点的个数,叶子节点的样本数,信息增益量

                 后剪枝: 通过一定的衡量标准

                                            损失函数:Ca(T) = C(T) + a(Teaf)    C(T)表示gini系数*样本数, a表示惩罚因子, Teaf表示叶子节点的个数,叶子节点越多,惩罚的越多,损失函数越大

机器学习入门-决策树算法第4张

sklearn决策树中所涉及的参数

1.criterion gini or entropy  使用gini系数还是使用熵

2.splitter best or random 前者是所有特征找到最好的切分点,后者是随机特征,这样在特征多的时候,降低运行速度

3.max_features None(所有) 当样本的特征量小于50时,使用所有的

4.max_depth  表示最大的树深度

5.min_samples_split  叶子节点最小的样本数,当小于这个值时就不进行分割

6.min_samples_leaf  如果某叶子节点的个数小于样本数,那么该叶子节点和兄弟节点将被一起剪枝

7.min_weight_fraction_leaf  叶子节点所有样本权重和的最小值,如果样本的分布类型偏差很大就会引入这个值

8.max_leaf_nodes 限制最大叶子节点数

9.class_weight 指定样本各类别的权重,主要防止训练集某些类型的样本过多导致训练的决策树过于偏向这些类别

10.min_impurity_split 这个值限制了决策树的增长,比如信息增益,基尼系数小于阈值就停止增长

代码:

1.选择max_depth进行树的可视化展示

2.进行决策树代码的实例化

3.使用GridSeach网格搜索进行参数的选择

4. 根据rfr.feature_importances_ 得分特征的重要性比例

# 1 决策树的可视化展示
from sklearn import tree
from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()


dtr = tree.DecisionTreeRegressor(max_depth=2)
dtr.fit(housing[:, [6, 7]], housing.target)

dot_data = 
          tree.export_graphviz(
              dtr,
              out_file = None,
              feature_names=housing.feature_name[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())

# 2.决策树使用实例
# from sklearn import tree
from sklearn.cross_validation import train_test_split
#
# # 数据拆分
train_x, test_x, train_y, test_y = train_test_split(housing.data, housing.target, test_size=0.1, random_state=42)
# 建立决策树
dtr = tree.DecisionTreeRegressor(random_state=42)
# 训练数据
dtr.fit(train_x, train_y)
# 打印出dtr得分, 这里的得分表示的是准确率
print(dtr.score(test_x, test_y))

# 3. 使用GridSearch进行组合参数选择

from sklearn.grid_search import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets.california_housing import fetch_california_housing

# 载入数据
housing = fetch_california_housing()
# 列出参数列表
tree_grid_parameter = {'min_samples_split':list((3, 6, 9)), 'n_estimators':list((10, 50, 100))}
# 进行参数的搜索组合
grid = GridSearchCV(RandomForestRegressor(), param_grid=tree_grid_parameter, cv=3)
grid.fit(train_x, train_y)
print(grid.grid_scores_) # 打印得分
print(grid.best_params_) # 打印最好的参数组合
print(grid.best_score_)  # 打印最好的得分

# 4. 显示出随机森林特征的重要性,并做条形图
import pandas as pd
import matplotlib.pyplot as plt


rfr = RandomForestRegressor(min_samples_split=6, n_estimators=100)
rfr.fit(train_x, train_y)
print(rfr.score(test_x, test_y))
# 使用pd.Series进行组合,值是特征重要性的值,index是样本特征
feature_important = pd.Series(rfr.feature_importances_, index = housing.feature_names).sort_values(ascending=False)
figure = plt.figure(figsize=(8, 6))
plt.bar(feature_important.index, feature_important.data)
plt.show()

特征重要性图

机器学习入门-决策树算法第5张

免责声明:文章转载自《机器学习入门-决策树算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 多线程批量传文件Linux加固下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深入浅出计算机组成原理学习笔记:第三十一讲

一、引子 上一讲,我带你一起看了三维图形在计算机里的渲染过程。这个渲染过程,分成了顶点处理、图元处理、栅格化、片段处理,以及最后的像素操作。这一连串的过程, 也被称之为图形流水线或者渲染管线。 因为要实时计算渲染的像素特别地多,图形加速卡登上了历史的舞台。通过3dFx的Voodoo或者NVidia的TNT这样的图形加速卡,CPU就不需要再去处理一个个像素点...

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考《机器学习实战》这本书...

提高机器学习模型准确率的八大方法

原文连接:http://www.techweb.com.cn/network/system/2016-01-27/2269274.shtml 此文仅是一个小品文,详细理论请读论文,参考书籍。 前言:我的概述 机器学习面对的是一个受限有穷空间 到 一个扩大的有穷空间 的泛化问题。若假设空间足以覆盖真实的数据空间,机器学习方法可以弃之不用,专家的人工归纳可以...

spark 特征选择、特征预处理:提取/转换/选择 缺失值 sparkMllib

数据预处理与特征工程 缺失值处理 缺失值处理通常有如下的方法: 对于unknown值数量较少的变量,包括job和marital,删除这些变量是缺失值(unknown)的行; 如果预计该变量对于学习模型效果影响不大,可以对unknown值赋众数,这里认为变量都对学习模型有较大影响,不采取此法; 可以使用数据完整的行作为训练集,以此来预测缺失值,变量hous...

gensim学习笔记

1、词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型   在Gensim中实现word2vec模型非常简单。首先,我们需要将原始的训练语料转化成一个sentence的迭代器;每一次迭代返回的sentence是一个word(utf8格式)的列表: class MySentences(object): def __init__...

在Mac OSX EI Capitan下安装xgboost的吐血经历

官网上mac的安装并不复杂,但是实际操作下来有够吐血的,试了n多方法折腾到凌晨一点。。。。。。 在此详细记录一下以帮助其他踩坑的同学。 前情回顾: 为啥要安装gcc?为了xgboost能够多线程。。。好吧其实我本意并不在此,主要是最简单的单线程我都安装失败了!!就两步简单的操作为什么会失败呢我也不想的啊。。。。。。但是没有关于失败处理的博客,博客都是关于多...