精华内容
下载资源
问答
  • Latex 如何画决策树示意图

    千次阅读 2017-12-20 22:00:26
    以《机器学习》第85页的图为例:使用包:\usepackage{tikz}代码:\documentclass[UTF8]{ctexart} \usepackage{tikz} \usetikzlibrary{shapes.geometric, arrows} \begin{document} \thispagestyle{empty} ...

    以《机器学习》第85页的图为例:

    使用包:

    \usepackage{tikz}

    代码:

    \documentclass[UTF8]{ctexart}
    \usepackage{tikz}
    \usetikzlibrary{shapes.geometric, arrows}
    \begin{document}
    \thispagestyle{empty}
    % 定义基本形状
    \tikzstyle{results}=[ellipse ,text centered,draw=black]
    \tikzstyle{decisions} =[rectangle, rounded corners,text centered, draw = black]
    % 箭头形式
    \tikzstyle{arrow} = [-,>=stealth]
    \begin{tikzpicture}[node distance=1cm]
    %定义具体形状和相关位置
    \node[decisions](rootnode){ 纹理$=?$ };
    \node[decisions,below of=rootnode,yshift=-0.5cm,xshift=-2cm](rhopoint){密度$\leq0.381?$};
    \node[decisions,below of=rootnode,yshift=-0.5cm,xshift=0.5cm](touchpoint){触感$=?$};
    \node[results,below of=rootnode,yshift=-0.5cm,xshift=2.5cm](result1){坏瓜};
    \node[results,below of=rhopoint,yshift=-0.5cm,xshift=-1cm](result2){坏瓜};
    \node[results,below of=rhopoint,yshift=-0.5cm,xshift=0.5cm](result3){好瓜};
    \node[results,below of=rhopoint,yshift=-0.5cm,xshift=2cm](result4){坏瓜};
    \node[results,below of=rhopoint,yshift=-0.5cm,xshift=3.5cm](result5){好瓜};
    %连接形状
    \draw [arrow] (rootnode) -- node [left,font=\small] {清晰} (rhopoint);
    \draw [arrow] (rootnode) -- node [right,font=\small] {稍糊} (touchpoint);
    \draw [arrow] (rootnode) -- node [right,font=\small] {模糊} (result1);
    \draw [arrow] (rhopoint) -- node [left,font=\small] {是} (result2);
    \draw [arrow] (rhopoint) -- node [right,font=\small] {否} (result3);
    \draw [arrow] (touchpoint) -- node [left,font=\small] {硬滑} (result4);
    \draw [arrow] (touchpoint) -- node [right,font=\small] {软粘} (result5);
    \end{tikzpicture}
    \end{document}

    结果:

    这里写图片描述

    展开全文
  • 如何用Sklearn一棵决策树

    千次阅读 2019-04-26 09:57:58
    决策树在sklearn中的实现 小伙伴们大家好~o( ̄▽ ̄)ブ,首先声明一下,我的开发环境是Jupyter lab,所用的库和版本大家...Graphviz 0.8.4 (没有不出决策树哦,安装代码conda install python-graphviz) Numpy 1...

    决策树在sklearn中的实现

    小伙伴们大家好~o( ̄▽ ̄)ブ,首先声明一下,我的开发环境是Jupyter lab,所用的库和版本大家参考:

    Python 3.7.1(你的版本至少要3.4以上)

    Scikit-learn 0.20.0 (你的版本至少要0.20)

    Graphviz 0.8.4 (没有画不出决策树哦,安装代码conda install python-graphviz)

    Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1.0

    用SKlearn 建立一棵决策树

    这里采用的数据集是SKlearn中的红酒数据集。

    1 导入需要的算法库和模块

    from sklearn import tree                                 #导入tree模块
    from sklearn.datasets import load_wine                   #导入红酒数据集
    from sklearn.model_selection import train_test_split     #导入训练集和测试集切分包
    

    2 探索数据

    wine = load_wine()  
    wine.data
    wine.data.shape
    wine.target
    wine.target.shape
    

    运行的结果是这样子的:
    红酒数据集date

    data就是该数据集的特征矩阵,从运行结果可以看出,该红酒数据集一共有178条记录,13个特征。

    红酒数据集target

    特征矩阵中有178条记录,相对应的标签Y就有178个数据。

    如果wine是一张表,应该长这样:

    import pandas as pd
    pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
    

    DF_wine

    这是数据集特征列名和标签分类

    wine.feature_names
    wine.target_names
    

    wine列名和标签

    3 分训练集和测试集

    这里选取30%作为测试集。切分好之后,训练集有124条数据,测试集有54条数据。

    Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
    Xtrain.shape
    Xtest.shape
    

    wine-train-test

    4 建立模型

    clf = tree.DecisionTreeClassifier(criterion="entropy") #初始化树模型
    clf = clf.fit(Xtrain, Ytrain)                          #实例化训练集
    score = clf.score(Xtest, Ytest)                        #返回预测的准确度
    
    score
    

    wine-score

    5 画出一棵树吧

    feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
    
    import graphviz
    dot_data = tree.export_graphviz(clf
                                    ,out_file=None
                                    ,feature_names= feature_name
                                    ,class_names=["琴酒","雪莉","贝尔摩德"]
                                    ,filled=True
                                    ,rounded=True
                                   )
    graph = graphviz.Source(dot_data)
    graph
    

    决策树

    6 探索决策树

    #特征重要性
    clf.feature_importances_
    
    [*zip(feature_name,clf.feature_importances_)]
    

    探索决策树

    到现在为止,我们已经学会建立一棵完整的决策树了。有兴趣的话,动手建立一棵属于自己的决策树吧~

    展开全文
  • 如何画XGBoost里面的决策树

    万次阅读 2018-01-14 17:46:02
    在新建的Figure,Axes对象,调整Figure大小,再在其上画决策树图的方法实现调整大小 fig , ax = plt . subplots ( ) fig . set_size_inches ( 60 , 30 ) xgb . plot_tree ( xgbClf , ax = ax , fmap = 'xgb....


    update:
    xgboost的新版本(0.8)中,已无需生成fmap来获取列名。

    xgboost画图时遇到如下若干坑

    1. 图像过小,看不清内容
    2. 只显示特征编号,不显示特征名
    3. 怎么把图像保存

    1 更新-直接显示矢量图

    xgboost的新版本(0.8)对pandasDataFrame支持已经很完善了,我们可以使用xgboostsklearn 接口,直接训练DataFrame数据,同时也可以将列名直接作为特征名而无需再生成fmap文件。(也可以手动修改xgb.Booster.feature_names = ['col1','col2',])
    【注意!】因为xgboost内部会根据columns自动生成fmap,而fmap文件是以空格分隔每一项的,因此, 列名中不能出现空格!
    jupyter notebook中也可以使用xgb.to_graph方法来通过graphviz绘制后直接显示出来,该方法可显示矢量图,并可配置图字体的大小。

    这里我们使用breast_cancer数据集来测试:

    1.1 替换列名中的空格

    import xgboost as xgb
    import pandas as pd
    
    from sklearn.datasets import load_breast_cancer
    data =load_breast_cancer()
    

    查看发现列名中含有空格

    In [2]: data['feature_names'][0]
    Out[2]: 'mean radius'
    

    替换空格

    # columns name can not have blank if you want to draw tree with feature name
    data['feature_names'] = [ ''.join([character if character!=' ' else '_' for character in featureName ]) for featureName in data['feature_names']]
    
    In [4]: data['feature_names'][0]
    Out[4]: 'mean_radius'
    

    1.2 使用XGBClassifier训练并画树

    df = pd.DataFrame(data['data'],columns=data['feature_names'])
    clf = xgb.XGBClassifier()
    clf.fit(df,data['target'])
    xgb.to_graphviz(clf)
    

    在这里插入图片描述

    1.3 优化节点形状

    xgboost提供的绘图函数,节点shape为circle,画出来的图奇丑无比,我们对节点参数进行修改。
    在xgboost源代码的ploting.py文件中修改以下几行:

    # line 166
    def to_graphviz(booster, fmap='', num_trees=0, rankdir='UT',
                    yes_color='#0000FF', no_color='#FF0000',conditionNodeParams={},leafNodeParams={}, **kwargs):
     # line 215
    node = _parse_node(graph, text,conditionNodeParams=conditionNodeParams,leafNodeParams= leafNodeParams)
    # line 127
    def _parse_node(graph, text,conditionNodeParams,leafNodeParams):
    # line 132
            graph.node(node, label=match.group(2), **conditionNodeParams)
    # line 137
            graph.node(node, label=match.group(2),**leafNodeParams)
    

    修改条件节点的参数如下

    cNodeParams = {'shape':'box',
                   'style':'filled,rounded',
                   'fillcolor':'#78bceb'
                  }
    lNodeParams = {'shape':'box',
                   'style':'filled',
                   'fillcolor':'#e48038'
                  }
    graphParams = {
        'graph_attr':{}
        
    }
    x = plotting.to_graphviz(clf,conditionNodeParams=cNodeParams,leafNodeParams=lNodeParams,**{'size':str(15)})
    

    得到下面的图。
    在这里插入图片描述



    2 原方法:

    2.1 plot_tree画图

    在使用xgboost训练出模型xgbClf后:

    import xgboost as xgb
    from xgboost.sklearn import XGBClassifier
    xgbClf = XGBClassifier()
    xgbClf.fit(xTrain,yTrain)
    

    可使用xgboost自带的plot_tree函数绘制决策树

    xgb.plot_tree(xgbClf)
    

    2.2 生成fmap文件

    然而绘制出来的图形不显示特征名,只是显示特征序号

    查看原函数plot_tree(booster, fmap='', num_trees=0, rankdir='UT', ax=None, **kwargs)发现一参数fmap不知何意。
    几经尝试,最后发现kaggle大神已给出解决方案:kaggle解决方案

    def ceate_feature_map(features):
        outfile = open('xgb.fmap', 'w')
        i = 0
        for feat in features:
            outfile.write('{0}\t{1}\tq\n'.format(i, feat))
            i = i + 1
        outfile.close()
    ceate_feature_map(train_data.columns)#特征名列表
    

    该函数生成一fmap文件名为xgb.fmap,那么我们可调用该fmap文件添加特征名。

    xgb.plot_tree(xgbClf,fmap='xgb.fmap')
    

    2.3 直接对Figure对象调整大小

    plot_tree未提供修改图像大小的参数,这里直接通过在新建的Figure,Axes对象,调整Figure大小,再在其上画决策树图的方法实现调整大小

    fig,ax = plt.subplots()
    fig.set_size_inches(60,30)
    xgb.plot_tree(xgbClf,ax = ax,fmap='xgb.fmap')
    

    后续若想再次显示图像,直接在jupyter notebook的新建cell里输入:

    fig
    

    2.4 保存图像文件

    通过fig的savefig方法来保存图像

    fig.savefig('xgb_tree.jpg')
    

    The End

    展开全文
  • 如何用tableau桑基图(决策树

    万次阅读 2018-03-04 16:46:02
    1.效果图   2.数据准备 2.1 基础数据表 文件1:包含数据层级关系 level level1 level2 level3 2 1 1   3 1 2 a 2 1 2   3 1 3 ... ...

    1.效果图

     

    2.数据准备

    2.1 基础数据表

    文件1:包含数据层级关系

    level level1 level2 level3
    2 1 1  
    3 1 2 a
    2 1 2  
    3 1 3 a
    3 1 3 b
    3 1 3 c
    2 1 3  
    2 1 4  
    1 1    
    3 2 1 a
    3 2 1 b
    2 2 1  
    3 2 2 a
    3 2 2 c
    2 2 2  
    3 2 3 b
    3 2 3 c
    2 2 3  
    1 2    
    3 3 1 a
    3 3 1 b
    3 3 1 c
    2 3 1  
    3 3 2 a
    3 3 2 b
    3 3 2 c
    3 3 2 d
    3 3 2 e
    2 3 2  
    1 3

    文件2:包含等级,T1,T2其中T1为-6到6之间,以0.25为间隔的等差数列,level=1时T2=T1,level=2时T2=T1+12,level=3时T2=T1+24等,依次类推。以下为表样及部分案例,需要补齐

    level t1 t2
    1 -6 -6
    1 -5.75 -5.75
    1 5.75 5.75
    1 6 6
    2 -6 6
    2 -5.75 6.25
    2 5.75 17.75
    2 6 18
    3 -6 18
    3 -5.75 12.25
    3 5.75 29.75
    3 6 30

    2.2.数据处理

    字段名 取值逻辑
    position1_label case level when 3 then level2 when 2 then level1 when 1 then ‘start’ end
    position2_label case level when 3 then level3 when 2 then level2 when 1 then level1 end
    category position1_label-position2_label

    分阶段计算出level3的position2,position1,以及level2的position1

    -- step1:计算level3的position2,作为表step1
    select 
        level,
        level1,
        level2,
        level3,
        row_number() over(order by concat(level1,coalesce(level2,level1),coalesce(level3,level2,level1))) as position2
    from t1
    
    -- step2:计算level3的position1,作为表step2
    select
        level1,
        level2,
        floor(avg(position2)) as position1
    from step1
    where level = 3
    group by 
        level1,
        level2
    
    
    -- step3:计算level2的position1,作为表step3
    select
        level1,
        floor(avg(position1)) as position1
    from step3
    group by 
        level1

    2.3.计算出各节点的position1,position2

    select 
        t1.level,
        t1.level1,
        t1.level2,
        t1.level3,
        t2.position1,
        t1.position2,
        t1.level2 as position1_label,
        t1.level3 as position2_label
    from step1 t1 
    left join step2 t2 
    on 
        t1.level1 = t2.level1 
        and t1.level2 = t2.level2
    where t1.level=3
    
    union all
    
    select 
        2 as level,
        t1.level1,
        t1.level2,
        '' level3,
        t2.position1 as position1,
        t1.position1 as position2,
        t1.level1 as position1_label,
        t1.level2 as position2_label
    from step2 t1 
    left join step3 t2 
    on 
        t1.level1 = t2.level1
    
    union all 
    
    select
        1 as level,
        t1.level1,
        '' as level2,
        '' as level3,
        t2.position1,
        t1.position1 as position2,
        'start' as position1_label,
        t1.level1 as position2_label
    from step3 t1 
    left join 
    (select
        floor(avg(position1)) as position1
    from step3) t2 
    on 
        1=1

       

    3.数据预览

    数据结果为level1的position2 = level2对应的position1,level2的position2为level3对应的position1。数据预览如下:

     

    4.tableaau中操作

    4.1.添加字段

    字段名 计算公式
    sigmoid 1/(1+EXP(1)^-[t])
    curve [position1] + (([position2]-[position1])*[sigmoid])
    points if  last()=0 then sum([t1]) end
    color

    if sum([t1])= -6 then 'gray'

    elseif sum([t1])= 6 then 'orange'

    elseif sum([t1])= 18 then 'blue'

    elseif sum([t1])= 30 then 'green'

    elseif sum([t1])= 42 then 'pink'

    end

    4.2 看板操作

    step1:t1、points作为列,curve作为行
    step2:将t、points、level、level1、level2、level3、position1_label、position2_label放到详细信息中
    step3:将详细信息中的t调整为维度(step3图示
    step4:points编辑表计算,计算依据为特定维度-t(编辑表计算 -> 调整计算依据
    step5:合并轴->同步轴,并将color拖到points的颜色中(最终结果如图

    最后调整看板格式就好啦~

     

    5.纵向排列

    step1:切换行列
    step2:编辑轴:curve-倒序,t1倒序
    step3:修改颜色调调格式就好啦~

     

    PS:如果需要链接,在文件1中加上对于的url,然后添加操作-url-链接列引用url字段就好

     

     

     

     

    展开全文
  • 决策树

    2021-01-29 15:48:07
    这就是决策树的过程,现在我们在有几个特征与结果的数据情况下,如何去决定特征的重要性与如何使用决策树去判断结果这就是我们的目的。 二.信息熵 我们首先需要知道熵的概念,熵在化学中表示混乱度,在信息论中..
  • 小伙伴们大家好~o( ̄▽ ̄)ブ,之前我已经写过一篇在Sklearn中如何画一颗决策树的文章,那么今天来学习一下决策树的工作原理,以及决策树在SKlearn中是如何实现的。照常的声明一下,我的开发环境是Jupyter lab,所用...
  • 决策树(理论部分)

    2020-02-06 17:46:27
    决策树的理论部分什么是决策树决策树的工作原理如何建立决策树Hunt算法选择最佳划分的度量 什么是决策树 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

如何画决策树