《机器学习实战》个人学习记录笔记(六)———Sklearn决策树预测隐形眼镜类型

原创 2018年04月15日 23:55:32

第三章 决策树

PS:个人笔记 根据《机器学习实战》这本书,Jack-Cui的博客,以及深度眸的视频进行学习

1 使用Sklearn构建决策树

使用的是DecisionTreeClassifierexport_graphviz,前者用于决策树构建,后者用于决策树可视化。


2 DecisionTreeClassifier构建决策树

criterion:特征选择标准,可选参数,默认是gini,可以设置为entropy。gini是基尼不纯度,是将来自集合的某种结果随机应用于某一数据项的预期误差率,是一种基于统计的思想。entropy是香农熵,也就是上篇文章讲过的内容,是一种基于信息论的思想。Sklearn把gini设为默认参数,应该也是做了相应的斟酌的,精度也许更高些?ID3算法使用的是entropy,CART算法使用的则是gini。

splitter:特征划分点选择标准,可选参数,默认是best,可以设置为random。每个结点的选择策略。best参数是根据算法选择最佳的切分特征,例如gini、entropy。random随机的在部分划分点中找局部最优的划分点。默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random”。

max_features:划分时考虑的最大特征数,可选参数,默认是None。寻找最佳切分时考虑的最大特征数(n_features为总共的特征数),有如下6种情况: 
如果max_features是整型的数,则考虑max_features个特征;
如果max_features是浮点型的数,则考虑int(max_features * n_features)个特征;
如果max_features设为auto,那么max_features = sqrt(n_features);
如果max_features设为sqrt,那么max_featrues = sqrt(n_features),跟auto一样;
如果max_features设为log2,那么max_features = log2(n_features);
如果max_features设为None,那么max_features = n_features,也就是所有特征都用。

一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

max_depth:决策树最大深,可选参数,默认是None。这个参数是这是树的层数的。层数的概念就是,比如在贷款的例子中,决策树的层数是2层。如果这个参数设置为None,那么决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。或者如果设置了min_samples_slipt参数,那么直到少于min_smaples_split个样本为止。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

min_samples_split:内部节点再划分所需最小样本数,可选参数,默认是2。这个值限制了子树继续划分的条件。如果min_samples_split为整数,那么在切分内部结点的时候,min_samples_split作为最小的样本数,也就是说,如果样本已经少于min_samples_split个样本,则停止继续切分。如果min_samples_split为浮点数,那么min_samples_split就是一个百分比,ceil(min_samples_split * n_samples),数是向上取整的。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

min_weight_fraction_leaf:叶子节点最小的样本权重和,可选参数,默认是0。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

max_leaf_nodes:最大叶子节点数,可选参数,默认是None。通过限制最大叶子节点数,可以防止过拟合。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

class_weight类别权重,可选参数,默认是None,也可以字典、字典列表、balanced。指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。类别的权重可以通过{class_label:weight}这样的格式给出,这里可以自己指定各个样本的权重,或者用balanced,如果使用balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的None。

random_state:可选参数,默认是None。随机数种子。如果是证书,那么random_state会作为随机数生成器的随机数种子。随机数种子,如果没有设置随机数,随机出来的数与当前系统时间有关,每个时刻都是不同的。如果设置了随机数种子,那么相同随机数种子,不同时刻产生的随机数也是相同的。如果是RandomState instance,那么random_state是随机数生成器。如果为None,则随机数生成器使用np.random。

min_impurity_split:节点划分最小不纯度,可选参数,默认是1e-7。这是个阈值,这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

presort:数据是否预排序,可选参数,默认为False,这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。


3 代码部分

因为在fit()函数不能接收string类型的数据,在使用fit()函数之前,我们需要对数据集进行编码,这里可以使用两种方法:

  • LabelEncoder将字符串转换为增量值(本文所使用方法)
  • OneHotEncoder:使用One-of-K算法将字符串转换为整数
import pandas as pd

if __name__ == '__main__':
    with open('lenses.txt', 'r') as fr:                                       #打开文件,只读模式
        lenses = [inst.strip().split('\t') for inst in fr.readlines()]        #一行一行读取,删除空白,然后分隔
    lenses_target = []                                                        #数据类别的保存列表
    for each in lenses:
        lenses_target.append(each[-1])                                        #列表最后一个是类别

    lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']             #特征标签       
    lenses_list = []                                                          #保存lenses数据的临时列表
    lenses_dict = {}                                                          #保存lenses数据的字典,用于生成pandas
    for each_label in lensesLabels:                                           #提取信息,生成字典 ;首先是age
        for each in lenses:                                                   #对每个样本遍历
            lenses_list.append(each[lensesLabels.index(each_label)])          #这里就是lense_list.append(0),0是age对应的索引值,所以遍历后就将每个age传入临时列表
        lenses_dict[each_label] = lenses_list                                 #这里将临时列表转化为字典,为后面的pandas处理
        lenses_list = []                                                      #将临时列表里面的数据清空,用于保存下一特征的临时数据
    print(lenses_dict)                                                        #打印字典信息
    lenses_pd = pd.DataFrame(lenses_dict)                                     #生成pandas.DataFrame,因为fit()函数不能接受string数据,所以用到pandas
    print(lenses_pd)   

  接下来,将数据序列化,编写代码如下:

