• A--Scikit-Learn 实现决策树


     

    选择模型类

    在Scikit-Learn中分类树算法都保存在tree模块中,具体算法所属类为DecisionTreeClassifier

    In [1]:
    from sklearn.tree import DecisionTreeClassifier
    In [2]:
    DecisionTreeClassifier? #查看方法参数和输出属性
    部分算法参数说明:
     

    参数 | 解释

    criterion:切分指数选择,即不纯度的衡量标准,除了默认的'gini'指数外还可输入信息熵‘entropy’用以计算信息增益

    splitter :切分策略,默认是以不纯度衡量指标下降最快作为切分依据进行切分,即‘best’

    max_depth:选择树的最大深度,如果对其进行设置,实际上相当于强行设置收敛条件(即树伸展几层),默认为None,即伸展至所有叶节点只 含有min_samples_split个数为止

    min_samples_split:叶节点进行进一步切分时所需最少样本量,默认值为2,低于该值则不会再进行切分

    min_samples_leaf: 叶节点最小样本量,默认值为1,若小于该数量,则会进行剪枝

     

    部分属性说明:

     

    属性 解释

    classes_ :数据集标签列列名称

    feature importances :特征重要性排名

    features :特征个数

     

    选择模型超参数

    可考虑强化收敛条件、修改不纯度衡量方法等,当然也可使⽤用默认超参数设置,直接进行实 例化操作

    In [3]:
    clf = DecisionTreeClassifier()
    Scikit-Learn本身也提供了一个保存数据集的模块,在sklearn.datasets中也可调用sklearn内置的鸢尾花数据集
    In [4]:
    from sklearn.datasets import load_iris
    iris = load_iris()
    In [5]:
    iris.data#查看数据特征列
     . .
    In [6]:
    iris.target#查看数据标签列
    Out[6]:
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
     

    数据集切割

    sk-learn的切分数据集函数在model_selection类中。同时需要注意的 是,由于模型需要数组,因此训练集和测试集的特征数据和标签数据仍然需要分开存放

    In [7]:
    from sklearn.model_selection import train_test_split
    xtrain, xtest, ytrain, ytest = train_test_split(iris.data, iris.target,
    random_state=42)
    同时 random_state=42 用于设置随机数种⼦子,可考虑输入 test_size 等参数用于设置数据集

    切分比例,若不对其进行设置,则默认进行3:1的训练集和测试集的比例划分。更多参数设置参 见train_test_split函数相关⽅方法说明

     

    训练模型

    In [8]:
    clf.fit(xtrain, ytrain)
    score = clf.score(xtest, ytest)#返回预测准确度
    score
    Out[8]:
    1.0
     

    我们可以使利利用 Graphviz 模块导出决策树模型,第⼀次使用 Graphviz 之前需要对其

    进行安装,若是使用conda进行的Python包管理,则可直接在命令行界面中利用下述指令进行安 装 conda install python-graphviz

    In [9]:
    from sklearn import tree
    import graphviz

    将模型利用export_graphviz生成为DOT类型对象,该对象是专门用于绘制图形绘制的对

    象,在其中可对图形进行⼀系列的设置,包括标签格式、决策树着色等,更多方法可在帮助文档 中进行查看,然后将其进一步转化为可生成图形的对象graph,该对象可直接用于展示图形

    In [11]:
    dot_data = tree.export_graphviz(clf, out_file=None)
    graphviz.Source(dot_data)

    最终利用render方法生成图形,该方法中要求输入文件路路径、地址等参数,然后将图形对象保存

    为制定路路径、名称的PDF格式⽂文件

    In [24]:
    graph = graphviz.Source(dot_data)
    graph.render("iris")
    Out[24]:
    'iris.pdf'
    In [12]:
    #美化图形
    dot_data = tree.export_graphviz(clf, out_file=None,
    feature_names=['sepal length', 'sepalwidth', 'petal length', 'petal width'],#各变量名称
    class_names=['setosa', 'versicolor','virginica'],#类别名称
    filled=True,#让树的每一块有颜色,颜色越浅,表示不纯度越高
    rounded=True,#树的块的形状
    special_characters=True)
    graphviz.Source(dot_data)

     
    分类过程为二分类,且以基尼指数为切分标准,同时特征当中的petal width对分类作用明显
    In [13]:
    clf.feature_importances_#各个特征列的重要程度
    Out[13]:
    array([0.        , 0.01787567, 0.89974604, 0.08237829])
    In [14]:
    [*zip(['sepal length', 'sepalwidth', 'petal length', 'petal width'],clf.feature_importances_)]
    Out[14]:
    [('sepal length', 0.0),
     ('sepalwidth', 0.017875668342510573),
     ('petal length', 0.8997460415815836),
     ('petal width', 0.08237829007590591)]
    In [15]:
    classes_ :数据集标签列列名称
    ​
    feature _ importances _:特征重要性排名
    
    n _ features _:特征个数

    In [ ]:

    clf.classes_

    Out[8]:

    array([0, 1, 2])
     

    模型预测

    In [16]:
    y_clf = clf.predict(xtest)
    In [17]:
    y_clf
    Out[17]:
    array([1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2,
           0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0])
     

    模型评估

    In [51]:
    #准确率评估
    from sklearn.metrics import accuracy_score
    accuracy_score(ytest, y_clf)
    Out[51]:
    1.0
     

    所有函数显示

    In [53]:
    from sklearn.tree import DecisionTreeClassifier#导入模型
    clf = DecisionTreeClassifier(criterion="entropy",random_state=30)#进行便利,注意这次我们调整了参数
    from sklearn.model_selection import train_test_split
    xtrain, xtest, ytrain, ytest = train_test_split(iris.data, iris.target,random_state=42)#训练集与测试集合分割
    clf.fit(xtrain, ytrain)#训练模型
    score = clf.score(xtest, ytest)#返回预测准确度
    score
    Out[53]:
    0.9736842105263158
    In [54]:
    #美化图形
    dot_data = tree.export_graphviz(clf, out_file=None,
    feature_names=['sepal length', 'sepalwidth', 'petal length', 'petal width'],#各变量名称
    class_names=['setosa', 'versicolor','virginica'],#类别名称
    filled=True,#让树的每一块有颜色,颜色越浅,表示不纯度越高
    rounded=True,#树的块的形状
    special_characters=True)
    graphviz.Source(dot_data)
    #保存决策树图像
    graph = graphviz.Source(dot_data)
    graph.render("iris")
    In [55]:
    c
    lf.feature_importances_#各个特征列的重要程度
    [*zip(['sepal length', 'sepalwidth', 'petal length', 'petal width'],clf.feature_importances_)]

    Out[55]:

    [('sepal length', 0.0),
     ('sepalwidth', 0.04843665046047095),
     ('petal length', 0.3254214588163632),
     ('petal width', 0.6261418907231658)]
    In [56]:
    y_clf = clf.predict(xtest)#模型预测
    In [57]:
    #准确率评估
    from sklearn.metrics import accuracy_score
    accuracy_score(ytest, y_clf)
    Out[57]:
    0.9736842105263158
     
  • 相关阅读:
    java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 *&* 解决方法
    一个罕见的MSSQL注入漏洞案例
    工具推荐:ATSCAN,功能强大的Perl脚本扫描器
    突破XSS字符限制执行任意JS代码
    用Nginx分流绕开Github反爬机制
    浅析XSS与XSSI异同
    IE安全系列之——RES Protocol
    跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险
    SQL注入攻击和防御
    SQL 注入,永不过时的黑客技术
  • 原文地址:https://www.cnblogs.com/Koi504330/p/11911153.html
Copyright © 2020-2023  润新知