import pandas as pd
from sklearn.preprocessing import LabelEncoder               #⭐LabelEncoder可以将标签分配一个0—n_classes-1之间的编码 

if __name__ == '__main__':
    with open('lenses.txt', 'r') as fr:                                       
        lenses = [inst.strip().split('\t') for inst in fr.readlines()]     
    lenses_target = []                                                  
    for each in lenses:
        lenses_target.append(each[-1])

    lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']          
    lenses_list = []                                                   
    lenses_dict = {}                                                     
    for each_label in lensesLabels:                                         
        for each in lenses:
            lenses_list.append(each[lensesLabels.index(each_label)])
        lenses_dict[each_label] = lenses_list
        lenses_list = []                                               
    lenses_pd = pd.DataFrame(lenses_dict)                                 
    print(lenses_pd)                                                   
    le = LabelEncoder()                                                      #创建LabelEncoder()对象,用于序列化            
    for col in lenses_pd.columns:                                            #为每一列序列化,列特征
        lenses_pd[col] = le.fit_transform(lenses_pd[col])                    #⭐fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式
    print(lenses_pd)   


4 使用Graphviz可视化决策树(补)



《机器学习实战》学习笔记:绘制树形图&使用决策树预测隐形眼镜类型

上一节实现了决策树,但只是使用包含树结构信息的嵌套字典来实现,其表示形式较难理解,显然,绘制直观的二叉树图是十分必要的。Python没有提供自带的绘制树工具,需要自己编写函数,结合Matplotlib...
  • liyuefeilong
  • liyuefeilong
  • 2015年09月06日 17:04
  • 3190

【10月31日】机器学习实战(二)决策树:隐形眼镜数据集

决策树的优点:计算的复杂度不高,输出的结果易于理解,对中间值的确实不敏感,可以处理不相关的特征数据 决策树的缺点:可能会产生过度匹配的问题。 其本质的思想是通过寻找区分度最好的特征(属性),用于支持分...
  • Moon_treee
  • Moon_treee
  • 2017年10月31日 20:50
  • 395

Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜

上篇文章讲述了机器学习决策树的原理,以及如何选择最优特征作为分类特征。本篇文章将在此基础上进行介绍。主要内容包括:决策树构建、决策树可视化、使用决策树进行分类预测、决策树的存储和读取、sklearn实...
  • c406495762
  • c406495762
  • 2017年07月28日 15:30
  • 9756

使用决策树预测隐形眼镜类型

步骤 收集数据:提供的文本文件。 准备数据:解析tab键分隔的数据行。 分析数据:快速检查数据,确保正确的解析数据内容,使用createPlot()函数绘制最终的树形图。 训练算法:使用上节的crea...
  • u012150360
  • u012150360
  • 2017年06月16日 17:26
  • 526

[机器学习算法详解]决策树——以隐形眼镜分类问题为例

[机器学习算法详解]决策树——以隐形眼镜分类问题为例
  • sinat_26376671
  • sinat_26376671
  • 2015年03月24日 20:58
  • 1177

学习笔记:用决策树预测隐形眼镜类型

# -*- coding: UTF-8 -*- from math import log import operator import matplotlib.pyplot as plt def ca...
  • zz490396674
  • zz490396674
  • 2016年07月09日 17:45
  • 1091

Python3:《机器学习实战》之决策树算法(3)预测隐形眼镜类型

Python3:《机器学习实战》之决策树算法(3)预测隐形眼镜类型 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com...
  • u011475210
  • u011475210
  • 2017年09月03日 22:01
  • 4068

机器学习实战------决策树

3.1决策树的构造 3.1.1信息增益 面对机器学习boss二代目——决策树,大多人应该不陌生,决策树的一些基本概念就不表了,下面直接贴上计算数据集的香农熵的代码: from math im...
  • coolerzZ
  • coolerzZ
  • 2018年01月22日 16:01
  • 91

《机器学习实战》学习(二)——决策树(DT)

1、决策树简述决策树学习是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树。在周志华老师的《机器学习》这本书中专门一章节对决策树进行了讲述。并对id3算法后的改进算法也做了相应...
  • lixianjun913
  • lixianjun913
  • 2016年09月11日 21:57
  • 880

使用sklearn包构建二元决策树预测红酒口感

前面用惩罚线性回归模型构建过红酒口感预测模型,探索对红酒口感贡献最大属性排行,这里使用sklearn包的二元决策树来解决这个问题...
  • Joliph
  • Joliph
  • 2017年10月04日 16:35
  • 177
收藏助手
不良信息举报
您举报文章:《机器学习实战》个人学习记录笔记(六)———Sklearn决策树预测隐形眼镜类型
举报原因:
原因补充:

(最多只允许输入30个字)